想要獲取更多文章能夠訪問個人博客 - 代碼無止境。git
先想一想一個狀況,如今咱們有一個功能急須要發佈到線上,可是這個功能相關的代碼所在的測試分(test)支有不少不該該發佈的代碼,那麼這個時候咱們就須要將與這個代碼相關的提交選擇性的合併到master上併發布。若是你還不知道git cherry-pick
命令的話,頗有可能你會從master分支上檢出一個新分支,而後在把相關的代碼copy到新分支上而後再合併回master。固然這麼作確實能夠達到最終的目的,可是手動copy很容易遺漏某些東西,那麼咱們這篇文章就來說解一下git cherry-pick
命令。bash
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
後咱們會看到以下內容:ui
$ 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
的使用場景就已經被咱們模擬出來了。假如說咱們如今dev上的第二次提交
就是咱們如今急須要發佈的功能,那麼咱們就須要使用git cherry-pick
命令將此次提交合併到master分支上。 1.在dev分支上執行git log
命令,找到目標commit的commitid. 2.切換到master分支spa
git checkout master
複製代碼
3.執行git cherry-pick命令code
git cherry-pick 32259aa35d0702d2d05c648938798f9a5bd4b9e7
複製代碼
4.再次執行git log命令就能夠看到目標提交已經被合併到master上了get
$ 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 [<options>] <commit-ish>...
經常使用options:
--quit 退出當前的chery-pick序列
--continue 繼續當前的chery-pick序列
--abort 取消當前的chery-pick序列,恢復當前分支
-n, --no-commit 不自動提交
-e, --edit 編輯提交信息
複製代碼
若是咱們執行git cherry-pick合併以後發生了衝突,這個時候Git會自動幫咱們新建一個分支,以下所示:string
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信息。