Git 变基失败,因为:提交 xxxx 是合并但没有给出 -m 选项

Git rebase fails because: Commit xxxx is a merge but no -m option was given

我有一个功能分支:

feature

假设有 10 次提交

然后前段时间我开始在上面做实验,但为了以防万一,想保留当前的功能,所以我开了一个新分支:

feature-experiment

然后又做了 10 次提交

今天我决定merge feature-experiment 变成feature 然后我删除了feature-experiment。我解决了一些合并冲突。

然后,我的 20 个提交都使用相同的名称并以 WIP 结尾(正在进行中),非常难看,所以我决定

git rebase -p -i HEAD~22

我将 pick 更改为 s 以将它们全部压缩到此功能的最旧提交中,但我遇到了一些合并冲突(与以前相同)。我解决了它们然后

git add -A && git commit

git rebase --continue

但现在我收到以下错误:

error: Commit asd123qsd is a merge but no -m     option was given.
fatal: cherry-pick failed
Could not pick asd123qsd 

这是最后一次提交(合并)

我再次尝试,但这次我没有将此特定提交的 pick 更改为 s,但得到了同样的错误。

我该如何执行这个可怕的 rebase?

我在想,作为一个可能的解决方案,我可以修改最后一次提交以添加 -m 到它,但我该怎么做以及我如何处理这个 -m 命令?还有其他选择吗

问题可能出在这里:

git 变基 <b>-p</b> -i HEAD~22

-p 选项在 the git documentation 中描述为 --preserve-merges 的简短版本:

-p

--preserve-merges

Recreate merge commits instead of flattening the history by replaying commits a merge commit introduces. Merge conflict resolutions or manual amendments to merge commits are not preserved.

This uses the --interactive machinery internally, but combining it with the --interactive option explicitly is generally not a good idea unless you know what you are doing (see BUGS below).

既然你试图压缩这里的提交,那么保留合并提交几乎肯定不是你想要的。此外,有关将 --preserve-merges 标志与 --interactive (-i) 标志组合的警告可能与此处相关。

老实说,像这样使用变基来做壁球可能会引入比您在这里需要的复杂得多的东西。如果您只想将此分支中的所有更改压缩到一个提交中,您可以这样做:

git checkout feature
git reset --soft <base of feature branch>

此时,您的功能分支中的所有更改都应该暂存,并且功能分支应该在基本提交中。现在你可以简单地 运行 git commit 来创建一个新的提交,其中包含你的功能分支中的所有更改,这基本上相当于一个 squash。