git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加v3.0中的某个功能到v2.0中,这里就可以使用cherry-pick了。就是对已经存在的commit 进行 再次提交;
1, 先通过git log 获取想要合并的commit_id,记录下来
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, 切换主分支;
3, 使用git cherry-pick命令将想要合并的分支合并到主分支;
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的过程中出现了冲突
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,所以就冲突了。唯一的办法就是解决冲突。
另外,cherry-pick 并不是将指针移到d2,cherry-pick 更像 patch the changes,即使什么冲突都没有,commit hash 都是不一样的。
就跟普通的冲突一样,手动解决
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号码>