Git: 如何從特定 commit 切新的分支?
03 Dec 2019本文說明如何從特定 commit 切新的分支、為新分支命名、將新分支合併回主線、退回尚未合併分支的狀態與刪除用不到的分支。
初始狀態
下圖是初始狀態,此時位於分支 master,HEAD 指向目前所在分支,見紅框。
Step 1:切換到特定的 commit
切換到要開分支的 commit「1b3941132」。
git checkout 1b3941132
此時 HEAD 指向「1b3941132」,見紅框,是為 detached HEAD。HEAD 是一個「指向目前所在分支」的指標,若 HEAD 不指向任何分支,即是 detached HEAD。
做一些修改後再次 commit,會看到由 commit「1b3941132」長大到 commit「3c85a77d1」,見藍線部份。
Step 2:為此新分支命名
利用以下方式為此新分支命名。
git checkout -b <branch_name>
例如,將新分支命名為「feature」。
git checkout -b feature
在 Source Tree 底下就可以看到已開好新的分支「feature」。
後續還有新增一些修改,於是來到 commit「4b86a7932」,見藍線部份。
Step 3:利用 merge 合併這個新分支到 master
首先先切回分支 master。
git checkout master
然後,將 feature 上的 commit 合併到 master,可用以下任一方法
git merge <branch_name>
或git merge <sha-1>
在這裡選用分支名稱來合併。
git merge feature
這裡會產生一個合併的 commit「Merge branch ‘feature’」,如下圖,藍線表示 master,紅線表示分支 feature,從 commit「1b3941132」切出去,再由 commit「ce339a5a5」合併回到 master。
Step 4:退回尚未合併分支的狀態
ORIG_HEAD 會記錄最近一次「危險操作」之前 HEAD 的位置,因此以下指令可退回危險操作前的位置,也就是退回尚未合併分支的狀態。
git reset ORIG_HEAD --hard
由於前一步是在分支 master,所以退一步後,依舊在分支 master,並且回到尚未合併的狀態,即是 commit「0663953c1」。
Step 5:刪除用不到的分支
合併完後,刪除用不到的分支。
刪除本機分支,可用
git branch -d <branch_name>
:刪除分支,若分支尚未合併到 master,則會出現提示訊息。git branch -D <branch_name>
:強制刪除尚未合併的分支。
如下,刪除分支 feature。
git branch -d feature
顯示成功刪除分支 feature 的訊息。
Deleted branch feature (was 4b86a7932).
刪除遠端分支,可用 git push origin <空白>:<branch_name>
。如下,刪除遠端分支 feature。
git push origin :feature