一、前言
对于多分支的代码库,将代码从一个分支转移到另一个分支是一个常见的需求。
这个时候就得分为两种情况。一种情况是:你需要这个分支上面的所有代码,那就采用合并,直接使用git merge
或者git rebase
命令即可。另外一种情况就是,你只需要这个分支上面的某些提交,那就需要采用gii cherry-pick
的命令,这个操作在日常开发的工作中,也是非常的常用,需要我们记住和学习。
最近在工作中就遇到了类似的问题,一个开发分支上修改了代码,需要上线,但是当前分支上还在开发其他的功能,不能直接合并到release分支,这个时候就需要采用git cherry-pick
的命令了,其中需要注意的地方是,我们需要先从release
分支上面迁出一个临时分支release-pick
,在当前分支上面使用cherry-pick
命令,然后在直接merge
到release
分支上面,那为什么不能直接在release
分支上面使用cherry-pick
命令呢?那是因为我们要保证release
分支的干净和整洁,不能有提交点,如果直接在release
分支上面使用cherry-pick
命令的话,会导致release
分支上面有提交点,最后操作完成后,可以删除临时分支release-pick
。
二、基本用法
git cherry-pick
命令的作用,就是将指定的提交(commit)应用于其他的分支
git cherry-pick <commitHash>
上面的命令就会将指定的提交commitHash
,应用于当前分支。这会在当前分支产生一个新的提交,当然它们它们的哈希值会不一样。
举个栗子,代码仓库有master
和feature
两个分支。
a - b - c - d Master
\
e - f - g Feature
现在将提交f
应用到master
分支
#切换到master分支
git checkout master
#cherry-pick操作
git cherry-pick f
上面操作完成后,代码库就会变成下面这个样子。
a - b - c - d - f Master
\
e - f - g Feature
从上面可以看出来,master
分支的末尾多了一个提交f
git cherry-pick
命令的参数不一定是提交哈希值,分支名也可以,表示合并该分支最新的一次提交。
eg:
git cherry-pick feature
上面的命令表示,将分支feature
最新的一次提交合并到当前分支
三、转移多个提交
cherry pick
支持转移多个提交
eg:
git cherry-pick <hashA> <hashB>
上面的代码表示将A和B两个提交应用到当前分支,在当前分支会生成两个新的提交
如果想转移一系列的提交,可以使用以下简洁的命令
git cherry-pick A..B
上述代码表示,将A和B之间的提交全部应用到当前分支(不包括A提交),A提交必须要早于B提交,不然会发生错误。
如果想包括A提交,可以使用一下的命令即可
git cherry-pick A^..B
四、配置项
cherry-pick
常用的配置命令如下:
1、-e
, -edit
打开外部编辑器,编辑提交信息
2、-n
,--no-commit
只更新工作区和暂存区,不产生新的提交
3、-x
在提交信息的末尾追加一行(cherry picked from commit ...)
,方便以后查到这个提交是如何产生的。
4、-s,--signoff
在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。
五、代码冲突
如果操作过程中发生代码冲突,Cherry pick
会停下来,让用户决定如何继续操作。
1、–continue
用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .)
,第二步使用下面的命令,让 Cherry pick
过程继续执行。
git cherry-pick --continue
2、–abort
发生代码冲突后,放弃合并,回到操作前的样子。
3、–quit
发生代码冲突后,退出 Cherry pick
,但是不回到操作前的样子。
六、实践练习
这里推荐一个在线学习使用git
命令的一个网站:https://oschina.gitee.io/learn-git-branching/
本文部分内容参考:http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html