Git
章節 ▾ 第二版

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

由於它已重新命名為 main 分支,因此現在沒有本地 master 分支了。

要讓其他人看到新的 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