【问题标题】:How to revert pushed commits?如何恢复推送的提交?
【发布时间】:2017-10-23 19:24:48
【问题描述】:

我们想要撤消最后 2 次提交,它们都被推送到原始主机。在 tortoise git 中,我们可以查看历史记录,然后单击上次提交的第 3 次,然后选择“reset master to this”,我们猜测这意味着恢复到这个版本。

但是,当您选择此选项时,您必须从以下三个选项中进行选择:

  1. soft - 保持工作树和索引不变。
  2. 混合 - 保持工作树不变,重置索引
  3. 硬重置工作树和索引。

不幸的是,我们不知道应该选择这三个选项中的哪一个 - 我们只想撤消最后两个提交并及时返回。

下一个问题是这个操作是发生在远程源、你的 repo 还是你的工作目录,还是这三者的组合?例如。是否必须在还原后完成提交和推送,还是它会为您执行此操作?

我们会猜测 HARD 是我们想要的 - 它会将存储库(不确定是哪个)和我们的本地源代码恢复到以前的版本。如果是这种情况,为什么这不是默认设置,其他两个选项的用例是什么?无论您是否想恢复,如果您只恢复远程仓库,而不是本地工作文件,那么您将处于混乱状态。

我们没有任何本地修改的文件。

注意,我们非常渴望一个不会破坏 git 的解决方案(我们过去曾破坏过 git,不得不创建一个新的 repo)。也许另一种方法是可行的,例如签出以前的版本,然后在最新版本的顶部签入,但我们不知道该怎么做。

我们知道我们可以这样做:

git checkout [revision]

但是我们如何告诉 git 我们想要使这个版本成为新的头或者用这个替换头呢?我猜我们不能只是提交,因为没有什么可提交的,因为我们不再是大师。顺便说一句,如果您查看上一个。版本,然后修改它,然后提交,你要提交什么以及提交到哪里?

我已阅读https://www.atlassian.com/git/tutorials/undoing-changes,但它没有解决本地和远程存储库之间的关系。如果要撤消的提交全部推送到远程源主机,则不清楚恢复远程源、本地 repo 和工作目录的方法是什么——所有 3 个必须恢复到 3 次提交之前的提交。我们并不关心这是通过重置还是还原来完成 - 我们只需要一种适用于所有 3 个位置的方法即可。

正确的接收者可能是这样的:

   git status (we are on master with a clean working dir)
   git git revert HEAD~2
   git commit -m "revert"
   git push origin mater

但我们在示例中从未见过这组步骤,如果可能的话,宁愿用乌龟 git 来做。

【问题讨论】:

    标签: git tortoisegit


    【解决方案1】:

    有两种方法可以做到这一点。

    1. 您可以删除所有内容并恢复到适合您的旧状态。
    2. 还原您所做的更改。

    对于第一种解决方案,您可以使用以下命令:

    git reset --hard <commit-id>
    

    这将把你当前所在分支的负责人带到那个特定的“commit-id”,这对你来说是正确和正确的。

    git push -f origin <branch-name>
    

    此命令将强制推送到您所在的分支。此命令和上述命令的组合可以使您从最顶部开始删除分支中所有不必要的提交,直到这个“commit-id "

    注意:这不会删除“commit-id”,直到“commit-id”从您的分支中删除。

    对于第二种解决方案,您可以使用以下命令:

    git revert <commit-id>
    

    此命令用于恢复您尝试撤消的特定“commit-id”。

    如果您错误地将另一个分支合并到不同的分支中,那么您可以使用此命令恢复合并请求:

    git revert -m 2 <commit-id>
    

    此命令用于恢复或删除合并提交“commit-id”中发生的所有更改。这将允许还原合并提交“commit-id”,还将删除此合并附带的所有提交更改。但它不会删除合并附带的提交

    【讨论】:

      【解决方案2】:

      这个解决方案节省了我的时间

      1) git reset --hard 93827927ed6e245be27f94c93c7e3574e85b91c6(这是你的提交 ID)
      2) git reset HEAD~1
      3) git stash
      4) 混帐添加。
      5) git commit -m "你的新提交信息"
      6) git push --force

      【讨论】:

        【解决方案3】:

        有两种选择:

        1. 回到历史,但保留历史:revert
        2. 返回历史并更改历史,因此提交的内容将被永远删除:reset --hardpush --force

        如果您不确定,请使用revert,这是最安全的选择。

        如果您真的非常喜欢删除提交并且不关心更改的历史记录,请使用reset --hardpush --force。这会产生以下后果:

        • 其他人可以重新引入提交
        • 其他可能取决于已删除的提交
        • 在公共存储库中,强制推送到主存储库是不行的

        问题

        下一个问题是这个操作是发生在远程源、你的 repo 还是你的工作目录,还是这三者的组合?例如。是否必须在还原后执行提交和推送,还是为您执行此操作?

        一般来说,TortioseGit 中的所有更改都在您的克隆(“工作副本”)中。推送也始终是手动操作

        我们会猜测 HARD 是我们想要的 - 它会将存储库(不确定是哪个)和我们的本地源代码恢复到以前的版本。如果是这种情况,为什么这不是默认设置,其他两个选项的用例是什么?

        因为hard 删除了提交和历史记录,所以这是一个危险的操作。您也可以删除其他人的更改!

        其他两个选项的用例是什么?

        What's the difference between git reset --mixed, --soft, and --hard?

        TortoiseGit 中的步骤:

        还原

        1. 恢复提交(从日志)

        1. 提交更改

        2. 并推送

        重设硬推

        1. 重置(从日志)

        1. 努力选择

        1. 强制推送(复选框“已知更改”)

        【讨论】:

          【解决方案4】:

          我认为您对还原和重置感到困惑,请参阅Undoing Changes

          还原

          git revert 命令撤消已提交的快照。但是,而不是 从项目历史中删除提交,它会弄清楚如何 撤消提交引入的更改并附加新的提交 与结果内容。这可以防止 Git 丢失历史记录, 这对于您的修订历史的完整性和 可靠的协作。

          重置

          如果 git revert 是撤消更改的“安全”方式,您可以考虑 git 重置为危险的方法。当您使用 git reset 撤消时(以及 提交不再被任何 ref 或 reflog 引用),有 无法检索原始副本 - 这是永久撤消。关心必须 使用此工具时应注意,因为它是唯一的 Git 命令之一 这有可能会丢失您的工作。

          在你的情况下最好使用 revert:

          在这种情况下,您只需创建新的提交,它会恢复特定的提交,不会更改历史记录。你可以在本地做,然后推送到远程。

          如果您仍想进行重置并且不需要保留本地更改,请进行硬重置:

          然后你应该强制推送:

          git push -f
          

          【讨论】:

          • 感谢您的澄清。不幸的是,乌龟 git 中的“Revert..”选项会显示一个带有 emtp 列表“文件列表是 emtpy”的对话框,因此没有返回选项。请注意,更改已经推送到原点。
          • @JohnLittle,我确实还原了很多次,并且不记得任何带有空列表的对话框
          • 啊,我明白了——你右键单击日志历史记录中的修订,我右键单击项目根文件夹。好的,如果我选择“通过此提交还原更改”并且我选择了 3 个提交前的提交,它会还原最后 3 个,还是仅还原那个特定的一个?当我选择说最后一次提交的第三个时,它显示“修订已恢复。所有更改现在都集成到您的工作树中”,以及两个按钮“确定”和“提交”。我应该选择哪个 - 有什么区别?一旦我这样做了,接下来呢?我需要推送到原始主机,还是完成了?
          • 好的,我试了一下,选择了“提交”。然后我推了。不幸的是,它似乎只恢复了一个提交,而不是最后一个 X,所以现在我的情况比以前更糟。这就是我担心的问题,我越是尝试在没有完整配方的情况下修复它,情况就越糟糕。
          • 如果你选择一个,它只会恢复一个,但你可以选择几个。是的,你需要提交和推送。
          猜你喜欢
          • 2022-06-14
          • 2013-02-22
          • 2021-04-15
          • 2019-05-01
          • 2014-09-07
          • 2012-05-07
          • 2018-03-29
          相关资源
          最近更新 更多