章節 ▾ 第二版

3.3 Git 分支 - 分支管理

分支管理

既然你已經建立、合併和刪除了若干分支,那麼接下來讓我們看看一些分支管理工具,它們在你今後頻繁使用分支時會非常方便。

git branch 命令不僅僅能建立和刪除分支。如果你不帶任何引數執行它,會得到一份當前分支的簡單列表:

$ git branch
  iss53
* master
  testing

注意 * 字元字首在 master 分支前:它表示你當前檢出的分支(即 HEAD 指向的分支)。這意味著如果你此時提交,master 分支會隨著你的新工作向前移動。要檢視每個分支的最後一次提交,可以執行 git branch -v

$ git branch -v
  iss53   93b412c Fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 Add scott to the author list in the readme

有用的 --merged--no-merged 選項可以將此列表過濾到你已合併或尚未合併到當前所在分支的那些分支。要檢視哪些分支已合併到你所在的分支,可以執行 git branch --merged

$ git branch --merged
  iss53
* master

因為你之前已經合併了 iss53,所以你在列表中會看到它。列表中沒有 * 字首的分支通常可以使用 git branch -d 安全刪除;你已經將其工作併入另一個分支,所以不會丟失任何東西。

要檢視所有包含你尚未合併工作的分支,可以執行 git branch --no-merged

$ git branch --no-merged
  testing

這會顯示你的另一個分支。因為它包含尚未合併的工作,所以嘗試使用 git branch -d 刪除它會失敗:

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

如果你真的想刪除該分支並丟失那部分工作,你可以使用 -D 強制執行,正如提示資訊所指出的。

提示

上面描述的選項 --merged--no-merged,如果在不提供提交或分支名作為引數的情況下使用,將分別顯示已合併或未合併到你當前分支的內容。

你總是可以提供一個額外的引數來查詢相對於其他分支的合併狀態,而無需先檢出那個其他分支,例如,什麼尚未合併到 master 分支?

$ git checkout testing
$ git branch --no-merged master
  topicA
  featureB

更改分支名稱

注意

不要重新命名仍在被其他協作者使用的分支。在沒有閱讀 更改 master 分支名稱 一節之前,不要重新命名像 master/main/mainline 這樣的分支。

假設你有一個名為 bad-branch-name 的分支,並且你想將其更改為 corrected-branch-name,同時保留所有歷史記錄。你還想更改遠端(GitHub、GitLab、其他伺服器)上的分支名稱。你如何做到這一點?

使用 git branch --move 命令在本地重新命名分支

$ git branch --move bad-branch-name corrected-branch-name

這會將你的 bad-branch-name 替換為 corrected-branch-name,但目前此更改僅是本地的。要讓其他人看到遠端倉庫上已更正的分支,請推送它:

$ git push --set-upstream origin corrected-branch-name

現在我們簡要看看我們目前的狀況:

$ git branch --all
* corrected-branch-name
  main
  remotes/origin/bad-branch-name
  remotes/origin/corrected-branch-name
  remotes/origin/main

請注意,你當前位於 corrected-branch-name 分支上,並且它在遠端倉庫中可用。但是,帶有舊名稱的分支也仍然存在於遠端倉庫中,你可以透過執行以下命令將其刪除:

$ git push origin --delete bad-branch-name

現在,舊的分支名稱已被完全替換為已更正的分支名稱。

更改 master 分支名稱

警告

更改諸如 master/main/mainline/default 之類分支的名稱會破壞你的倉庫所使用的整合、服務、輔助工具和構建/釋出指令碼。在你執行此操作之前,請務必與你的協作者協商。此外,請務必徹底搜尋你的倉庫,並更新程式碼和指令碼中對舊分支名稱的任何引用。

使用以下命令將你的本地 master 分支重新命名為 main

$ git branch --move master main

不再有本地的 master 分支,因為它已重新命名為 main 分支。

要讓其他人看到新的 main 分支,你需要將其推送到遠端倉庫。這使得重新命名的分支在遠端倉庫中可用。

$ git push --set-upstream origin main

現在我們最終得到以下狀態:

$ git branch --all
* main
  remotes/origin/HEAD -> origin/master
  remotes/origin/main
  remotes/origin/master

你的本地 master 分支已消失,因為它已被 main 分支替換。main 分支存在於遠端倉庫中。然而,舊的 master 分支仍然存在於遠端倉庫中。其他協作者將繼續使用 master 分支作為他們工作的基礎,直到你進行進一步的更改。

現在你還有一些任務需要完成才能徹底轉換:

  • 任何依賴於此專案的專案都需要更新其程式碼和/或配置。

  • 更新任何測試執行器配置檔案。

  • 調整構建和釋出指令碼。

  • 重定向你的倉庫主機上的設定,例如倉庫的預設分支、合併規則以及其他匹配分支名稱的設定。

  • 更新文件中對舊分支的引用。

  • 關閉或合併任何針對舊分支的拉取請求。

完成所有這些任務,並確定 main 分支的效能與 master 分支完全相同之後,你可以刪除 master 分支:

$ git push origin --delete master
scroll-to-top