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

时间:2016-06-20 14:33:21

标签: git github rebase cherry-pick

我有一个功能分支:

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,但却出现了同样的错误。

我怎样才能进行这种可怕的变形呢?

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

1 个答案:

答案 0 :(得分:3)

问题可能在这里:

git rebase -p -i HEAD~22

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

  

<强> -p

     

<强> - 保留 - 合并

     

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

     

这在内部使用了--interactive机器,但结合它   明确地使用--interactive选项通常不是一个好主意   除非你知道自己在做什么(见下面的BUGS)。

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

老实说,使用rebase来做这样的壁球可能会引入比你需要的更多的复杂性。如果您只想将此分支中的所有更改压缩为单个提交,则可以这样做:

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

此时,您的功能分支的所有更改都应暂存,功能分支应位于基本提交。现在,您只需运行git commit即可创建一个新提交,其中包含功能分支中的所有更改,这基本上等同于壁球。