赞
踩
工作中经常用到cherry-pick这个命令,如果只是单独拿一两个commit,直接使用git cherry-pick commitId 就可以了。
如果拿好几个连续的commit,并且还包含了merge提交信息(可以理解为空提交),比如下面这个提交历史:
89bbf6d (HEAD -> master) F Merge branch 'test1'
a96556c (test1) E
4002b22 D
052b177 B
b67e532 (test6, test5) A
假如我们想cherry-pick B D E F,当前分支是test5,我们可以使用下面的命令:
git cherry-pick -m 1 052b177^..89bbf6d
如果我们直接使用命令:
git cherry-pick 052b177^..89bbf6d
就会报下面错误:
$ git cherry-pick 052b177^..89bbf6d
[test5 9723b4d] B
Date: Fri Mar 4 22:52:12 2022 +0800
1 file changed, 1 insertion(+)
create mode 100644 2.txt
[test5 a8017ad] D
Date: Fri Mar 4 22:52:42 2022 +0800
1 file changed, 1 insertion(+)
create mode 100644 3.txt
[test5 2d657ad] E
Date: Fri Mar 4 22:54:03 2022 +0800
1 file changed, 1 insertion(+)
create mode 100644 4.txt
error: commit 89bbf6d75611eafd7a798222bd55f515f96602cf is a merge but no -m option was given.
fatal: cherry-pick failed
会提示我们有一个merge提交,但是没有使用-m参数。
原因是merge提交有两个parent。
cherry-pick的时候,如果没有指定使用哪一个parent的话,git就不知道如何工作了。
从网上查到cherry-pick的原理是使用补丁。
cherry-pick F的解释是把F^到F之间的差异,打成补丁,然后应用到当前分支。当F提交是merge提交的话,会有两个parent,必须指定使用哪一个parent,git才会把parent到F节点的差异找出来,然后应用到当前分支。
-m 1说明是1号parent,一般是被合入的提交,比如master分支merge test1分支,生成新的F提交,那么master分支上的提交D就是F的1号parent。test1分支上的提交E就是2号parent。
提交F是包含D和E提交信息的,如果-m 1的话,就是1号parent与F之间的差异,也就是E提交信息。
现在举例如下,分支情况:
master分支提交:A—B---D—F
test1分支提交:A—E
test2分支是基于提交A创建的,然后执行
git cherry-pick -m 1 F
。
现在分别看一下提交D和E的信息:
D:
里面的内容是3.txt
提交E的信息:
执行命令后,我们看一下F的情况:
可以看到,里面的内容是4.txt,也就是1号parent和原始merge提交F的差异,也就是E提交信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。