git cherry-pick能夠選擇某一個分支中的一個或幾個commit(s)來進行操做。例如,假設咱們有個穩定版本的分支,叫v2.0,另外還有個開發版本的分支v3.0,咱們不能直接把兩個分支合併,這樣會致使穩定版本混亂,可是又想增長v3.0中的某個功能到v2.0中,這裏就可使用cherry-pick了。就是對已經存在的commit 進行 再次提交;git
1, 先經過git log 獲取想要合併的commit_id,記錄下來vim
commit df8960346dc803a5c1485551c5d109fd7dda6ae6 Author: efg Date: Mon Apr 23 18:48:31 2018 +0800 測評 commit a6a31d169d8b39b4cc3bd1da6fa3184fdb19321c Author: xwz Date: Mon Apr 23 18:37:34 2018 +0800 空tag 重提交 commit 3a683f2787f011506ee11ce5cfe342f67f337054 Merge: 29cac5d 937d68b Author: abc Date: Mon Apr 23 18:06:41 2018 +0800 Merge branch 'master' into vanke-fixbug-20180423-1 commit 29cac5d01424816fa5b4a61a5c1941d9d94ea970 Author: xyz Date: Mon Apr 23 14:03:21 2018 +0800 二維碼姓名不一致
2, 切換主分支;bash
3, 使用git cherry-pick命令將想要合併的分支合併到主分支;app
git cherry-pick <commit_id>
A. 若是順利,就會正常提交。結果:指針
Finished one cherry-pick.
# On branch old_cc
# Your branch is ahead of 'origin/old_cc' by 3 commits.
B. 若是在cherry-pick的過程當中出現了衝突code
Automatic cherry-pick failed. After resolving the conflicts,
mark the corrected paths with 'git add <paths>' or 'git rm <paths>'
and commit the result with:
git commit -c df8960346dc803a5c1485551c5d109fd7dda6ae6
舉個例子:有一條主分支master,進行過兩次提交(m0和m1)。此時,新開了一個分支develop作開發,進行了三次提交(d0、d1和d2)。若是隻想將d2此次提交合併到主分支master,查了不少資料說應該用cherry-pick指令,因而開發
git checkout master git cherry-pick d2的commit哈希碼
但是這時候,會產生一個衝突,須要用戶手動去編輯。此時只能解決衝突。沒法 cherry-pick的緣由是, d2 修改的文件,已經在 d1(or d0)被修改過了,因此 cherry-pick 並不知道如何刪除和增長對應的 lines,因此就衝突了。惟一的辦法就是解決衝突。hash
另外,cherry-pick 並非將指針移到d2,cherry-pick 更像 patch the changes,即便什麼衝突都沒有,commit hash 都是不同的。it
就跟普通的衝突同樣,手動解決ast
B.1 $ git status # 看哪些文件出現衝突
both modified: app/models/user.rb
B.2 $ vim app/models/user.rb # 手動解決它
B.3 $ git add app/models/user.rb
B.4 git commit -c <新的commit號碼>