如何用普通提交压缩合并提交?

Sou*_*tra 4 git merge commit github squash

commit b0e5db36ed68d4562275adeb08001b1316a4da52
Merge: ea38baa 8220bb1

commit ea38baa3f46a48722987b8dd3892d2b8d81c4d1a
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我如何压缩这两个提交

我在用

git rebase -i HEAD~2
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它删除了合并提交并且不可用于挤压

Mar*_*ger 8

所以这里要考虑两个因素:

首先,在某些方面rebase,合并提交并不总是很好。我会回到那几次。

其次,您期望的结果并不完全清楚。如果现在你有类似的东西

x -- x -- M -- C <--(master)
 \       /
  A --- B
Run Code Online (Sandbox Code Playgroud)

你想结束

x -- x -- ABC <--(master)
Run Code Online (Sandbox Code Playgroud)

或者

x -- x -- MC <--(master)
 \       /
  A --- B
Run Code Online (Sandbox Code Playgroud)

如果你想要带有 的版本ABC,这很简单。而M在底垫的待办列表不显示,所有被带入主线在提交的通过 M(即AB在这个例子中)是。所以只需标记BC“壁球”。要记住的唯一的事情是,这是一个历史的重写,所以如果你已经推,可以达到任何裁判ABM,还是C那么一些清理可能需要(参见rebase下的“从上游底垫中恢复”文档)。

如果要带 的版本MC,那么问题就很多了。不是说你不能得到它,但我认为你不能通过做一个来得到它rebase;而且,MC这将是一个“邪恶的合并”,这也可能导致未来rebase尝试出现问题(除其他外)。

默认情况下,rebase尝试生成线性历史记录并且不会生成合并提交。您可以使用该--preserve-merges选项使其生成合并提交,但这与交互效果不佳-i(如果您尝试通过这样做来修改合并,我预计会有几个可能的问题)。

如果您不担心在合并提交中隐藏更改的问题,并且真的想产生像 那样的提交MC,那么这样做的方法是:

首先,将masterref 移回,M同时保留C索引中的更改。

git checkout master
git reset --soft HEAD^
Run Code Online (Sandbox Code Playgroud)

然后将更改直接重新应用到合并提交

git commit --amend
Run Code Online (Sandbox Code Playgroud)