Git 重新设置基础失败,因为:提交 xxxx 是合并提交,但没有给出 -m 选项。

5

我有一个功能分支:

feature

比如说有10个提交记录

前段时间,我开始对其进行实验,但是为了保留当前功能,我创建了一个新的分支:

feature-experiment

然后又进行了10次提交。

今天我决定将feature-experimentfeature合并,然后删除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”命令?是否还有其他选项?


这很奇怪,因为通常合并提交应该在变基时被排除,除非你显式地传递了 --preserve-merges 标志... - Ajedi32
我确实通过了它(-p)。 - Kaloyan Roussev
我应该不使用它尝试吗? - Kaloyan Roussev
我之前尝试过不用它,但现在出现了一个冲突,而且这个冲突早在“feature”分支创建之前就存在了,我不知道该如何解决。 - Kaloyan Roussev
1个回答

3
问题很可能出在这里:
git rebase -p -i HEAD~22
git文档中,-p选项被描述为--preserve-merges的简写形式:
-p --preserve-merges 重新创建合并提交,而不是通过重播提交来扁平化历史记录。合并冲突解决或手动修改合并提交不会被保留。 这在内部使用--interactive机制,但明确将其与--interactive选项组合使用通常不是一个好主意(请参见下面的BUGS)。
由于您正在尝试压缩提交,因此保留合并提交几乎肯定不是您想要的。此外,关于将--preserve-merges标志与--interactive(-i)标志组合使用的警告很可能与此相关。
老实说,使用rebase来进行压缩可能会引入比你在这里需要的更多的复杂性。 如果你只想将这个分支中的所有更改压缩成一个单独的提交,可以像这样做:
git checkout feature
git reset --soft <base of feature branch>

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


谢谢,我会尝试一下!您在使用占位符<base of feature branch>时应该放什么?我想要从哪个提交开始? - Kaloyan Roussev
1
那应该是你的分支所基于的提交。例如,如果你从主分支上创建了一个分支,那么 git merge-base master feature 应该会打印出要在此步骤中使用的提交哈希值。(它应该是特性分支上第一个提交的父提交) - Ajedi32
我先执行了这个操作,然后进行了推送。但是被拒绝了,因为另一个分支已经更新了,所以我进行了拉取操作,然后再次推送。我去GitHub查看,发现之前的20个提交记录还在,而且新的提交记录也在其中。我做错了什么? - Kaloyan Roussev
@J.K. 这是与所有重新编写历史的 git 操作(如 rebase、squash、--amend 等)相关的普遍问题。另一个分支可能没有“前进”,它只是仍然包含了本地分支中不再存在的未合并的提交。因此,当你运行 git pull 时,它会将所有这些提交合并回你的本地分支。(因为这就是 pull 的作用。)每当你想要删除提交(即重新编写历史)到远程分支时,你必须使用 --force 进行推送。假设这正是你打算的方式,请使用 reset --hard 返回到已经合并的提交,并再次使用 --force 进行推送。 - Ajedi32
你所说的“压缩提交”是指特性分支的基础还是我刚上传的那个提交?在那个提交之后,还添加了一些合并提交,所以这三个提交中应该选择哪一个进行硬重置呢?非常抱歉我问了这么多问题。 - Kaloyan Roussev
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接