【问题标题】:How do you roll back (reset) a Git repository to a particular commit? [duplicate]如何将 Git 存储库回滚(重置)到特定的提交? [复制]
【发布时间】:2010-12-09 16:08:09
【问题描述】:

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

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

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

【问题讨论】:

  • git reset --hard aabb3434 / git push origin branch --force

标签: git


【解决方案1】:
git reset --hard <tag/branch/commit id>

注意事项:

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

  • 如果您希望提交该状态,以便远程存储库也指向回滚提交,请执行以下操作:git push &lt;reponame&gt; -f (credited user)

【讨论】:

  • @MariuszNowak 在执行 git reset --hard 后,( 2 back ) 执行“git push -f origin master”时我得到“远程:错误:拒绝非快进refs/heads/master(你应该先拉)”这是我的回购,我想把它拿回来:)
  • @peterk 在你的 git push 命令末尾尝试--force
  • 确保您也指定了分支名称。
  • 如果使用 --force 允许非快进推送,则在服务器端有一个存储库配置选项。 man git-config 并检查 .git/config 在存储库中是否有 denyNonFastForwards = true。
  • 我的第二个选项没有运行:我也必须执行git push -f &lt;remoterepo&gt; master 才能恢复远程存储库。但是,请注意,使用-f 开关,恢复提交后的提交也将在远程仓库中LOST! (这是我想要的,但其他人可能希望保留历史)。
【解决方案2】:

更新:

由于跟踪分支的创建和推送方式发生了变化,我不再建议重命名分支。这是我现在推荐的:

复制当前状态的分支:

git branch crazyexperiment

git branch &lt;name&gt; 命令将使您的当前分支仍处于签出状态。)

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

git reset --hard c2e7af2b51

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

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

git branch -D crazyexperiment

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

原答案:

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

重命名您当前的主分支:

git branch -m crazyexperiment

检查你的好提交:

git checkout c2e7af2b51

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

git checkout -b master

现在,如果您想稍后查看它,您仍然可以进行疯狂的实验,但是您的 master 分支又回到了您最后一个已知的好点,可以添加。如果你真的想扔掉你的实验,你可以使用:

git branch -D crazyexperiment

【讨论】:

  • 谢谢 - 可能不是发帖人所要求的,但对我来说更不会引起焦虑。
  • 处理远程存储库(例如 Github),您可能必须执行 'git push -f origin master' 因为非快进才能让 master 看起来像在指定位置提交,但这种方法比重置更干净。
  • kauppi - 你不会在推回远程仓库时遇到问题吗?
  • 我在“如何解决所有问题”的椅子上跳舞。
  • 糟糕,应该是git branch --set-upstream master &lt;remote&gt;/&lt;branch&gt;git branch --set-upstream crazyexperiment &lt;remote&gt;/&lt;branch&gt;
【解决方案3】:

对于那些有 git gui 倾向的人,你也可以使用 gitk。

右键单击您要返回的提交并选择“将主分支重置到此处”。然后从下一个菜单中选择hard。

【讨论】:

  • 当服务器(存储)不允许强制推送时没有工作人员。无法重置。
【解决方案4】:

当您说“GUI 工具”时,我假设您使用的是 Git For Windows。

重要,我强烈建议您创建一个新分支来执行此操作(如果您还没有的话)。这样,您的 master 在您测试更改时可以保持不变。

使用 GUI,您需要像使用视图右侧的历史记录一样“回滚此提交”。然后你会注意到你有所有不需要的文件作为左侧提交的更改。 现在您需要右键单击所有未提交文件上方的灰色标题,然后选择“忽略更改”。这会将您的文件设置回此版本中的状态。

【讨论】:

    猜你喜欢
    • 2011-05-21
    • 1970-01-01
    • 2014-04-23
    • 2018-04-05
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 2011-05-06
    相关资源
    最近更新 更多