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号码>