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)
但这不起作用,因为它删除了合并提交并且不可用于挤压
所以这里要考虑两个因素:
首先,在某些方面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(即A和B在这个例子中)是。所以只需标记B和C“壁球”。要记住的唯一的事情是,这是一个历史的重写,所以如果你已经推,可以达到任何裁判A,B,M,还是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)