合并代码,我们之前学过git merge命令,该命令是将当前分支的所有提交,都合并到目标分支上,有没有办法,选择性合并呢,我只想合并指定的几个提交?可以使用git cherry-pick <commit_id> 命令。
一、首先准备测试数据
创建两个分支,dev和test,开始时,两个分支的readme.txt文件是相同的,内容都是空的,提交记录都只有一个"init",如下图所示
然后切换到dev分支,添加两次提交,第一次,文件添加“第一次提交”,commit注释也相同;第二次,文件添加“第二次提交”,commit注释也相同,如下图所示
这时,test分支,还是只有“init”的提交记录。
二、迁移指定提交
将“第一次提交”的这个commit迁移到test分支,首先使用git log查看该提交的commit_id,为3769ca4bb5824(具体值,你的和我的可能不一样)。
然后切换到test分支,使用git cherry-pick命令迁移commit,如下图
然后查看test分支的日志,发现只有指定的commit迁移过来了,如下图
注:由于commit_id是全局唯一的,所以只要知道commit_id,可以将该commit迁移到任意分支,只需要先切换到指定分支,然后使用cherry-pick命令即可。
三、迁移多个分支
1、迁移不连续的多个分支
git cherry-pick <commit_id_1> <commit_id_2>
上面命令,将commit_id_1和commit_id_2迁移到当前分支,不同的commit_id用空格隔开,注意commit_id的顺序,按照提交顺序排列,越早提交的放在越前面。
2、迁移连续的多个分支(commit_id_1, commit_id_2] : 不包含commit_id_1
git cherry-pick <commit_id_1>..<commit_id_2>
上面命令,是将commit_id_1(不含本身)和commit_id_2(含本身)之间的所有提交迁移到当前分支。类似前一条命令,也要注意顺序。
3、迁移连续的多个分支[commit_id_1, commit_id_2] : 包含commit_id_1
git cherry-pick <commit_id_1>^..<commit_id_2>
四、配置项
1、-n,--no-commit
只更新工作区和暂存区,不产生新的提交。
2、-x
在提交信息的末尾追加一行(cherry picked from commit <commit_id>),方便以后查到这个提交是如何产生的。
3、-s,--signoff
在提交信息的末尾追加一行操作者的签名(Signed-off-by: <作者>),表示是谁进行了这个操作。
小结
1、将指定commit合并到当前分支
$ git cherry-pick <commit_id>
2、迁移不连续的多个分支
$ git cherry-pick <commit_id_1> <commit_id_2>
3、迁移连续的多个分支(commit_id_1, commit_id_2] : 不包含commit_id_1
$ git cherry-pick <commit_id_1>..<commit_id_2>
4、迁移连续的多个分支[commit_id_1, commit_id_2] : 包含commit_id_1
$ git cherry-pick <commit_id_1>^..<commit_id_2>
注意
迁移多个提交时,一定要注意提交的顺序,按提交时间先后排列,否则提交时可能会有冲突,若有冲突,可以根据提示,选择继续还是回滚。