如何挑选合并提交?

How to cherry-pick merge commits?

我需要挑选一系列提交,我在其中找到了这样的提交:

Merge "TICKET-100: Some commit message" into master

< some other commits >

TICKET-100: Some commit message

我检查了内容,两次提交都一样。我可以只挑选第一个,而忽略以“Merge”开头的那个吗?它们有什么关系?

让我们假设你有这样的东西:

X - master
|
|
M
|\
| \
X  B - merged_feature_branch
|  |
|  |
X  A    X - cherry_pick_destination
| /     |
|/      |
X       X
|      /
|     /

现在你有两个选择:

  • 仅限樱桃采摘 AB
  • cherry pick M 对阵第一个 parent (-m 1)

两种解决方案都会引入相同的变化,但恕我直言,第一种方法更具可读性。 如果在提交 M 时解决了一些冲突,那么第二个选项可能是首选..

如果你必须cherry-pick一系列没有合并提交的提交,而不是

git cherry-pick A..B

您可以将范围放入抑制合并提交的子命令中:

git cherry-pick $(git rev-list --no-merges A..B)

也许你可以在合并之前重新设置你的提交? 尝试这样的事情:

git rebase -i HEAD~[commits count]

现在您必须看到一个包含所选提交的列表。在您想要压缩所有其他提交的第一次提交之前,必须是命令 pick.

squash - 如果你想更改提交消息,fixup - 如果不想。

变基后你可能只能合并选定的更改。