← 上一章:【狀況題】不小心把帳號密碼放在 Git 裡了,想把它刪掉… 下一章:【冷知識】怎麼樣把檔案真正的從 Git 裡移掉? →


【狀況題】如果你只想要某個分支的某幾個 Commit?

先來看看目前的狀況:

current

說明:

  1. 目前加上 master 共有四個分支。
  2. 目前正在 cat 分支上。

然後我發現 fish 分支做得不錯,但裡面不是所有的 Commit 想要,例如我只想要 add dolphinadd whale 這兩個 Commit,其它的不是很有興趣…

撿別的分支的 Commit 過來合併

Git 裡有個 cherry-pick 指令,可以只撿某些 Commit 來用,例如只想撿 add dolphin 這個 Commit(6a498ec):

$ git cherry-pick 6a498ec
[cat 8562ee3] add dolphin
 Date: Tue Aug 22 09:42:16 2017 +0800
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dolphin.html

檢視一下紀錄:

$ git log --oneline
8562ee3 (HEAD -> cat) add dolphin
b174a5a add cat 2
c68537b add cat 1
e12d8ef (master) add database.yml in config folder
85e7e30 add hello
657fce7 add container
abb4f43 update index page
cef6e40 create index page
cc797cd init commit

那個 add dolphin 就被撿進來了。當然,它並不是把原來的 Commit 剪過來這邊貼上,而是比較像是複製 Commit 的內容過來,因為要接到現有的分支上所以需要重新計算,產生一個新的 Commit。當然,原本在 fish 的那個 add dolphin 的 Commit 還是在原來的地方。

一次撿好幾個…

$ git cherry-pick fd23e1c 6a498ec f4f4442
[cat 5b76277] add whale
 Date: Tue Aug 22 09:44:50 2017 +0800
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 whale.html
[cat de503b3] add dolphin
 Date: Tue Aug 22 09:42:16 2017 +0800
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 dolphin.html
[cat 6bf4b32] add gold fish
 Date: Tue Aug 22 09:41:51 2017 +0800
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 gold-fish.html

這樣就可以一口氣撿三個 Commit 過來合併。

使用 SourceTree 做這件事也是很容易,只要先選好幾個想要撿過來的,在上面按滑鼠右鍵,選擇「Cherry Pick」功能:

current

按下確認鍵就完成了。

撿過來但先不合併

在使用 cherry-pick 指令的時候,如果加上 --no-commit 參數,撿過來的 Commit 不會直接合併,而是會先放在暫存區:

$ git cherry-pick 6a498ec --no-commit

$ git status
On branch cat
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   dolphin.html

← 上一章:【狀況題】不小心把帳號密碼放在 Git 裡了,想把它刪掉… 下一章:【冷知識】怎麼樣把檔案真正的從 Git 裡移掉? →

Comments