git cherry-pick 将其他分支代码的提交合入当前分支中
git cherry-pick commitID 将该结点合入当前分支
git cherry-pick commitID1..commitID2 将ID1到ID2中的提交合入当前分支,但不包括ID1,只包括ID2
git cherry-pick commitID1^..commitID2 将ID1到ID2中的提交合入当前分支,包括ID1和ID2
如果合入过程中,提示有两个父结点,需要指定其中一个,比如说合入的commitID是一个meger的提交,那它就会有两个父结点,使用下面指令来选择对应父结点
git cherry-pick commitID1..commitID2 -m 1 后面的1代表是第一个父结点,从gitk中看出提交线路,靠前的就是第1个
在cherry-pick过程中遇到meger提交的结点,就会提示当前是否有冲突,如果没冲突会提示当前提交为空,需要下一步操作
git cherry-pick --skip 执行后,会继续寻找下一个合并的结点
如果有冲突,会有黄色警告提示,解决后,git add,然后 git cherry-pick --continue继续寻找下一个合并的结点
gerrit上面每次提交一笔,也会有cherry-pick的选项,选择即可;
另外在命令行下,也可以用这种方法来大量合并另一分支的代码
在提交到gerrit进行review的时候,每个commit中都要带有一个唯一的change-id字串,当我们在cherry-pick一些commit到另外的分支的时候,如果被cherry-pick的commit已经是在gerrit中了,那么就需要重新生成change-id,否则再重新提交到gerrit的时候会被拒绝。
有两种方式可以办到:
1. 使用cherry-pick -n <HASH>, 然后用git commit, git log 不会丢失,我们只是需要将change-id那一行删除,系统提交后会自动生成新的唯一change-id.
这个方法操作步骤少,但是当面对几百个需要cherry-pick的提交时,就要重复几百次,尤其是查找和复制hashcode的时候会比较繁琐。
2. 可以在开发分支上调用git rebase --interactive <主分支>, 然后将呈现文字中pick全部改成edit,如此这样,在rebase的过程中,每一个commit都会提醒你使用git commit --amend去修改commit, 你只要将change-id删掉即可,然后执行git rebase --conitue 开始执行下个commit的rebase操作,如此反复,直到所有commit完成rebase。
这种方式适合大量commit需要cherry-pick到另外一个分支的情况。