将以前的提交点恢复到Git顶部的最简单方法

将以前的提交点恢复到Git顶部的最简单方法,git,revert,git-revert,Git,Revert,Git Revert,好的,这是我想要的,非常像: 假设我的git日志如下所示: detour C detour B detour A Last good point 我想回到“最后一个好点”,同时仍然保持历史上的弯路,但与之不同的是,我想让它再次登上榜首。因此,之后我的git日志将显示: Revert to last good point detour C detour B detour A Last good point 我知道官方的方式是 git还原头~3 然而,我得到了 error: could not

好的,这是我想要的,非常像:

假设我的git日志如下所示:

detour C
detour B
detour A
Last good point
我想回到“最后一个好点”,同时仍然保持历史上的弯路,但与之不同的是,我想让它再次登上榜首。因此,之后我的git日志将显示:

Revert to last good point
detour C
detour B
detour A
Last good point
我知道官方的方式是

git还原头~3

然而,我得到了

error: could not revert f755e55... Last good point
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'

我会马上把我带到那里,但是我读到git会处于一个分离的阶段,我不知道如何再次将这个阶段复制到顶部。请帮忙。Thx

这里是git revert的另一种选择,它可以为您提供相同的信息,同时避免混乱的合并冲突。只需从当前点签出一个新分支,然后将该分支硬重设为较早的点:

git checkout your_branch
git checkout -b new_branch
git reset --hard HEAD~3

现在,
new\u分支
在功能上是您想要的,而且您的真正的
分支
中仍然有这三个提交。

这里有一个替代
git revert
的方法,它会给您留下相同的信息,同时避免混乱的合并冲突。只需从当前点签出一个新分支,然后将该分支硬重设为较早的点:

git checkout your_branch
git checkout -b new_branch
git reset --hard HEAD~3

现在,
new\u分支
在功能上是您想要的,而且您的真正的
分支
中仍然有这三个提交。

您可以按相反的顺序逐个恢复提交,以避免修复合并冲突,并最终达到所需的提交

假设您最初有以下历史记录

7a6c2cc detour C
dc99368 detour B
1cf4eb4 detour A
22769c2 Last good point
您可以运行以下顺序的
git revert
命令

git revert 7a6c2cc
git revert dc99368
git revert 1cf4eb4
这将给您留下一个提交历史记录,如下所示

3b67aaf Revert "detour A"
9028879 Revert "detour B"
6d9bcce Revert "detour C"
7a6c2cc detour C
dc99368 detour B
1cf4eb4 detour A
22769c2 Last good point
最后,您的代码将与上次提交时的代码相同

您还可以将
--no commit
标志与
git revert
一起使用,以避免每次还原都进行单独的提交

git revert --no-commit 7a6c2cc
git revert --no-commit dc99368
git revert --no-commit 1cf4eb4
git commit -m "Revert detour C, B and A"

您可以按相反的顺序逐个恢复提交,以避免修复合并冲突并最终达到所需的提交

假设您最初有以下历史记录

7a6c2cc detour C
dc99368 detour B
1cf4eb4 detour A
22769c2 Last good point
您可以运行以下顺序的
git revert
命令

git revert 7a6c2cc
git revert dc99368
git revert 1cf4eb4
这将给您留下一个提交历史记录,如下所示

3b67aaf Revert "detour A"
9028879 Revert "detour B"
6d9bcce Revert "detour C"
7a6c2cc detour C
dc99368 detour B
1cf4eb4 detour A
22769c2 Last good point
最后,您的代码将与上次提交时的代码相同

您还可以将
--no commit
标志与
git revert
一起使用,以避免每次还原都进行单独的提交

git revert --no-commit 7a6c2cc
git revert --no-commit dc99368
git revert --no-commit 1cf4eb4
git commit -m "Revert detour C, B and A"

您只需从
Last good point
commit中读取树,然后提交它:

git read-tree -m -u HEAD~3
git commit

-m-u
读取树的
选项将从给定树更新工作目录。

您只需从
最后一个好点
提交读取树,然后提交:

git read-tree -m -u HEAD~3
git commit
-m-u
读取树的
选项将从给定树更新工作目录。

TL;博士 有三种相当直接的方法可以实现您的目标:

  • git revert--无提交头~3..HEAD&&git提交
  • git读取树--reset-u头~3&&git提交
  • git rm-rf--.&git检测头~3——&&git提交
  • 这三项都要求您输入新的提交消息;您可以将
    -C HEAD~3--edit
    添加到
    git commit
    命令中,以便可以从
    HEAD~3
    中的消息开始进行编辑。这三项中的最后一项要求您位于存储库的顶层(
    cd
    -ed)。如果尚未安装,则应首先使用:

    cd $(git rev-parse --show-toplevel)
    
    或:

    然后将输出剪切并粘贴到
    cd
    命令中,以进入顶层

    更长:为什么以上是正确的,从#3开始 关键短语是:

    我想恢复到“最后一个好点”

    (我的重点是:将还原为,而不仅仅是revert,这是一个Git命令,可以做一些不同的事情)

    您还应该提防stage这个词,它在Git中有一个技术定义的含义(指复制到staging区域,这是Git调用的另一个短语,索引、缓存,当然还有staging区域)。[编辑:已删除,因为标题现在已调整]

    执行此操作的低级命令是
    git read tree
    ,如中所示。我建议使用
    git read tree--reset-u
    ,因为
    -m
    意味着执行合并,而您需要重置索引。但是有一种方法可以做到这一点,虽然有点笨拙,但对人类来说可能更有意义,使用
    git checkout
    。这是命令集3,我们将首先了解它

    正如您所注意到的,
    git checkout HEAD~3
    将使所需的提交成为当前提交,但它是通过“detaching HEAD”来实现的,这是一个可怕的短语,只是意味着您不再位于命名分支上。(通过运行
    git checkout branchname
    “重新连接”头部,通过检查该分支的提示提交(当然这意味着您不再使用所需的提交),再次设置事情,使您位于该分支上。)这是因为所有提交或多或少都是永久性的,1完全只读:你不能改变过去,你只能重新访问它

    不过,
    git checkout
    命令可以做的不仅仅是重新访问过去(通过签出特定的过去提交)或切换到其他分支(通过签出任何命名分支)。可能,这些操作中的许多或大部分都应该有不同的前端命令,因为将它们全部集中在
    git checkout
    下只会使git更加混乱;但这就是我们所拥有的:
    git checkout提交说明符--path
    告诉
    git checkout
    将给定的
    路径(文件或目录名)提取到索引中,然后再提取到工作树中,覆盖当前在索引和工作树中的任何内容,即