Git:还原合并错误

3

我最近使用git将本地特性分支合并到本地主分支。然后我对主分支进行了一些更改和提交。现在,我想要消除合并在主分支上引起的更改。因此,我执行了以下操作:

git revert <commit-id>

然而,我遇到了错误

错误:提交c49aaca4acf461cc41390c1d1d3477f09e25a368是一个合并请求,但未给出-m选项。致命错误:还原失败

顺便说一下,我还没有将任何内容推送到服务器上。我在网上搜索,但找不到一个像样的解决方案。有人知道怎么做吗?谢谢。


请参见https://dev59.com/MHE95IYBdhLWcg3wQ7qb(可能不完全相同但包含正确答案)。主要问题在于您是否已经*推送*此合并,以及现在希望为保留合并后更改而做多少工作,还是想延迟到以后的时间来恢复合并进来的更改。 - torek
我还没有推送合并。我阅读了您提供的链接。但是,在我的情况下,我已经对我的主分支进行了一些更改和提交。我只想知道是否有一种方法可以仅摆脱那个合并,同时保留所有后续合并更改。 - iefgnoix
好的,如果你还没有推送,我现在没时间给你一个完整的答案,但是你可以使用git rebase复制所有非合并提交。Rebase通常会完全去除合并,因此,由于没有其他人拥有你不喜欢的原始提交,因为它们包含了合并,你的复制减去合并应该正是你想要的东西。 - torek
1个回答

6

在Git中,一个提交通常只引用一个父提交。

然而,如果你进行merge并且出现冲突,或者使用--no-ff选项(不进行快进合并),或者Git无法快进合并,Git会创建一个合并提交

合并提交是一种专门连接两个分支的提交,它通过引用这两个分支的最新提交(在本例中是2个父提交)来实现。

当你想要撤销这种类型的提交时,需要指定哪个分支应该保留。正如Git文档所述:

撤销一个合并提交意味着您永远不会希望保留由合并引入的树更改。

您需要使用父级编号选项-m--mainline)进行还原。 您合并的分支编号为1,合并的分支编号为2

在您的情况下,要返回到功能分支合并之前的master分支状态,您应该使用以下命令还原:

git revert c49aaca4acf461cc41390c1d1d3477f09e25a368 -m 1

提示:在执行 revert 命令之前,从您的 master 分支创建一个新分支(假设您当前在该分支上)。

git checkout -b you-name-it

并在此新分支上执行revert:如果结果符合预期,则再次checkout您的master分支并执行revert,否则您仍然拥有完整的master分支。


我既没有在进行git合并时遇到冲突,也没有使用--no-ff选项进行合并。 - iefgnoix
@iefgnoix,所以当你执行merged操作时,Git无法快进并创建了一个合并提交。我会更新我的答案来处理这种情况。你尝试过指定主线进行还原吗? - Lex Lustor

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