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到另外一个分支的情况。

 

posted @ 2021-05-27 15:28  咸菜白饭  阅读(63)  评论(0)    收藏  举报