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

699 git

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

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

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

kau*_*ppi 1091

git reset --hard <tag/branch/commit id>
Run Code Online (Sandbox Code Playgroud)

笔记:

  • git reset如果没有该--hard选项,则重置提交历史记录,但不重置文件.使用该--hard选项,还可以重置工作树中的文件.(贷方用户)

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

  • @peterk在你的git push命令结束时尝试`--force` (10认同)
  • 确保您也指定了分支名称. (6认同)
  • @MariuszNowak做了git reset --hard <commit-id>,(2回)当做"git push -f origin master"我得到"远程:错误:拒绝非快进refs/heads/master(你应该先拉)"这是我的回购,我想把它拿回来:) (3认同)
  • 在服务器端,如果允许使用--force进行非快进推送,则存储库有一个配置选项.man git-config并检查.git/config for denyNonFastForwards = true在存储库中. (2认同)
  • 对我来说,第二个选项没有运行:我必须执行`git push -f <remoterepo> master`来恢复远程存储库.但是,请注意,使用`-f`开关,恢复提交后的提交在远程仓库上也是***LOST***!(这是我想要的,但其他人可能希望保留历史). (2认同)

Nea*_*all 390

更新:

由于更改跟踪分支的创建和推送方式,我不再建议重命名分支.这就是我现在推荐的:

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

git branch crazyexperiment
Run Code Online (Sandbox Code Playgroud)

(该git branch <name>命令将使您仍然检查当前分支.)

使用以下命令将当前分支重置为所需的提交git reset:

git reset --hard c2e7af2b51
Run Code Online (Sandbox Code Playgroud)

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

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

git branch -D crazyexperiment
Run Code Online (Sandbox Code Playgroud)

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

原始答案:

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

重命名当前的主分支:

git branch -m crazyexperiment
Run Code Online (Sandbox Code Playgroud)

看看你的好承诺:

git checkout c2e7af2b51
Run Code Online (Sandbox Code Playgroud)

在这里建立你的新主分支:

git checkout -b master
Run Code Online (Sandbox Code Playgroud)

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

git branch -D crazyexperiment
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 - 可能不是海报所要求的,但更不用说让我感到焦虑了. (31认同)
  • 处理远程存储库(例如Github)时,你可能不得不做一个'git push -f origin master',因为非快速使master看起来像在指定的提交时那样,但这种方法更清洁比重置. (9认同)
  • kauppi - 你不会有问题推回到远程回购? (3认同)
  • 我在"我如何解决所有问题"主持人的舞会上跳舞. (3认同)
  • 糟糕,应该是`git branch --set-upstream master <remote>/<branch>`和`git branch --set-upstream crazyexperiment <remote>/<branch> (2认同)

Reg*_*ieB 13

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

右键单击要返回的提交,然后选择"将master branch重置为here".然后从下一个菜单中选择硬盘.