当前位置:   article > 正文

git cherry-pick -m使用

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
  • 1
  • 2
  • 3
  • 4
  • 5

假如我们想cherry-pick B D E F,当前分支是test5,我们可以使用下面的命令:

git cherry-pick -m 1 052b177^..89bbf6d
  • 1

如果我们直接使用命令:

git cherry-pick 052b177^..89bbf6d
  • 1

就会报下面错误:

$ 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

会提示我们有一个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提交信息。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/884387
推荐阅读
相关标签
  

闽ICP备14008679号