工作中, 我们经常会需要从其他分支获取一些重要的修改, 但只是部分commit, 不能用merge, 这时cherry-pick
就派上用场了.cherry-pick
可以把其他分支的某些commit合并到当前分支, 具体使用和注意事项请看下面的实操.
cherry-pick 实操
假设有一个分支origin/niko_blog_test
, 他的git log
如下:
|
基于f000b1ac4bf9dbd57d107895f349f448a3af05cc
的commit建立分支niko_blog_test-2
:
git checkout -b niko_blog_test-2 f000b1ac4bf9dbd57d107895f349f448a3af05cc |
查看git log:
commit f000b1ac4bf9dbd57d107895f349f448a3af05cc |
开始cherry-pick
我们要把niko_blog_test
的两个最新commit, pick到niko_blog_test-2
中, 操作如下:
$ git cherry-pick ceaa73f 42a8708 |
提示冲突, 进行合并:
$ git mergetool |
此时状态:
$ git st |
进行commit操作.
然后继续记性cherry-pick:
$ git cherry-pick --continue |
又提示冲突, 这里要手动解决了.
$ git mergetool |
冲突解决后, 此时状态:
$ git st |
进行commit操作.
再git cherry-pick --continue
会打印空内容, 表示cherry-pick结束.
此时再查看log:
commit e68a53fef3229c6536b44781d2cb8322aa4202e1 |
可以看到f000b1ac4bf9dbd57d107895f349f448a3af05cc
之后多了两个commit, README.txt的内容也过来了.
其实, 上面的操作之所以很曲折, 是因为顺序错了, 哇哈哈哈 !!!只要按commit时间顺序来, 就不会有这么多的冲突问题, 如下所示.
cherry-pick 实操 - 按时间顺序
重来的话, 我们reset到f000b1ac4bf9dbd57d107895f349f448a3af05cc
版本:
$ git reset --hard f000b1ac4bf9dbd57d107895f349f448a3af05cc |
开始cherry-pick
这次, 我们按照正确的顺序来:
$ git cherry-pick 42a8708 ceaa73f |
因为不会冲突, 直接用分支niko_blog_test
的commit log, 如 git log 所示:
$ git log |
顺序对了, 是不是简单很多啦? 所以一定要注意顺序的问题. 嘻嘻……