我克隆了一个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(信用用户)