【问题标题】:Reverting to a specific commit without losing history在不丢失历史记录的情况下恢复到特定的提交
【发布时间】:2023-04-07 13:04:02
【问题描述】:

我知道这种类型的问题有很多重复,但我想打开一个新问题,因为我没有在所有其他问题中找到我想要的最佳方法的解释。

我知道我可以通过以下方式恢复并保留历史记录:

git reset --soft c14809fa

我想恢复 development 分支并将历史记录保存在不同的分支上。

如果我在恢复提交之前将 development 签出到新分支 - 例如

git checkout -b beforeRevert

然后我将结帐回开发分支并进行重新审核(因为我想继续处理我已恢复到的提交中的数据)

另一个分支beforeRevert 分支将保留“还原前”的所有历史记录和数据,这些历史记录和数据将来会再次使用,但不会包含在当前的development 分支中?或者development 分支上的还原会以某种方式影响beforeRevert 分支?

【问题讨论】:

    标签: git git-branch git-reset


    【解决方案1】:

    如果您确定软重置或创建多个分支都不适用于您的用例,您可以这样做

    git diff HEAD commit_hash_to_go_to | git apply
    

    这将在您的分支上的最新提交和具有所需状态的提交之间创建一个更改差异,并自动应用它。这只会更改文件,将它们添加到暂存并提交结果是您的工作。 如果您想尝试不同的解决方案并将更改的历史记录保留在同一分支中或避免增加本地分支,这可能会很有用。

    如果遇到“cannot apply binary patch to without full index line”错误,添加--binary标志:

    git diff HEAD commit_hash_to_go_to --binary | git apply
    

    在执行此操作之前,请确保您没有未提交的更改 - 否则将不会应用补丁(它是原子的,因此所有更改都通过或不通过,因此您最终不会处于不一致的状态)

    注意:这只是更改文件并将它们标记为已修改。它不会改变提交历史或创建新的提交

    【讨论】:

      【解决方案2】:

      正如您所说,最简单的做法是在HEAD 所在的位置创建一个新分支,然后将development 恢复为您要从中恢复工作的提交:

      git checkout development   # Make HEAD point to the 'development' branch
      git branch beforeRevert    # Create a new branch reference pointing to HEAD
      git reset --hard c14809fa  # Move HEAD, the index and your working copy to c14809fa
      

      这是将要发生的事情的图形表示:

          Step 1               Step 2                  Step 3
      
                  develop    develop, beforeRevert   develop   beforeRevert
                 /                    /             /         /
      A-B-C-D-E-F          A-B-C-D-E-F             A-B-C-D-E-F
                ^                    ^             ^
               HEAD                 HEAD          HEAD
      

      这里重要的是HEAD 始终指向development 分支,因此当您运行git reset --hard c14809fa 时,该分支会被移动。新的beforeRevert 分支仍将指向HEAD 在还原之前的位置。

      【讨论】:

      • 这听起来像是我想做的。让我检查一下,我会批准你的回答。谢谢!
      • 答案批准了吗?
      【解决方案3】:

      不要还原您的更改,只需返回上一个提交,然后从那里签出一个新分支。

      git checkout development
      git checkout c14809fa
      git checkout -b newBranch
      

      这样您可以访问“开发”分支以查看旧的更改和历史记录,并且可以在“新分支”中进行进一步的更改

      如果你想用相反的方式重命名分支,你可以使用 -

      git branch -m <oldname> <newname>
      

      【讨论】:

      • 你可以一口气搞定:`git checkout -b newBranch c14809fa'
      • 这会让分支走错路。 OP 希望新分支指向他当前所在的位置,而开发分支指向旧提交。
      • 正如我所提到的,简单的方法是稍后使用 'git branch -m ' 重命名分支。只需交换两个分支的分支名称即可。
      • Enrico Campidoglio 的回答更正确,我认为。
      【解决方案4】:

      git merge &lt;old commit&gt;

      这将创建一个新的提交(带有您选择的消息),将您的工作空间恢复到

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 2020-08-30
        • 2013-07-13
        • 2011-07-20
        • 1970-01-01
        相关资源
        最近更新 更多