【问题标题】:Git. Reverting a commit older than HEAD fails吉特。恢复早于 HEAD 的提交失败
【发布时间】:2020-03-13 05:25:21
【问题描述】:

我正在尝试学习git revert 命令。我正在尝试恢复比 HEAD 更早的提交。这是不允许的吗?

$ git touch sonic
$ echo sonic >> sonic
$ git add .
$ git commit -m "sonic"
$ echo the >> sonic
$ git add .
$ git commit -m "the"
$ echo hedgehog >> sonic
$ git add .
$ git commit -m "hedgehog"
$ git log --oneline
d65e56d (HEAD -> master) hedgehog
e37fefc the
c745775 sonic

然后

$ git revert HEAD^
Auto-merging sonic
CONFLICT (content): Merge conflict in sonic
error: could not revert e37fefc... the
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

我可以做git revert HEAD,这将恢复 d65e56d 但不是git revert HEAD^。这根本不允许吗? git revert HEAD^^ 也不行。

【问题讨论】:

    标签: git revert


    【解决方案1】:

    这不是一个失败。也算不上成功。这是一个冲突,告诉你 Git 无法解决反向应用的问题。

    发生冲突是因为您触及了相邻的行。 firstsecond 版本之间的区别是“在文件末尾添加单词 the,在单词 sonic 之后”。要撤消该操作,Git 需要删除 文件末尾 处的单词 the,在单词 sonic 之后——但文件不会在那里结束。它现在继续包含单词hedgehog

    实际上,Git 不知道是删除最后一行 (hedgehog) 还是删除包含单词 the 的行。1 你可能认为这很明显,但 Git 只是不知道不知道怎么做。因此,它会因合并冲突而停止,并且 index暂存区 中可供您使用的文件的 三个 版本,加上一个 第四个版本在你的工作树中,用冲突标记标记。现在您的工作是生成冲突文件的正确版本。

    有很多方法可以做到这一点。我倾向于使用的一种方法是在我的编辑器中打开工作树文件,查找&lt;&lt;&lt;&lt;&lt;&lt;&lt; 行,然后观察这些行以找出正确的内容。 (我还将merge.conflictStyle 设置为diff3 以便在冲突区域中获得一个额外的部分,向我显示文件的base 版本中的内容以及两个冲突中的内容版本。不过,在这种情况下,它并没有真正的帮助。)

    将文件的工作树副本编辑为“正确答案”(无论是什么)后,我将其写出来并退出我的编辑器,然后在冲突文件上运行 git add。现在解决了冲突,使用我放入其中的内容,而不管之前放入的内容。

    如果这是最后一次冲突——在这种情况下就是这样——git revert --continue 将恢复恢复并继续执行您要求它恢复的任何其他提交(如果有的话)。既然没有更多的事情要做,那将完成还原,你就完成了。


    1从技术上讲,Git 试图合并两个更改,而不仅仅是删除一个更改。两者之一说删除the,另一个说添加hedgehog。两者都在文件末尾,Git 无法找出正确的答案。


    恢复HEAD^^ 失败的情况类似,但这次Git 要删除the 的行与Git 看到添加sonic 的行相邻。如果不同线之间有足够的间隙,问题就会消失。

    【讨论】:

    • 感谢您的帮助。我所做的是删除“the”行,因为它正在恢复“the”。现在我添加了文件并恢复了 --continue,一切顺利!
    猜你喜欢
    • 2017-12-26
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2011-07-14
    • 2019-11-27
    • 2021-01-11
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多