Git 使用交互式变基压缩时跳过合并提交

Git skips merge commit when squashing using interactive rebase

我正在使用 git 开发一项功能,到目前为止我已经完成了以下步骤。

这是git log --oneline -n 5输出

de5d701 Merge branch 'test' into 'feature1' (amended)
a668f93 'feature1' commit3
ded7c00 'feature1' commit2
8731807 Initial 'feature1' commit
ff2f539 latest 'master' commit

我想在合并到 master 之前压缩 ff2f539 latest 'master' commit 之后的所有内容。我试着表演

git rebase --interactive  ff2f539

但是编辑器中没有列出最新的提交:

pick 8731807 Initial 'feature1' commit
pick ded7c00 'feature1' commit2
pick a668f93 'feature1' commit3

# Rebase ff2f539..de5d701 onto ff2f539
#
# Commands:
...
# Note that empty commits are commented out

我不明白为什么跳过 test 分支合并到 feature1 分支产生的最新提交。 使用以下内容保存并退出编辑器:

pick 8731807 Initial 'feature1' commit
squash ded7c00 'feature1' commit2
squash a668f93 'feature1' commit3

# Rebase ff2f539..de5d701 onto ff2f539
#
# Commands:
...
# Note that empty commits are commented out

产生新的提交,它不提供上次提交的更改

de5d701 Merge branch 'test' into feature1(amended)

他们迷路了。任何帮助如何在合并到 master 之前将所有这些提交压缩为一个提交?

如果您想在变基中包含合并提交,请将 --preserve-merges 选项传递给 git rebase

Git 不按设计在 "interactive" 列表中显示合并提交。相反,它包括通过该合并带入分支的所有提交。您可以使用 -p (--preserve-merges) 选项来更改该行为,但不建议在交互模式下使用,因为结果可能不那么明显(请参阅 http://git-scm.com/docs/git-rebase#_bugs)。

但是有一个不用变基的简单解决方案:

# make sure your working copy is clean, do git stash if needed
git checkout feature1
git reset --soft ff2f539
git commit -m "..."

这将产生一个提交,包括 ff2f539 之后的所有更改。