将merge转换为rebase,而无需再次执行合并

Con*_*ion 22 git git-pull git-merge git-rebase

我犯了一个错误:我应该使用git pull --rebase,但我发布了一个简单的git pull,合并的所有内容,现在在我的分支的HEAD中有一个合并提交.

我想摆脱那个合并提交,我想我只是发出一个git rebase -i HEAD~3,将我的最后一个本地提交移到顶部并将合并提交压缩到它中.唉,合并提交不适用于压缩.如果我这样做,我进入中间状态,我需要再次进行合并,这是很多工作.

有没有办法解决这个问题而不必再次执行合并?似乎应该可以以某种方式使用合并提交?

Enr*_*lio 25

TL;博士

即使您可以在rebase中包含合并提交,也不能压缩合并提交.Git会告诉你:

拒绝压缩合并:<SHA-1>

为了保持合并期间所做的更改,您可以做的是将合并提交转换为正常提交.此时你可以像任何其他提交一样压缩它.

假设HEAD指向合并提交:

git reset --soft HEAD~1  # Keeps changes in the index
git commit               # Create a new commit, this time not a merge commit
git rebase -i HEAD~4     # Do an interactive rebase and squash the new commit
Run Code Online (Sandbox Code Playgroud)

在rebase期间保留合并提交

通常,您可以在使用rebase时保留合并提交git rebase -p.
但是,它的目的是重放导致合并的提交.作为合并提交的一部分的任何更改(例如,冲突解决方案)都不会保留.

这是来自文档:

-p
--preserve-merges
通过重放合并提交引入的提交来重新创建合并提交,而不是展平历史记录.不保留合并冲突解决方案或手动修改合并提交.
这在--interactive内部使用机器,但--interactive明确地将它与选项结合使用通常不是一个好主意,除非你知道你在做什么(见下面的BUGS)

文档引用的错误是通过重新排序提交触发的.