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

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

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

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

764585 次浏览
git reset --hard <tag/branch/commit id>

备注:

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

  • 如果您希望提交该状态,以便远程存储库也指向回滚提交,请执行:git push <reponame> -f记入用户

更新时间:

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

复制分支的当前状态:

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

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

右键单击要返回的提交并选择“将主分支重置到此处”。然后从下一个菜单中选择硬。

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

重要的是,如果你还没有这样做,我强烈建议你创建一个新的分支。这样你的主人就可以在你测试你的变化时保持不变。

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