Git 分支管理:快速整理不存在於遠端的本地分支

Git 分支管理小技巧

Jüniuz !
8 min readJul 2, 2023

身為一名具備切版技能的網頁設計師,在與前端團隊共同開發專案時,保持乾淨整潔的 Git 分支結構不僅有助於團隊協作,還能提高專案的維護性和可追溯性。然而,在開發過程中,常常會遇到遠端分支已經合併且刪除該分支了,但本地分支還存在的情況。這些遺留在本地的分支可能會導致開發上混淆和困擾,甚至增加開發者的負擔並降低工作效率。

我將在文章中和大家分享如何解決遠端分支和本地分支不同步的問題,透過一些實用的指令和步驟,幫助我們一起都能夠有效地清理與移除本地分支並整理 Git 倉庫

這樣不僅可以保持分支結構的整潔;同時也讓整個團隊的 Git 存儲庫更加乾淨和易於管理,並提升團隊間的協作效率。

Step 1. 檢查本地分支

如何知道有多少不存在於遠端的本地分支呢?

針對要進行 Git 本地分支管理的專案,我們可以執行以下指令,來確認有哪些是已經不存在於遠端的本地分支,並將它們一次“全部列出來”:

git branch -vv | grep ': gone]' | awk '{print $1}'

指令說明:

  1. git branch -vv 顯示本地分支的詳細信息,包括與遠端分支有關聯的。
  2. grep ': gone]' 過濾出標記為 ‘: gone]’ 的那些已被刪除的遠端分支。
  3. awk '{print $1}' 提取出符合條件的分支名稱。
    這樣,你就可以得到一個列表,其中包含已被刪除的遠端分支的本地分支名稱

這個指令會列出本地分支的詳細資訊,並使用 grep 過濾出包含 : gone] 的分支項目,然後使用 awk 提取分支名稱,實際操作的示範結果如<圖1>。

執行 git branch -vv | grep ‘: gone]’ | awk ‘{print $1}’ 指令,來確認有哪些本地分支是已經不存在於遠端的,並將它們一次”全部列出來
<圖1> 列出所有遠端已不存在的本地分支

執行這個指令後,你將看到只顯示本地分支名稱的列表<圖1>,而這些分支在遠端是已經不存在的。

請注意,這個方法僅適用於已經與遠端連接的本地儲存庫。如果你還沒有與遠端儲存庫建立連接,或者需要更新本地分支與遠端同步,請使用 git fetch 命令來更新遠端分支狀態。

透過 Git Graph 快速確認分支可能的狀態

若您是屬於擅長透過圖像或圖表來理解情況的網頁設計師們,可以善用 VS Code 裡提供的 Git Graph ,透過下方<圖2>裡說明的方式,來釐清目前各分支的狀態,也許會對您在開發時相對友善很多。

說明如何透過 Git Graph 快速確認分支可能的狀態
<圖2> 透過 VS Code 裡的 Git Graph 檢視分支是否存在於本地或遠端的狀態

當出現只顯示分支名稱的情況(如<圖2>中,被紅色框起來的項目),你可以透過下列可能的方式,來確認自己該分支的狀態:

  • 尚未提交到(push)遠端,且正在進行的新本地分支
  • 曾編輯過、查看過的分支已經被合併,並且遠端也不存在了

以<圖2>的範例中,你會發現兩個紅色框起來的分支,是屬於已經被合併至主要分支(master)且遠端不存在的本地分支。

Step 2. 刪除不存在於遠端的本地分支

在這個步驟中,將分享三個常用的的指令,來刪除不存在於遠端的本地分支。指令分別的有:

1. 刪除特定分支

如果你只想刪除特定且遠端已不存在的本地分支,下列指令以分支名稱列表 branch1branch2branch3 為例:

git branch -vv | grep ': gone]' | awk '{print $1}' | grep -E 'branch1|branch2|branch3' | xargs git branch -D

並附上過程<圖3>,且替換指令中的branch1BW-1141分支名稱作示範。

已 BW-1141 作為刪除特定分支的示範圖
<圖3> 已 BW-1141 作為刪除特定分支的示範

在終端機輸入“刪除特定分支”的指令,再來當出現“Deleted bracnch..”等文字時,表示已完成移除了該分支。

於終端機輸了指令,刪除 BW-1141 的特定分支
<圖3–1> 已 BW-1141 作為刪除特定分支的示範

完成指令後,便可以返回 Git Graph 查看結果。

完成刪除特定分支指令後的結果
<圖3–2> 完成刪除特定分支的結果

2. 刪除列表前 N 個或後 N 個分支

如果你想根據“檢查本地分支”指令後的列表結果,刪除列表的前 n 個或後 n 個位置來刪除遠端已不存在的本地分支時,可以使用以下指令:

  • 刪除前 N 個分支:
git branch -vv | grep ': gone]' | awk '{print $1}' | head -n N | xargs git branch -D

N 替換為你想要刪除的分支數量。下列<圖4>已“刪除前 3 個”數量的分支作為示範。

<圖4> 刪除列表的前三個分支的示範結果
  • 刪除後 N個分支:
git branch -vv | grep ': gone]' | awk '{print $1}' | tail -n N | xargs git branch -D

下列則示範“刪除後 3 個”和“刪除後 5 個”數量的分支過程<圖5>。

<圖5> 刪除列表的後面三個或後面五個分支的示範結果

3. 刪除全部分支

如果想直接在本地端一次刪除多個被列為遠端不存在的本地分支,那麼可以使用以下指令:

git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D

這個指令使用了 xargs 命令,將前一個指令的輸出作為參數傳遞給 git branch -D 指令,以完成一次刪除多個本地分支的行為。

<圖6> 一次性刪除列表所有遠端不存在的本地分支的示範結果

透過以上方式整理本地分支,除了能保持 Git 分支結構乾淨整潔,且提高開發效率外,更利於團隊間的協作與各專案維護的品質。

!! 例外狀況

當執行git branch -vv | grep ': gone]' | awk '{print $1}'指令時,未列出結果,但在VS Code 的 git graph 上或是執行git branch -vv時,還是看的到已不存在遠端倉庫的遠端分支出現在本地端呢?

這種情況通常發生在?:

  1. 本地分支仍存在,但遠端分支已被他人或使用其他方式刪除。
    在這種情況下,遠端分支已經被刪除,但你的本地分支仍然存在,並且可能在Git圖形歷史中顯示,因此git branch -vv不會將其標記為: gone],所以該指令中的過濾條件也就無法捕捉到相對的命令結果。
  2. 遠端分支已被刪除,但本地分支仍與之關聯。
    當你運行git branch -vv時,可能會看到本地分支與遠端分支的關聯,即使遠端分支已被刪除。在這種情況下,git branch -vv不會標記這些分支為: gone],因為它們在本地仍然有與遠端分支的關聯。

總之,在確認本地分支是否與遠端分支同步時,建議可以先執行git fetch的指令來更新本地庫的遠端引用。這樣便可以將本地庫與遠端庫進行同步,並確保你能夠準確地查看已被刪除的遠端分支有哪些。

另外,即使在使用git branch -vv | grep ': gone]' | awk '{print $1}'指令之後沒有輸出結果,我們仍然需要謹慎處理並通過其他方式確認本地分支和遠端庫的狀態。

最後

培養定期整理本地分支的好習慣,以及謹慎執行每一次分支的刪除操作是相對重要的。特別是當我們在與團隊合作開發專案時,建議可以多與團隊成員進行多次的溝通與自我檢查,來避免不必要的分支刪除而造成對工作的影響,並確保團隊間都能順暢的協作。

透過分享這篇文章,除了將個人經驗筆記電子化,方便未來查看之外,也希望遇到同樣情況或困擾的朋友們,能夠在這篇 Git 分支管理的內容中得到幫助,並一同快速整理自己的 Git 倉庫,甚至理解在與團隊共同開發專案時,維護專案和管理分支之間的挑戰和重要性。

--

--

Jüniuz !
Jüniuz !

Written by Jüniuz !

fully focused on something to unlocking your inner Jüniuz(genius). Web / Graphic Design.

No responses yet