我克隆了一个Git存储库,然后尝试在开发过程的早期将其回滚到特定的提交。在该点之后添加到存储库的所有内容对我来说都不重要,因此我想省略本地源代码中的所有后续更改。
但是,当我尝试回滚GUI工具时,它不会更新我的本地文件系统 - 我总是最终得到项目的最新源代码。
从项目历史中的特定提交中获取存储库的源代码的正确方法是什么,并省略所有以后的更新?
答案 0 :(得分:1057)
git reset --hard <tag/branch/commit id>
<强> 注意: 强>
git reset
选项的 --hard
会重置提交历史记录,但不会重置文件。使用--hard
选项,工作树中的文件也会重置。 (credited user)
如果您希望提交该状态,以便远程存储库也指向回滚提交,请执行以下操作:git push <reponame> -f
(credited user)
答案 1 :(得分:385)
由于跟踪分支的创建和推送方式发生了变化,我不再建议重命名分支。这就是我现在推荐的:
以当前状态制作分支的副本:
git branch crazyexperiment
(git branch <name>
命令将让您仍然检查当前分支。)
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,您需要“回滚此提交”,就像您拥有视图右侧的历史记录一样。然后您会注意到您将所有不需要的文件作为左侧提交的更改。 现在,您需要右键单击所有未提交文件上方的灰色标题,然后选择“忽略更改”。这会将您的文件设置回这个版本中的文件。