我对 git revert 的工作方式感到困惑

Posted

技术标签:

【中文标题】我对 git revert 的工作方式感到困惑【英文标题】:I am confused about how git revert works 【发布时间】:2019-08-31 15:02:19 【问题描述】:

我想知道发生了什么。我创建了一个 html 文件并在其中放入了一些行

this is first line
this is second line
this is third line
this is fourth line

并在每行之后分别提交,如提交 a、提交 b、提交 c、提交 d。

现在我执行了一个还原到提交 c,但它抛出了一个错误:

could not revert 82b69e5... c

hint: after resolving the conflicts, mark the corrected paths <br>
hint: with 'git add <paths>' or 'git rm <paths>' <br>
hint: and commit the result with 'git commit'<br>

我想知道 git-revert 是如何工作的。我知道类似“撤消提交并添加新提交”之类的东西,但不知道如何成功使用它。

【问题讨论】:

我很确定 Stack Overflow 上的重复项已经回答了这个问题。 喜欢回答 here, git revert 通过进行另一个删除这些更改的提交来“撤消”一个提交引入的更改。如果原始提交添加了一行,则还原提交将删除该行。如果原始提交删除了一行,则还原提交会将其放回原处。如果原始提交更改了一行,则还原将尝试撤消这些更改。 您收到错误消息的原因是因为冲突,c 提交引入的更改与其他提交中引入的更改过于接近,因此 git 通过要求您“解决冲突”,本质上是找出正确的结果应该是什么。 @LasseVågsætherKarlsen 你的建议对我有用,可能我没有留下太多空间。 【参考方案1】:

它会为您要还原的提交创建一个反转补丁,因此在您的情况下,提交 c 看起来像:

 this is first line
 this is second line
+this is third line
# End of file

然后,您从d 运行git revert c,因此它会尝试创建以下内容并将其应用到您的树上:

 this is first line
 this is second line
-this is third line
# End of file

但是,您的文件如下所示:

this is first line
this is second line
this is third line
this is fourth line
# End of file

所以创建的补丁不适用(文件结尾与第四行冲突)。所以当 Git 告诉你:

could not revert 82b69e5... c
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ' or 'git rm '
hint: and commit the result with 'git commit'

它的意思是“我试图按照你的要求去做,但我遇到了一个我无法解决的案子”,所以你需要:

解决冲突,使用How to resolve merge conflicts in Git 或使用git revert --quit 取消还原

您的解决方案很可能是:

this is first line
this is second line
this is fourth line

【讨论】:

发生冲突本身不是问题。当两个变化发生在一个共同的地方时,这是一件非常正常的事情。这是否回答了您对回答 git revert 工作方式的疑问? 是的,我在解决合并冲突时遇到了困难。我纠正了冲突,然后我使用了 git revert --continue。它解决了我的问题【参考方案2】:

git revert 命令可以被认为是一个'undo'类型的命令,但是它不是传统的undo操作。

本质上,它会撤消在指定提交中完成的所有内容,然后在该过程中创建一个新提交。您可以查看this了解更多信息。

关于您的问题,您遇到了合并冲突。要解决这些冲突,您可以使用 git mergetools(例如 Meld)。

【讨论】:

以上是关于我对 git revert 的工作方式感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

我对 COM 和跨平台兼容性感到困惑 [关闭]

对 JSONP 请求的工作方式感到困惑

对删除分配给结构数组的动态内存感到困惑

对约洛感到困惑

对标志在makefile中的工作方式感到困惑

对 struct 在这段代码中的工作方式感到困惑