你如何回滚(重置)Git仓库到特定的提交?

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

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

什么是正确的方式来获取作为一个特定的提交在项目的历史中的存储库的来源,并忽略所有以后的更新?

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

笔记:

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

  • 如果你想提交这个状态,以便远程仓库也指向回滚提交做: git push <reponame> -f ( credited user )

更新:

由于更改跟踪分支的创build和推送,我不再推荐重命名分支。 这是我现在推荐的:

以当前状态复制分支:

 git branch crazyexperiment 

git branch <name>命令会让你的当前分支仍然被检出。)

重置你的当前分支到你想要的提交git reset

 git reset --hard c2e7af2b51 

(将c2e7af2b51replace为您想要返回的提交。)

当你决定你疯狂的实验分支没有包含任何有用的东西时,你可以用下面的方法删除它:

 git branch -D crazyexperiment 

当你开始使用历史修改的git命令(重置,重新绑定)来创build备份分支,然后再运行它们总是很好。 最后,一旦你感到舒服,就不会觉得有必要。 如果你以一种你不想要的方式来修改你的历史logging,并且没有创build一个备份分支,请查看git reflog 。 即使没有指向它们的分支或标签,Git也会持续提交很长一段时间。

原始答案:

做一个比git reset --hard方法稍微可怕的方法是创build一个新的分支。 假设你在master分支上,你想返回的提交是c2e7af2b51

重命名你当前的主分支:

 git branch -m crazyexperiment 

检查你的好提交:

 git checkout c2e7af2b51 

让你的新主分支在这里:

 git checkout -b master 

现在,如果你想稍后再看,你仍然有疯狂的尝试,但是你的主分支已经回到你最后一个已知的好点了,准备join。 如果你真的想扔掉你的实验,你可以使用:

 git branch -D crazyexperiment 

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

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

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

重要的是,我强烈build议创build一个新的分支来做到这一点,如果你还没有。 这样,当你testing你的变化时,你的主人可以保持不变。

使用GUI,您需要像回顾视图右侧的历史一样,“回滚此提交”。 然后你会发现你有所有不需要的文件作为左侧提交的变化。 现在,您需要右键点击所有未被取消的文件上方的灰色标题,然后select“无视更改”。 这将设置您的文件回到他们在这个版本。