git cherry-pick 摘樱桃合并

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

猜你喜欢

转载自my.oschina.net/u/3412738/blog/1800414