恢复到特定提交而不会丢失历史记录

时间:2015-09-29 10:31:59

标签: git git-branch git-reset

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

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

git reset --soft c14809fa

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

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

git checkout -b beforeRevert

我将结帐回到开发分支并进行启示(因为我想继续处理我已经恢复的提交数据)

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

3 个答案:

答案 0 :(得分:7)

最简单的事情就像你说的那样,只需创建一个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所在的位置。

答案 1 :(得分:2)

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

git checkout development
git checkout c14809fa
git checkout -b newBranch

通过这种方式,您可以访问“开发”分支以查看旧的更改和历史记录,您可以在“newBranch”中进行进一步的更改

如果您想要反过来使用 -

,可以重命名分支
git branch -m <oldname> <newname>

答案 2 :(得分:1)

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

git diff HEAD commit_hash_to_go_to | git apply

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

如果遇到“在没有完整索引行的情况下无法应用二进制补丁”错误,请添加--binary标志:

git diff HEAD commit_hash_to_go_to --binary | git apply

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

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