【问题标题】:Undo changes made by 'git reset --hard <sha 1 of specific commit>'撤消由 'git reset --hard <sha 1 of specific commit>' 所做的更改
【发布时间】:2015-04-09 05:47:08
【问题描述】:

查询是关于 git reset,

第 1 阶段:现在我想使用以下命令恢复到特定提交,前提是没有本地更改。

git reset --hard <sha 1 of specific commit>

查询 1:我如何才能恢复到一个新的单独分支?

查询 2:一段时间后,我想恢复到第 1 阶段的状态, 收回我使用git reset --hard 丢弃的所有提交。是 这可能吗?

请建议:)

【问题讨论】:

    标签: git git-reset


    【解决方案1】:

    git reset 只适用于当前分支,所以如果你想在单独的分支上执行它,只需创建一个并检查它。例如使用git checkout -b new_branch_name。这将创建一个指向与以前相同的提交的分支。然后你可以执行你的git reset --hard而不影响你原来的分支。

    现在,如果您使用了git reset --hard,并且没有指向原始提交的备份分支,您仍然可以恢复它。幸运的是,Git 不会删除丢失的提交,但会保留它们,直到存储库被垃圾收集。所以你恢复的机会很大。

    您首先应该检查的是使用git reflog 的引用日志。它将为您提供 HEAD 之前指出的内容的日志。在某些时候,您应该会看到这样的条目:

    b3db916 HEAD@{n}: reset: moving to b3db916
    

    这是您git reset --hard b3db916 的结果。现在它下面的条目是硬重置之前的状态。因此,如果您查看最左侧的哈希,那应该是您想要恢复的提交。您可以使用git show &lt;hash&gt; 进行验证。顺便提一句。除了指定哈希之外,您还可以使用git show HEAD@{n+1}(n+1 是重置条目号之后的数字)。如果不是您要查找的提交,请尝试周围的其他提交,看看您是否可以找到它。

    如果您找到了提交,您可以使用git branch new_branch &lt;hash&gt; 或git branch new_branch HEAD@{n+1} 创建一个指向它的新分支。

    如果您在 reflog 中找不到该条目(这不太可能但可能),您也可以尝试使用 git-fsck 恢复丢失的对象。

    【讨论】:

      【解决方案2】:

      1 git checkout -b newbranch &amp;&amp; git reset --hard sha

      2 一切皆有可能。是否要将新分支重置为原始状态?执行 git 重置。您只是想在工作目录中获取原始状态吗?然后git checkout stage1

      【讨论】:

        【解决方案3】:

        问题 1:我想你会想在特定提交之后“做”事情[并且在该特定提交下面有很多提交]。假设这个分支是 STAGE_1_BRANCH

        如果是这样,你可以这样做

        git checkout -b temp sha_of_specific_commit
        #do_things
        #commit

        问题 2:现在您希望在特定提交之后将您最近的提交推回 STAGE_1_BRANCH,然后是其他提交

        git rebase temp STAGE_1_BRANCH

        【讨论】:

          猜你喜欢
          • 2010-09-05
          • 2018-05-30
          • 2015-09-15
          • 2015-10-20
          • 2015-01-10
          相关资源
          最近更新 更多