版权声明:
本公众号发布的所有文章,均属于原创,版权归本公众号所有。
未经允许,不得转载。
一、前言
在实际工作开发中,会遵循标准的 Git Work flow,对待不同的功能,会切出不同的分支进行 coding,所以,基于什么基准分支切出来的功能分支进行 coding,这是一个很重要的问题。
如果切错了基准分支,你会发现可能最终开发完成之后, merge 不回去了。或者需要将某个分支上的 commit 代码,移植到某个分支上面,就需要使用到 cherry-pick 这个 git 命令了。
二、Git 的 Cherry-Pick
1、什么是 Cherry-Pick
cherry-pick 是 Git 版本控制工具中的一个命令,和 commit 、pull 一样,它只是一个命令。
cherry-pick 和它的名称一样,精心挑选,挑选一个我们需要的 commit 进行操作。它可以用于将在其他分支上的 commit 修改,移植到当前的分支。
一个很常见的场景,就是想在某个稳定版本上,添加一个刚开发完成的版本中的功能。就可以使用 Cherry-pick 命令,将这个功能相关的 commit 提取出来,合入稳定版本的分支上。
2、如何使用 Cherry-Pick
Cherry-Pick 使用起来非常的简单:
git cherry-pick <commit-id>
这里操作的就是需要 cherry-pick 的 commit-id ,一般使用 Git 管理工具什么的,都可以很方便的查看到,否者的话,可以使用 git log
命令,查找我们需要的 commit-id。
当执行完 cherry-pick 之后,将会自动生成一个新的 commit 进行提交,也就是会有一个新的 commit ID。
如果顺利的话,就可以正常提交了。如果遇到冲突,使用 git diff 解决冲突即可,工作中,不推荐手工解决冲突,最好还是使用一些 diff 工具来处理,毕竟手工处理容易出错。
3、Cherry-Pick 的高级用法
前面介绍的最简单的 git cherry-pick
只是最简单也是最常用的方法,正常来说,我们直接使用最简单的命令就可以了,如果 commit 多了,无非就是多重复执行几次而已,但是 cherry-pick 还有一些高级点的用法,这里了解一下。
git cherry-pick -x <commit_id>
增加 -x 参数,表示保留原提交的作者信息进行提交。
在 Git 1.7.2 版本开始,新增了支持批量 cherry-pick ,就是可以一次将一个连续的时间序列内的 commit ,设定一个开始和结束的 commit ,进行 cherry-pick 操作。
git cherry_pick <start-commit-id>…<end-commit-id>
可以看到,它的范围就是 start-commit-id 到 end-commit-id 之间所有的 commit,但是它这是一个 (左开,右闭] 的区间,也就是说,它将不会包含 start-commit-id 的 commit。
而如果想要包含 start-commit-id 的话,就需要使用 ^ 标记一下,就会变成一个 [左闭,右闭] 的区间,具体命令如下。
git cherry-pick <start-commit-id>^...<end-commit-id>
举个例子来说明一下:
使用 git log —pretty=online
来查看当前分支最近的提交,注意 git 命令中,对于 commit-id 的操作,都只需要使用前五位就可以了。
git cherry-pick 371c2…971209 // (2,5]
git cherry-pick 371c2^…971209 // [2,5]
3、注意事项
无论是对单个 commit 进行 cherry-pick ,还是批量处理,注意一定要根据时间线,依照 commit 的先后顺序来处理,否者会有意想不到的问题。
如果遇上冲突,最好不要手工解决冲突,还是需要依赖工具来完成的,最简单的就是 Android Studio 中为我们提供的一套简单的 git 管理根据,接下来,就让我们看看在 Android Studio 中,如何使用 cherry-pick 吧。
三、AS 中的 Cherry-Pick
Android Studio 中,其实已经为开发者提供了非常成熟的 Version Control 工具,一般使用快捷键 alt+9
打开。
在 Version Control 窗口中,可以查看到所有的 commit log。
在这个窗口中,可以看到一个非常直观的 git log 的情况,当然这是一个 git 管理工具的必备的,没什么好说道的。
如果想对某一次 commit 进行 cherry-pick 操作的话,找到这个 commit ,点击右键。
选择 Cherry-Pick 即可,一个樱桃的 icon 。
顺利的话,没有冲突,就会出现一个 commit changes 的对话框,可以直接提交当前的操作,并且 commit message 已经帮我们写好了,记录清楚是从那个 commit 进行的 cherry-pick 操作。
如果不那么顺利,遇见了冲突,就需要我们来处理冲突了,AS 其实也提供了非常直观的处理冲突的 diff 工具,会先提示需要处理冲突。
这里可以点击 Accept Yous 或者 Accept Theirs 来标记是使用你的代码,还是第三方合并过来的代码。当然既然有冲突,通常我们需要 点击 merge 按钮,自己来解决冲突。
最终,将代码按我们的预期 merge 之后,点击 Apply 即可完成合并,同时生成个 commit 进行提交。