我克隆了一个Git存储库,然后在开发过程的早期尝试将其回滚到特定的提交。在此之后添加到存储库中的所有内容对我来说都不重要,因此我希望从本地源代码中省略所有后续更改。
然而,当我尝试在GUI工具中回滚时,它不会更新我的本地文件系统——我总是以项目的最新源代码结尾。
在项目历史记录中的某个特定提交时,获取存储库的源代码并忽略所有后续更新的正确方法是什么?
我克隆了一个Git存储库,然后在开发过程的早期尝试将其回滚到特定的提交。在此之后添加到存储库中的所有内容对我来说都不重要,因此我希望从本地源代码中省略所有后续更改。
然而,当我尝试在GUI工具中回滚时,它不会更新我的本地文件系统——我总是以项目的最新源代码结尾。
在项目历史记录中的某个特定提交时,获取存储库的源代码并忽略所有后续更新的正确方法是什么?
当前回答
更新:
由于跟踪分支的创建和推送方式发生了变化,我不再建议重命名分支。这是我现在的建议:
在当前状态下复制分支:
git branch crazyexperiment
(gitbranch<name>命令将使您的当前分支仍处于签出状态。)
使用git Reset将当前分支重置为所需的提交:
git reset --hard c2e7af2b51
(将c2e7af2b51替换为要返回的提交。)
当你决定你的疯狂实验分支不包含任何有用的内容时,你可以删除它:
git branch -D crazyexperiment
当您开始使用历史修改git命令(reset、rebase)来创建备份分支,然后再运行它们时,这总是很好的。最终,一旦你感到舒适,你就不会觉得有必要了。如果您确实以不希望的方式修改了历史记录,并且还没有创建备份分支,请查看gitreflog。即使没有分支或标记指向Git,Git也会在相当长的一段时间内保持提交。
原答覆:
与git重置相比,一种稍微不那么可怕的方法是创建一个新的分支。假设您在主分支上,您要返回的提交是c2e7af2b51。
重命名当前主分支:
git branch -m crazyexperiment
检查您的良好承诺:
git checkout c2e7af2b51
在此处创建新的主分支:
git checkout -b master
现在,如果你想稍后再看,你仍然有疯狂的实验,但你的主分支已经回到了你最后一个已知的好点,准备添加到。如果你真的想放弃你的实验,你可以使用:
git branch -D crazyexperiment
其他回答
更新:
由于跟踪分支的创建和推送方式发生了变化,我不再建议重命名分支。这是我现在的建议:
在当前状态下复制分支:
git branch crazyexperiment
(gitbranch<name>命令将使您的当前分支仍处于签出状态。)
使用git Reset将当前分支重置为所需的提交:
git reset --hard c2e7af2b51
(将c2e7af2b51替换为要返回的提交。)
当你决定你的疯狂实验分支不包含任何有用的内容时,你可以删除它:
git branch -D crazyexperiment
当您开始使用历史修改git命令(reset、rebase)来创建备份分支,然后再运行它们时,这总是很好的。最终,一旦你感到舒适,你就不会觉得有必要了。如果您确实以不希望的方式修改了历史记录,并且还没有创建备份分支,请查看gitreflog。即使没有分支或标记指向Git,Git也会在相当长的一段时间内保持提交。
原答覆:
与git重置相比,一种稍微不那么可怕的方法是创建一个新的分支。假设您在主分支上,您要返回的提交是c2e7af2b51。
重命名当前主分支:
git branch -m crazyexperiment
检查您的良好承诺:
git checkout c2e7af2b51
在此处创建新的主分支:
git checkout -b master
现在,如果你想稍后再看,你仍然有疯狂的实验,但你的主分支已经回到了你最后一个已知的好点,准备添加到。如果你真的想放弃你的实验,你可以使用:
git branch -D crazyexperiment
当你说“GUI工具”时,我假设你使用的是Git For Windows。
重要的是,如果您还没有这样做,我强烈建议您创建一个新的分支。这样,你的主人可以在你测试你的变化时保持不变。
使用GUI,您需要像查看视图右侧的历史一样“回滚此提交”。然后,您会注意到左侧有所有不需要的文件作为要提交的更改。现在,您需要右键单击所有未提交文件上方的灰色标题,然后选择“忽略更改”。这将使您的文件恢复到此版本中的状态。
对于使用git-gui的用户,也可以使用gitk。
右键单击要返回的提交,然后选择“将主分支重置为此处”。然后从下一菜单中选择“硬”。
git reset --hard <tag/branch/commit id>
笔记:
不带--hard选项的gitreset会重置提交历史,但不会重置文件。使用--hard选项,工作树中的文件也会被重置。(信用用户)如果您希望提交该状态,以便远程存储库也指向回滚的提交do:git push<reponame>-f(信用用户)