先想想一個情況,現在我們有一個功能急需要發布到線上,但是這個功能相關的代碼所在的測試分(test)支有很多不應該發布的代碼,那么這個時候我們就需要將與這個代碼相關的提交選擇性的合並到master上並發布。如果你還不知道git cherry-pick命令的話,很有可能你會從master分支上檢出一個新分支,然后在把相關的代碼copy到新分支上然后再合並回master。當然這么做確實可以達到最終的目的,但是手動copy很容易遺漏某些東西,那么我們這篇文章就來講解一下git cherry-pick命令。
准備
1.准備一個空的git倉庫,並創建一個readme文件然后提交。
mkdir git-test
cd git-test
git init
touch README.md
git add README.md
git commit -m "第一次提交"
2.基於master創建一個新的分支dev
git checkout -b dev
3.修改兩次README.md文件,並commit兩次。執行git log后我們會看到如下內容:
$ git log
commit cc04beabf0678f54bf64635bd56160c78b0aa1e6 (HEAD -> dev)
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:35:44 2019 +0800
第三次提交
commit 32259aa35d0702d2d05c648938798f9a5bd4b9e7
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:35:23 2019 +0800
第二次提交
commit e7f478807d478a0c3e0af8659e0733a9d5b32c8b (master)
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:34:09 2019 +0800
第一次提交
git cherry-pick
經過上面的步驟一個git cherry-pick的使用場景就已經被我們模擬出來了。假如說我們現在dev上的第二次提交就是我們現在急需要發布的功能,那么我們就需要使用git cherry-pick命令將這次提交合並到master分支上。
1.在dev分支上執行git log命令,找到目標commit的commitid.
2.切換到master分支
git checkout master
3.執行git cherry-pick命令
git cherry-pick 32259aa35d0702d2d05c648938798f9a5bd4b9e7
4.再次執行git log命令就可以看到目標提交已經被合並到master上了
$ git log
commit 845d18e1193e4ad4361c8065173ed9b96fcc5227 (HEAD -> master)
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:35:23 2019 +0800
第二次提交
commit e7f478807d478a0c3e0af8659e0733a9d5b32c8b
Author: 代碼無止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:34:09 2019 +0800
第一次提交
git cherry-pick 相關參數
上面只是git cherry-pick命令的簡單用法,其實這個命令還提供了不少的參數。
git cherry-pick [<options>] <commit-ish>...
常用options:
--quit 退出當前的chery-pick序列
--continue 繼續當前的chery-pick序列
--abort 取消當前的chery-pick序列,恢復當前分支
-n, --no-commit 不自動提交
-e, --edit 編輯提交信息
如果我們執行git cherry-pick合並之后發生了沖突,這個時候Git會自動幫我們新建一個分支,如下所示:
MINGW64 ~/Desktop/p/write/筆記/git-test (master|CHERRY-PICKING)
如果我們想取消這次合並可以執行git cherry-pick --quit或者git cherry-pick --abort命令取消這次挑揀。
二者不同的地方在於前者會將當前分支中未沖突的內容狀態變為modified,
而后者則會直接將當前分支的內容回退到挑揀之前的狀態。當然如果我們也可以解決沖突之后執行如下命令繼續合並:
git add *
git cherry-pick --continue
后面的-n和-e,就比較容易理解了,-n就是挑揀后不會自動提交,需要我們執行git commit命令進行提交,而-e則是可以改變挑揀的message信息。