git cherry-pick
在实际开发过程中,将代码从一个分支转移到另一个分支是常见需求。
这时分两种情况:
- 一种情况是,我们需要另一个分支的所有代码改动,那么就可以采用合并处理
git merge
; - 另一种情况,我们只需要部分代码改动(某一个或多个 commit 提交),这时就可以采用
cherry pick
。
1 cherry-pick 的作用
cherry-pick
,精心挑选的意思,挑选一个我们需要的 commit 。
其作用:将在其他分支上的 commit 修改,移植到当前的分支。
2 使用场景
想在一个稳定的版本上,添加一个刚开发完成的版本中的某个功能,而非某个分支的所有代码。
可以使用 git cherry-pick <commit-id>
命令,将这个功能相关的 commit 提取出来,合入稳定版本的分支上。
3 使用方法
每次只拉去一个 commit 记录:
git cherry-pick <commitID>
// 增加 -x 参数,表示保留原提交的作者信息进行提交
git cherry-pick -x <commitID>
当执行完 cherry-pick 之后,将会自动生成一个新的 commit 进行提交,也会有一个新的 commit ID。然后可以进行 git push 到远程分支,进行创建合并请求。顺利的话,正常合并就可以。如果遇到冲突,解决冲突即可。
支持批量 cherry-pick
就是可以一次将一个连续的时间序列内的 commit ,设定一个开始和结束的 commit ,进行 cherry-pick 操作。
git cherry-pick commit1..commit100
// 可以看到,它的范围就是 commit1 到 commit100 之间所有的 commit,但是它这是一个(左开,右闭] 的区间,也就是说,它将不会包含 commit1 的 commit。
而如果想要包含 start-commit-id 的话,就需要使用 ^
标记一下,就会变成一个 [左闭,右闭]
的区间,commit1 和 commit100 都会合并到当前分支。
git cherry-pick commit1^..commit100
注意:上面讲到cherry-pick命令每拣选一个commit就会提交一次生成一个新的commit id。 如果我们想让每个commit 拣选后暂缓提交,等到所有commit都拣选完成后,自己手动commit。
那么可以加上 -n
选项在 commitID 前面,这样到最后可以进行一次提交。
git cherry-pick -n commit1^..commit100