我最近使用git将本地特性分支合并到本地主分支。然后我对主分支进行了一些更改和提交。现在,我想要消除合并在主分支上引起的更改。因此,我执行了以下操作:
git revert <commit-id>
然而,我遇到了错误
错误:提交c49aaca4acf461cc41390c1d1d3477f09e25a368是一个合并请求,但未给出-m选项。致命错误:还原失败
顺便说一下,我还没有将任何内容推送到服务器上。我在网上搜索,但找不到一个像样的解决方案。有人知道怎么做吗?谢谢。
在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
分支。
merged
操作时,Git无法快进并创建了一个合并提交。我会更新我的答案来处理这种情况。你尝试过指定主线进行还原吗? - Lex Lustor
git rebase
来复制所有非合并提交。Rebase通常会完全去除合并,因此,由于没有其他人拥有你不喜欢的原始提交,因为它们包含了合并,你的复制减去合并应该正是你想要的东西。 - torek