Git 倉庫大掃除

本文轉載自個人博客git


Git 能夠說是目前最受歡迎的版本管理工具了,不少團隊也都在用它來管理本身的項目代碼。在一個多人協做的項目中,每每採用的是一個分支一個特性進行開發,隨着天天的代碼提交、合併,倉庫中會有愈來愈多的冗餘分支。這麼多死分支不只會掩蓋真正在使用的分支,並且也爲管理帶來不便。若是你像我同樣,也常常被淹沒在 git branchgit branch -r 返回的分支大海中,那麼,就是時候考慮給你的 git 倉庫作一次大掃除了!github

本地分支與遠程分支

大掃除以前,首先給本身作個深呼吸,回憶一下遠程倉庫和遠程分支的概念。安全

咱們本地的倉庫既保留有本地的分支,也保留有跟蹤遠程倉庫的 remote 分支(相似 remotes/origin/** 這種的)。後者至關因而遠程倉庫分支在本地倉庫的代理,每次 git fetchgit pull 時,都會將遠程倉庫的分支同步到本地對應的 remote 分支上。工具

好比遠程倉庫新增了一個 feature/add_a 分支,那麼咱們在本地 git fetch 後,會獲得一個 remotes/origin/feature/add_a 分支,這個名字表示 origin 這個遠程倉庫下的 feature/add_aorigin 是本地給遠程倉庫默認起的名字,你固然也能夠改爲別的名字。fetch

理清楚了本地分支和遠程分支,本地倉庫和遠程倉庫,接下來咱們就動起手來作清理吧!命令行

本地分支清理

查看咱們本地的分支只須要執行一下代理

git branch

咱們還能夠找出全部已經合入到 master 的本地分支code

git checkout master
git branch --merged

針對這些已經合入的分支,若是肯定已經不會使用的話,就能夠將其刪除了orm

git branch -d feature/XXX

若是十分肯定全部合入的分支都再也不須要了,那麼能夠考慮一次性解決((^\*) 是匹配當前分支,其他 (master|dev) 部分能夠根據本身項目的實際狀況進行修改)ci

git branch --merged | grep -v "(^\*|master|dev)" | xargs git branch -d

這麼一來,就能夠安全地刪除全部已經再也不須要的分支了。除此以外,也能夠瀏覽一下沒有合入 master 的本地分支,檢查看看哪些分支已經廢棄,不須要繼續開發了

git branch --no-merged

針對這些分支,只用 git branch -d 命令會收到系統的善意提醒。若是十分肯定能夠刪除,那麼可使用強制刪除命令(必定要確認好啊)

git branch -D feature/XXX

通過這麼一番清理,相信你的本地分支如今已經十分輕佻了,git branch 返回的結果看起來也十分清爽。接下來就來清理一下本地的遠程分支。

遠程分支清理

遠程分支的查看只須要在 git branch 命令加一個 -r(--remotes) 參數便可

git branch -r

遠程分支的清理,一方面是清理遠程分支中,已經合入 master 的分支,另外一方面是清理遠程倉庫已經刪除了的分支,而本地還在跟蹤的。

第二種狀況的清理很是簡單,只須要執行

git remote prune origin

事實上,咱們能夠在每次 git fetch 時,添加一個參數 -p (--prune),這樣每次 fetch 遠程倉庫時均可以順手刪掉本地多餘的分支(建議將 git fetch -p 直接 alias 到 git fetch 命令~)。

再來看第一種狀況,雖然一樣能夠經過 git branch -r --merged 來查看已經合入 master 的分支,但因爲遠程分支不僅是本身開發的,因此還須要別人的確認才能進行刪除。
好在咱們能夠在命令行的幫助下快速篩選出每一個人的分支,而後就能夠把這份統計摘要發給 TA 來確認。

for branch in `git branch -r --merged | grep -v HEAD`; do echo -e `git show --format="%ci %cr %an" $branch | head -n 1`; done | sort -r | grep AUTHOR_NAME

這行命令首先是過濾出全部已合入 master 的遠程分支(git branch -r --merged | grep -v HEAD),而後遍歷每一個分支,展現(git show)其最後一次提交的絕對時間(%ci)、相對時間(%cr)和做者(%an)信息,按時間倒序排列(sort -r),最後過濾出做者是 AUTHOR_NAME 的分支。

若是想查看更多的信息,能夠在 git showformat 加上 %s(提交信息)和 %h(commit SHA1 前綴)

這樣一份報告,給到相關開發同窗,確認以後,就能夠執行批量清理了。注意,遠程分支的刪除應該到遠程倉庫去刪除(不然下次 fetch 還會再拉下來),所以須要咱們把這個刪除動做 push 到遠程倉庫。

最後,若是你 push 了刪除動做到遠程倉庫,不要忘了提醒下其餘同窗 git fetch -p 來同步刪除本身本地的遠程分支哈!

git push origin --delete feature/YYY

找找我是誰

若是本身常常換機器開發、push 代碼,並且不一樣機器的 git config 不徹底同樣的話(好比我不一樣機器上 user.name 有的是英文名有的是中文名),提交的做者簽名也不同,這時還須要根據不一樣的 user.name 進行查找……

不過好在咱們有命令行,用如下命令就能獲得倉庫裏全部提交過的做者了~

git shortlog -s
相關文章
相關標籤/搜索