我正在尝试学习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无法通过反向应用解决问题。
发生冲突是因为您触摸了相邻的行。您的第一个版本与第二个版本的区别是“the
在文件末尾添加单词sonic
”。撤消,Git的需要删除的字the
在该文件的末尾,字后sonic
-但该文件并没有结束。现在继续包含单词hedgehog
。
实际上,Git不知道要删除最后一行(hedgehog
)还是包含单词的行the
。1您可能认为这很明显,但是Git只是不知道如何。因此,它会因合并冲突而终止,并在索引或暂存区域中为您提供文件的三个版本,再在工作树中提供带有冲突标记的第四个版本。现在,您的工作就是生成冲突文件的正确版本。
有很多方法可以做到这一点。我倾向于使用的一个方法是在编辑器中打开工作树文件,查找<<<<<<<
行,然后仔细查看行以找出正确的方法。(我还设置merge.conflictStyle
为diff3
在冲突区域中有一个额外的部分,向我展示了文件基本版本中的内容以及两个冲突版本中的内容。在这种情况下,它实际上并没有帮助,虽然。)
无论将文件的工作树副本编辑为“正确答案”(无论如何),我都将其写出并退出编辑器,然后git add
在有冲突的文件上运行。现在,无论以前发生什么冲突,都可以使用我投入的内容解决冲突。
如果这是最后一次冲突(在这种情况下将是这种情况),git revert --continue
将恢复还原并继续执行您要求还原的其他任何提交(如果有)。由于没有更多的事情要做,因此可以完成还原,您将全部完成。
1从技术上讲,Git试图合并两个更改,而不仅仅是删除一个更改。两个中的一个说删除the
,另一个说添加hedgehog
。两者都放在文件的末尾,Git无法找出正确的答案。
恢复失败的HEAD^^
情况类似,但是这次Git要删除the
的行与Git看到添加了的行邻接sonic
。如果变化的线之间有足够的间隙,问题就消失了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句