如何将Git存储库回滚(重置)到特定的提交?

时间:2009-10-24 04:22:27

标签: git

我克隆了一个Git存储库,然后尝试在开发过程的早期将其回滚到特定的提交。在该点之后添加到存储库的所有内容对我来说都不重要,因此我想省略本地源代码中的所有后续更改。

但是,当我尝试回滚GUI工具时,它不会更新我的本地文件系统 - 我总是最终得到项目的最新源代码。

从项目历史中的特定提交中获取存储库的源代码的正确方法是什么,并省略所有以后的更新?

4 个答案:

答案 0 :(得分:1057)

git reset --hard <tag/branch/commit id>

<强> 注意:

    没有git reset选项的
  • --hard会重置提交历史记录,但不会重置文件。使用--hard选项,工作树中的文件也会重置。 (credited user

  • 如果您希望提交该状态,以便远程存储库也指向回滚提交,请执行以下操作:git push <reponame> -fcredited user

答案 1 :(得分:385)

更新

由于跟踪分支的创建和推送方式发生了变化,我不再建议重命名分支。这就是我现在推荐的:

以当前状态制作分支的副本:

git branch crazyexperiment

git branch <name>命令将让您仍然检查当前分支。)

使用git reset

将当前分支重置为所需的提交
git reset --hard c2e7af2b51

(将c2e7af2b51替换为您要返回的提交。)

当您确定您的疯狂实验分支不包含任何有用的内容时,您可以使用以下命令将其删除:

git branch -D crazyexperiment

当您开始使用历史记录修改git命令(重置,rebase)以在运行之前创建备份分支时,总是很好。最后一旦你感到舒服,你就不会觉得有必要。如果您确实以您不想要的方式修改历史记录并且尚未创建备份分支,请查看git reflog。即使没有指向它们的分支或标签,Git仍会保持一段时间的提交。

原始答案:

git reset --hard方法稍微不那么可怕的方法是创建一个新分支。假设您在master分支上,并且您想要返回的提交是c2e7af2b51

重命名您当前的主分支:

git branch -m crazyexperiment

检查你的好提交:

git checkout c2e7af2b51

在这里建立新的主分支:

git checkout -b master

现在,如果您想稍后查看它,您仍然可以进行疯狂的实验,但是您的主分支又回到了您最后已知的优点,准备添加到。如果您真的想丢弃实验,可以使用:

git branch -D crazyexperiment

答案 2 :(得分:13)

对于那些有git gui弯曲的人,你也可以使用gitk。

右键单击要返回的提交,然后选择“将master branch重置为此处”。然后从下一个菜单中选择硬盘。

答案 3 :(得分:1)

当你说'GUI工具'时,我假设你正在使用Git For Windows。

重要提示,如果您还没有,我强烈建议您创建一个新分支。这样,在测试更改时,您的主人可以保持不变。

使用GUI,您需要“回滚此提交”,就像您拥有视图右侧的历史记录一样。然后您会注意到您将所有不需要的文件作为左侧提交的更改。 现在,您需要右键单击所有未提交文件上方的灰色标题,然后选择“忽略更改”。这会将您的文件设置回这个版本中的文件。