git cherry-pick -m使用

工作中经常用到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。
git cherry-pick -m使用_第1张图片

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提交信息。

现在举例如下,分支情况:

git cherry-pick -m使用_第2张图片
master分支提交:A—B---D—F
test1分支提交:A—E

test2分支是基于提交A创建的,然后执行
git cherry-pick -m 1 F

现在分别看一下提交D和E的信息:
D:
git cherry-pick -m使用_第3张图片

里面的内容是3.txt

提交E的信息:

git cherry-pick -m使用_第4张图片

执行命令后,我们看一下F的情况:
git cherry-pick -m使用_第5张图片

可以看到,里面的内容是4.txt,也就是1号parent和原始merge提交F的差异,也就是E提交信息。

你可能感兴趣的:(git)