章節 ▾ 第二版

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

這將用 corrected-branch-name 替換你的 bad-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