git revert
如何使用?
这可能听起来像是一个重复的问题,但当人们提出问题时,通常会根据Revert to a commit by a SHA hash in Git?使用git reset
然后当有人询问如何使用git reset
时,人们会回复说你应该按照Git - how to rollback使用git revert
在你知道它之前,有8个不同的人出现了他们独特的方法来保存OP的屁股,所有这些都超出了你的想法。
所以,让我们试着坚持使用简报并写一个假人指南给git revert
。
一个场景:你已经承诺了两次掌握和坏事。你已经推动了,其他人也做了不好的改变。
您要撤消它。这不是你自己可以在代码中手动撤销的东西,比如一些向导或包管理器在整个地方改变了大量的东西 - 你只是想把它全部放回原来的样子。
这就是源控制的全部内容。我很确定这很容易。
好的,你将使用git revert
但是如何使用?
运行git revert
之后你还需要做些什么吗?您是否必须提交已恢复的更改或确实还原直接提交到repo或什么?
显然你需要再次推动,并且可能会向团队宣布你的球。
答案 0 :(得分:55)
git revert
只是创建一个与现有提交相反的新提交。
它使文件处于相同的状态,就好像已经恢复的提交从未存在过一样。例如,请考虑以下简单示例:
$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
$ echo "bad update" > README.md
$ git commit -am "bad update"
[master a1b9870] bad update
1 file changed, 1 insertion(+), 1 deletion(-)
在此示例中,提交历史记录有两个提交,最后一个提交是错误的。使用git revert:
$ git revert HEAD
[master 1db4eeb] Revert "bad update"
1 file changed, 1 insertion(+), 1 deletion(-)
日志中将有3个提交:
$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit
所以发生的事情有一致的历史记录,但文件好像从未发生过错误的更新:
cat README.md
Initial text
在历史记录中,恢复提交的位置无关紧要(在上面的示例中,最后一次提交被还原 - 任何提交都可以恢复)。
之后你还要做别的事吗?
git revert
只是另一次提交,例如推送到远程,以便其他用户可以提取/获取/合并更改,您已完成。
您是否必须提交已还原的更改,或者是否直接提交到repo?
git revert
是一个提交 - 没有额外的步骤,假设恢复单个提交是你想要做的。
显然你需要再次推动,并可能向团队宣布。
确实 - 如果远程处于不稳定状态 - 与团队的其他人沟通他们需要提取以获得修复(恢复提交)将是正确的做法:)。
答案 1 :(得分:19)
像这样使用git revert:
git revert <insert bad commit hash here>
git revert
创建一个新的提交,其中包含已回滚的更改。 git reset
会删除您的git历史记录而不是进行新的提交。
之后的步骤与任何其他提交相同。
答案 2 :(得分:17)
reset
和revert
往往在同一个对话中出现的原因是因为不同的版本控制系统使用它们来表示不同的事情。
特别是,习惯于SVN或P4的人如果想要丢弃对文件的未提交更改,通常会在被告知他们确实需要revert
之前达到reset
。
类似地,其他VCS中的revert
等价物通常称为rollback
或类似的东西 - 但“回滚”也可以表示“我想完全丢弃最后几次提交”,这适用于reset
但不是revert
。因此,人们知道他们想要做什么会有很多困惑,但不清楚他们应该使用哪个命令。
至于你关于还原的实际问题......
好的,你将使用git revert但是如何?
git revert first-bad-commit..last-bad-commit
运行git revert之后你还需要做些什么吗?您是否必须提交已还原的更改,或者是否直接提交到repo或者什么?
默认情况下,git revert
会提示您输入提交消息,然后提交结果。这可以被覆盖。我引用the man page:
- 修改
使用此选项,git revert将允许您在提交还原之前编辑提交消息。如果从终端运行命令,则这是默认值。
- 没有提交
通常,该命令会自动创建一些提交日志消息的提交,说明哪些提交已被还原。此标志应用将命名提交还原到工作树和索引所需的更改,但不进行提交。此外,使用此选项时,索引不必与HEAD提交匹配。恢复是针对索引的开始状态完成的。
当将多个提交效果还原到连续的索引时,这很有用。
特别是,默认情况下,它会为您要还原的每个提交创建一个新提交。您可以使用revert --no-commit
创建还原所有更改的更改,而不将这些更改作为单独提交提交,然后在您闲暇时提交。
答案 3 :(得分:0)
我通过运行'git revert commit id'还原了一些提交,例如:
<div class="custom_select" id="main_dropdown_menu">
<select class="dropdown_list" name="list of majors" id="main_dropdown">
<option value="default" selected="selected" id="submenu">---</option>
<option value="arts">Arts</option>
<option value="business">Business</option>
<option value="engineering">Engineering</option>
<option value="health">Health</option>
<option value="humanities">Humanities</option>
<option value="natural sciences">Natural Sciences</option>
<option value="social sciences">Social Sciences</option>
</select>
</div>
然后,系统提示我提交还原(就像运行“ git commit”时一样)。我的默认终端程序是Vim,所以我运行了:
git revert b2cb7c248d416409f8eb42b561cbff91b0601712
最后,我使用以下命令将更改推送到存储库中:
:wq
答案 4 :(得分:0)
这个问题已经很老了,但是回复仍然使人们(像我这样)困惑
作为初学者,经过反复试验(错误比试验多),我有一个重要的观点:
git revert
需要您要删除的提交的ID ,并将其保存在历史记录中
git reset
需要您要保留的提交,并将从历史记录中删除所有内容。
也就是说,如果您将revert
与第一个提交ID一起使用,则会发现自己进入了一个空目录,并在历史记录中另外进行了一次提交,而重置后,您的目录将恢复到初始状态。提交,您的历史记录就好像最后一次提交从未发生过一样。
更清晰的记录如下:
# git log --oneline
cb76ee4 wrong
01b56c6 test
2e407ce first commit
使用git revert cb76ee4
将默认情况下将您的文件恢复为01b56c6,并将对历史记录进行进一步的提交:
8d4406b Revert "wrong"
cb76ee4 wrong
01b56c6 test
2e407ce first commit
git reset 01b56c6
会将文件重新带回01b56c6,并从历史记录中清除此后的其他任何提交:
01b56c6 test
2e407ce first commit
我知道这些是“基础”,但是这对我来说很混乱,因为我希望在第一个id(“首次提交”)上运行revert
,所以我希望找到我的初始文件,花了一段时间才能理解,如果您需要将文件作为“首次提交”回发,则需要使用下一个ID。