git revert究竟是什么?

时间:2017-06-02 15:00:24

标签: git github version-control git-revert

我想弄清楚git resetgit revertgit checkout之间的区别。关于git revert有一些我无法理解的东西。

我创建了一个简单的应用并触摸了2个文件: file1.html.erb file2.html.erb ,然后我创建了4个提交:

提交#1:在 file1.html.erb 的第一行添加一些代码 提交#2:在 file1.html.erb 的第二行添加一些代码 提交#3:在 file1.html.erb 的第三行添加一些代码 提交#4:在​​ file1.html.erb file2.html.erb

的第四行添加一些代码

基于上述案例:

git checkout

如果我执行git checkout HEAD~2,本地文件将返回到提交#1的状态,如果我结帐到之前的HEAD,则不会改变任何内容。

git resert --hard

git reset HEAD~2 --hard这会改变提交历史和本地文件,完全回到提交#1的状态。虽然--mixed会更改提交历史记录和暂存快照,但--soft只会更改提交历史记录。

git revert

当我执行git revert HEAD~2时,终端返回了这个:

caven@CavendeMacBook-Pro ⮀ ~/demo/demo ⮀ ⭠ branch01 ⮀ git revert HEAD~2 error: could not revert ed3279f... commit 2 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' ✘ caven@CavendeMacBook-Pro ⮀ ~/demo/demo ⮀ ⭠ branch01± ⮀

在file1.html.erb中,git将代码标记为:

I add this line at first commit.
<<<<<<< HEAD
I add this line at second commit.
I add this line at third commit.
Simultaneously, I add this line and some code in file2 at fourth commit.
=======
>>>>>>>    parent of ed3279f... commit 2

但是在file2.html.erb中,没有任何改变,我在第四次提交时添加的代码仍然存在,git没有标记任何冲突。

这使我感到困惑,git docs说“给定一个或多个现有提交,还原相关补丁引入的更改,并记录一些记录它们的新提交。”

我有3个问题:

  1. 在这种情况下,git revert到底在做什么?它只是比较当前状态和指定提交状态之间的差异,然后标记冲突吗?
  2. 我没有指定任何文件,为什么git只标记了file1中的冲突,那么file2呢? git将如何处理它?<​​/ li>
  3. 下一步该怎么办?我应该删除confilct代码并创建一个新的提交吗?或者我应该做什么?
  4. 非常感谢!

2 个答案:

答案 0 :(得分:0)

Revert正在尝试删除对修订版HEAD~2执行的更改,并且像应用任何修补程序一样,它可能会产生冲突。使用无冲突保证结果还原的唯一修订将是HEAD(如果它不是合并提交),但其他修订可能会产生冲突(如果他们搞砸了你想要恢复的修改后的修改后的代码。如果涉及的代码从那以后没有被触及,那么它可能会被彻底恢复)。完成还原后,将创建一个新的修订版本(与结帐和重置不同)。

答案 1 :(得分:0)

因此,reset --hard X表示&#34;将我的HEAD,索引和工作树移动到X状态(如果适用,还有当前分支引用),Xgit revert X中,是一个要返回其状态的提交;它的提交应该是&#34;撤消&#34;。

换句话说,git revert HEAD~2表示&#34;创建一个与HEAD~2所做的相反的补丁,然后在HEAD附加一个新的提交。

在您的情况下,HEAD~2将一些代码添加到file1的第二行,因此修补程序将删除该代码。但git注意到其他代码&#34;太靠近以至于舒适&#34;自HEAD~2发生以来,该行已发生变化,因此称之为冲突。