Git rebase 失败,因为:Commit xxxx 是合并,但没有给出 -m 选项

J. *_* K. 5 git github rebase cherry-pick

我有一个功能分支:

feature
Run Code Online (Sandbox Code Playgroud)

假设有 10 次提交

然后前段时间我开始对其进行实验,但想保留当前的功能以防万一,所以我开始了一个新的分支:

feature-experiment
Run Code Online (Sandbox Code Playgroud)

然后又进行了 10 次提交

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

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

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

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

git add -A && git commit

git rebase --continue
Run Code Online (Sandbox Code Playgroud)

但现在我收到以下错误:

error: Commit asd123qsd is a merge but no -m     option was given.
fatal: cherry-pick failed
Could not pick asd123qsd 
Run Code Online (Sandbox Code Playgroud)

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

我再次尝试,但这次我没有将此特定提交更改picks,但遇到了相同的错误。

我怎样才能进行这个可怕的变基呢?

我在想,作为一种可能的解决方案,我可以修改最后一次提交以将 -m 添加到其中,但是我该怎么做以及如何使用此 -m 命令?还有其他选择吗

Aje*_*i32 3

问题很可能出在这里:

git rebase -p -i HEAD~22

该选项在git 文档-p中被描述为以下的简短版本:--preserve-merges

-p

--保留合并

重新创建合并提交,而不是通过重放合并提交引入的提交来展平历史记录。合并冲突解决方案或对合并提交的手动修改不会保留。

这在内部使用了 --interactive 机制,但将其与 --interactive 选项显式组合通常不是一个好主意,除非您知道自己在做什么(请参阅下面的错误)。

由于您试图在此处压缩提交,因此保留合并提交几乎肯定不是您想要的。--preserve-merges此外,有关将该标志与--interactive( ) 标志组合的警告-i可能与此处相关。

但老实说,使用变基来做这样的挤压可能会带来比您在这里需要的复杂得多的复杂性。如果您想要的只是将该分支的所有更改压缩到单个提交中,您可以这样做:

git checkout feature
git reset --soft <base of feature branch>
Run Code Online (Sandbox Code Playgroud)

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