我有一个功能分支:
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命令?还有其他选择
答案 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
即可创建一个新提交,其中包含功能分支中的所有更改,这基本上等同于壁球。