我想弄清楚git reset
,git revert
和git 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 HEAD~2
,本地文件将返回到提交#1的状态,如果我结帐到之前的HEAD,则不会改变任何内容。
git reset HEAD~2 --hard
这会改变提交历史和本地文件,完全回到提交#1的状态。虽然--mixed
会更改提交历史记录和暂存快照,但--soft
只会更改提交历史记录。
当我执行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个问题:
git revert
到底在做什么?它只是比较当前状态和指定提交状态之间的差异,然后标记冲突吗?非常感谢!
答案 0 :(得分:0)
Revert正在尝试删除对修订版HEAD~2执行的更改,并且像应用任何修补程序一样,它可能会产生冲突。使用无冲突的保证结果还原的唯一修订将是HEAD(如果它不是合并提交),但其他修订可能会产生冲突(如果他们搞砸了你想要恢复的修改后的修改后的代码。如果涉及的代码从那以后没有被触及,那么它可能会被彻底恢复)。完成还原后,将创建一个新的修订版本(与结帐和重置不同)。
答案 1 :(得分:0)
因此,reset --hard X
表示&#34;将我的HEAD,索引和工作树移动到X
状态(如果适用,还有当前分支引用),X
在git revert X
中,不是一个要返回其状态的提交;它的提交应该是&#34;撤消&#34;。
换句话说,git revert HEAD~2
表示&#34;创建一个与HEAD~2
所做的相反的补丁,然后在HEAD
附加一个新的提交。
在您的情况下,HEAD~2
将一些代码添加到file1的第二行,因此修补程序将删除该代码。但git注意到其他代码&#34;太靠近以至于舒适&#34;自HEAD~2
发生以来,该行已发生变化,因此称之为冲突。