rin*_*t.6 22 git cherry-pick git-cherry-pick
假设这是我的git历史
Z / A -- C -- D \ / B
我的HEAD目前在Z
.我想樱桃挑选B
和C
.如果我的理解是正确的,我应该这样做:
git cherry-pick B
git cherry-pick C -m 1
git commit --allow-empty
Run Code Online (Sandbox Code Playgroud)
它在我的情况下工作,因为C
是一个无操作(因此之后的空提交,我需要提交其他原因),但我想知道后面的参数是什么-m
.以下是我从文档中读到的内容:
-m父号
- 主线父母号码
通常你不能挑选合并因为你不知道合并的哪一边应该被认为是主线.此选项指定主线的父编号(从1开始),并允许cherry-pick重放相对于指定父级的更改.
在我的情况下,C
有两个父母,但我怎么知道哪一个是1和2,更重要的是当我选择1或2时什么时候重要?
Sco*_*don 26
根据这个答案,我的理解是父1是被合并的分支,父2是被合并的分支.所以在你的情况下,父1是A
,而父2是B
.由于cherry-pick实际上是在两个提交之间应用diff,因此您-m 1
只使用B
(因为diff之间的差异A
并C
包含更改B
).对你来说,它可能并不重要,因为你之间没有提交A
和C
.
所以是的,-m 1
是你想要的,即使在A
和之间有额外的提交也是如此C
.
如果您想让新历史看起来更像原始历史,还有另一种方法可以做到这一点:
git cherry-pick B
git checkout Z
git merge --no-ff --no-commit B
git commit --author="Some Dev <someone@example.com>" --date="<commit C author date>"
Run Code Online (Sandbox Code Playgroud)
(如果需要,您可以B
在挑选之前创建一个新分支.)
这将保留作者信息,应该给你一个如下所示的历史记录:
B'
/ \
Z -- C'
/
A -- C -- D
\ /
B
Run Code Online (Sandbox Code Playgroud)