我对 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 的工作方式感到困惑的主要内容,如果未能解决你的问题,请参考以下文章