← 上一章:【冷知識】Git 怎麼知道現在是在哪一個分支? 下一章:【狀況題】修改歷史訊息 →


【狀況題】我可以從過去的某個 Commit 再長一個新的分支出來嗎?

我想大家一定都有過「如果我在年輕的時候做了另一個選擇,現在一定會不一樣!」的想法。人生,很多事情不能重來,但我們可以用 Git 來補足這個缺憾(咦?)。

回到過去,重新開始

假設我們現在的歷史紀錄是這樣的:

branch

我想要從 add container 那個 Commit (657fce7)再做出新的分支,首先,你得先回到那個 Commit 的狀態,這時候使用的 git checkout 指令:

$ git checkout 657fce7
Note: checking out '657fce7'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 657fce7... add container

這段訊息跟你說,你正處於「detached HEAD」的狀態(請參閱「【冷知識】斷頭(detached HEAD)是怎麼一回事?」章節說明)。你可以從現在這個 Commit 開新的分支出去,讓我們直接使用 Checkout 指令的 -b 參數直接建立分支並自動切換過去:

$ git checkout -b bird
Switched to a new branch 'bird'

這樣就開好一個 bird 分支了。現在的狀況變成這樣:

branch

咦?不是開分支了?怎麼沒有「樹枝」的樣子?別忘了,分支只是一個像貼紙之類的東西,詳情請參閱「對分支的誤解」章節。

開好分支,你就可以從這個分支開始再繼續 Commit 了。

一行搞定

如果不想先飛過去再開分支,也是可以直接一行搞定:

$ git branch bird 657fce7

意思就是「請幫我用在 657fce7 這個 Commit 上開一個叫做 bird 的分支」,其實更應該說「請幫我在 657fce7 這個 Commit 上幫我貼上一張 bird 的分支貼紙」。同時,使用 Checkout 指令配合 -b 參數也可以有開分支的效果,而且還會直接切換過去:

$ git checkout -b bird 657fce7
Switched to a new branch 'bird'

使用 SourceTree

使用 SourceTree 在指定的地方開分支滿方便的,只要在想開分支的 Commit 上按滑鼠右鍵,選擇「Branch…」功能:

branch

填寫好新的分支的名字:

branch

按下右下角的「Create Branch」按鈕即可完成。


← 上一章:【冷知識】Git 怎麼知道現在是在哪一個分支? 下一章:【狀況題】修改歷史訊息 →

Comments