协慌网

登录 贡献 社区

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

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

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

从项目历史记录中的特定提交中获取仓库资源并忽略所有以后的更新的正确方法是什么?

答案

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 命令(重置,变基)来创建备份分支(在运行它们之前)时,它总是很不错的。最终,一旦您感到舒适,就不会觉得有必要。如果您确实以不需要的方式修改历史记录,并且还没有创建备份分支,请查看git reflog 。即使没有分支或标记指向它们,Git 也会使提交保持一段时间。

原始答案:

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

重命名当前的 master 分支:

git branch -m crazyexperiment

查看您的良好承诺:

git checkout c2e7af2b51

在这里建立新的 master 分支:

git checkout -b master

现在,如果您以后要查看它,您仍然可以进行疯狂的实验,但是您的 master 分支又回到了您的最后一个已知优点,可以添加到其中。如果您确实想放弃实验,可以使用:

git branch -D crazyexperiment

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

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