回滚到某个特定的提交(commit)

312

如何将本地副本中所有文件还原到特定的提交版本?

commit 4a155e5b3b4548f5f8139b5210b9bb477fa549de
Author: John Doe <Doe.John.10@gmail.com>
Date:   Thu Jul 21 20:51:38 2011 -0500

这是我想要回退到的提交记录。任何帮助都将救命!


@WilliamPursell - 你为什么删除了你的答案?你的答案似乎是最明智的。在还原之后,OP可以提交和推送(也就是说,他有一个可用的存储库)。下面所有的答案都将存储库置于无法执行任何有用操作的状态。 - jww
3个回答

477

git reset --hard 4a155e5会将HEAD指针重置到指定位置。如果你不想让任何其他引用指向你刚刚删除的历史记录,可能需要删除该时间之前的其他引用。


2
@jww 这个问题是“如何回滚到某个提交”,这个答案为什么是错误的? - Andy
23
在你遵循建议后,不能提交和推送。如果坏的提交被撤销后,一个无法使用的仓库有何用处? - jww
3
你假设用户有一个远程仓库正在跟踪,并且他们已经将错误提交推送到该仓库。 - Andy
2
因为OP明确表示“revert back to”,而在git中,revert具有特定的含义;重置可能会在推送时破坏历史记录,而还原则不会。因此进行了下投票。 - piersb
14
在本地使用 'git reset --hard <hash>' 后,如果你尝试将最新更改提交到远程分支,很可能会收到一个错误提示,指示“您的分支落后于 origin”。当出现这种情况时,你需要使用 f 标记强制推送,即 'git push -f'。 - JavaGeek
显示剩余5条评论

63
你可以通过输入以下命令来还原你工作目录和索引下的所有文件。
git reset --hard <SHAsum of your commit>
你也可以直接输入。
git reset --hard HEAD #your current head point
或者
git reset --hard HEAD^ #your previous head point
希望能帮到你。

2
"revert" 不是正确的命令。 "revert" 应用于撤消先前提交的新提交。 它不需要使用 --hard 选项。 - CB Bailey
@Charles:为什么不正确?它确实采用了--hard选项。 - TheOneTeam
5
阅读文档,revert可以撤销单个提交引入的更改,但它不能将索引和工作树重置到特定提交,这正是提问者想要的。这就是reset所做的。 reset有一个--hard选项。 - CB Bailey
又是一个错误的Stack Overflow答案...你不能提交这些更改。请参见在回到存储库中的特定修订版本后提交和推送更改? - jww
2
这是一个非常糟糕的方法。我刚刚丢失了所有最近的提交! - Mehdi Haghgoo

46

git reset --hard 更安全,而后者更干净。 - DawnSong
git revert 对于合并操作无效。 - Stepan Yakovenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接