【问题标题】:Git: revert merge errorGit:恢复合并错误
【发布时间】:2017-08-03 21:10:11
【问题描述】:

我最近使用 git 将本地功能分支合并到本地主分支。然后我做了一些更改并提交到主分支。现在,我想摆脱在我的主分支上合并引起的变化。所以我做了一个:

git revert <commit-id>

但是,我得到了错误

错误:提交 c49aaca4acf461cc41390c1d1d3477f09e25a368 是合并但 没有给出 -m 选项。致命:还原失败

仅供参考,我没有向服务器推送任何内容。我在网上搜索,但找不到合适的解决方案。有谁知道该怎么做?谢谢。

【问题讨论】:

  • 参见stackoverflow.com/q/2389361/1256452,这并不完全是重复的,但确实包含许多正确答案。这里的主要问题是您是否已推动此合并,以及您想要现在做多少工作来保持合并后的更改,以及您想要推迟多少工作到以后,恢复合并的更改。
  • 我还没有推送合并。我阅读了您提供的链接。但就我而言,我已经对我的主分支进行了一些更改和提交。我只是想知道是否有一种方法可以只摆脱那个合并,同时保持所有合并后的更改。
  • 好的,如果你还没有push,我没有时间给出正确的答案,但是你可以使用git rebasecopy 所有非合并提交。 Rebase 通常会完全去除合并,因此,没有其他人拥有您现在不喜欢的原始提交,因为它们中有合并,您的副本减去合并应该正是您想要的。

标签: git merge revert


【解决方案1】:

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

但是,如果你 merge 遇到冲突,如果你 merge 使用选项 --no-ff(没有快进)或者如果 Git 不能 fast-forward,Git 创建一个 merge commit

merge commit 是一个提交,专门通过引用作为分支尖端的 2 个提交(在本例中为 2 个父级)来链接两个分支。

当你想恢复这种类型的提交时,你需要指定哪个分支应该是剩下的那个。如Git doc 所述:

还原合并提交声明您永远不会想要树 合并带来的变化

您必须使用带有父编号的选项-m (--mainline) 进行还原。 你合并的分支号是1,合并的分支号是2

在您的情况下,要在合并功能分支之前返回 master 分支的状态,您应该使用命令恢复

git revert c49aaca4acf461cc41390c1d1d3477f09e25a368 -m 1

提示:在启动 revert 之前,从您的 master 创建一个新分支(假设您当前在它上面)

git checkout -b you-name-it

并在这个新分支上执行revert:如果它有预期的结果,checkout 再次你的master 分支并执行revert,如果它没有你仍然有你的master 分支完好无损。

【讨论】:

  • 我在执行 git merge 和合并选项 --no-ff 时都没有发生冲突。
  • @iefgnoix 所以当你merged,Git 无法快进并创建了一个合并提交,我将用这个案例更新我的答案。您是否尝试恢复指定主线?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 2019-03-28
  • 2018-11-29
  • 2018-08-30
  • 2017-05-17
相关资源
最近更新 更多