0
点赞
收藏
分享

微信扫一扫

git cherry-pick -m使用

爪哇驿站 2022-03-11 阅读 129
git

工作中经常用到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提交信息。

举报

相关推荐

0 条评论