如何恢复推送提交?

时间:2017-10-23 19:24:48

标签: git tortoisegit

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

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

  1. soft - 保持工作树和索引不变。
  2. 混合 - 保持工作树不变,重置索引
  3. 硬 - 重置工作树和索引。
  4. 不幸的是,我们不知道应该选择哪三个选项中的哪一个 - 我们只想撤消最后两次提交并回到过去。

    接下来的问题是这个操作是在远程原点,您的仓库或工作目录上发生的,还是这三个的组合?例如。在还原之后是否必须完成提交和推送,或者它是否为您执行此操作?

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

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

    请注意,我们非常渴望一个不会破坏git的解决方案(我们过去已经破坏了git并且不得不让新的repo变得疯狂)。也许是另一种可能的方法,例如签出一个流行的版本,然后在最新版本的顶部检查它,但我们不知道如何做到这一点。

    我们可以做到这样的事情:

    git checkout [revision]
    

    但是我们怎么告诉git我们想让这个版本成为新版本或者用这个替换头?我猜我们不能提交,因为没有什么可以承诺,因为我们不再是主人。顺便说一句,如果你查看一个prev。版本,并修改它,并提交,你提交什么以及在哪里?

    我已阅读https://www.atlassian.com/git/tutorials/undoing-changes但它没有解决本地和远程回购之间的关系。如果要撤消的提交都被推送到远程源主站,则不清楚恢复远程源,本地仓库和工作目录的配方是什么 - 所有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
    

    但我们从未在示例中看到过这一系列步骤,如果可能的话,宁愿用togise git来做。

4 个答案:

答案 0 :(得分:3)

此解决方案节省了我的时间

1)git reset --hard 93827927ed6e245be27f94c93c7e3574e85b91c6(这是您的提交ID)
2)git reset HEAD〜1
3)git stash
4)git add。
5)git commit -m“您的新提交消息在这里”
6)git push --force

答案 1 :(得分:2)

有两种选择:

  1. 返回历史记录,但保留历史记录:revert
  2. 返回历史记录并更改历史记录,以便永久删除提交内容:reset --hardpush --force
  3. 如果您不确定,请使用revert,这是最安全的选择。

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

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

    问题

      

    接下来的问题是这个操作是在远程原点,您的仓库或工作目录上发生的,还是这三个的组合?例如。在还原之后是否必须完成提交和推送,或者它是否为您执行此操作?

    通常,TortioseGit中的所有更改都在您的克隆中(“工作副本”)。此外,推送始终是手动操作

      

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

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

      

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

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

    TortoiseGit中的步骤:

    还原

    1. 还原提交(来自日志)
    2. enter image description here

      1. 提交更改 enter image description here

      2. 并按

      3. 重置并强制推动

        1. 重置(来自日志)
        2. enter image description here

          1. 选择辛苦
          2. enter image description here

            1. 强制推送(复选框“已知更改”)
            2. enter image description here

答案 2 :(得分:2)

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

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

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

git reset --hard <commit-id>

这会将您当前所在分支的Head带到您认为正确且正确的特定“ 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”,还将删除此合并附带的所有提交更改。但这不会删除合并随附的提交

答案 3 :(得分:0)

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

<强>恢复

  

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

重置

  

如果git revert是一种撤消更改的“安全”方式,你可以想到git   重置为危险方法。当您使用git reset撤消时(和   任何引用或reflog都不再引用提交,有   无法检索原始副本 - 它是永久撤消。必须小心   使用此工具时,因为它是唯一的Git命令之一   这有可能失去你的工作。

可能在你的情况下更好地使用还原:

enter image description here

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

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

enter image description here

然后你应该强制推动:

git push -f