如何还原git代码库并保留提交历史记录?

3

这是我所拥有的:

dbd7868 (HEAD -> master) commit 3
19ea7e8 commit 2
5b4baae commit 1

我希望所有文件与提交2时的完全一致。这是我尝试过的:

git checkout 19ea7e8
git commit -m "reverted to commit 2"

但是这就是结果:

HEAD detached at 19ea7e8
nothing to commit, working tree clean

期望的结果:

xxxxxxx (HEAD -> master) reverted to commit 2
dbd7868 commit 3
19ea7e8 commit 2
5b4baae commit 1

我尝试过寻找答案,但是有些回答会让commit 3从历史记录中消失,而有些答案则不清楚历史记录是否被保留。


编辑:在尝试了其中一种解决方案后,我不得不重新设置测试项目。现在这是我拥有的:

9c4180f (HEAD -> master) jkl
38029d0 ghi
830efcd def
ae96f00 abc

这是我想要的:

xxxxxxx (HEAD -> master) def again
9c4180f jkl
38029d0 ghi
830efcd def
ae96f00 abc

提交代码的def again应该和def完全相同。为了澄清,我希望能够进入任何提交。


你可以尝试使用git reset 19ea7e8 ,然后执行 git commit -am "reverted to commit 2"。我认为这可能会实现你想要的功能。 - John Ilacqua
那将抹去历史记录。现在我有提交1 -> 提交2 -> 撤销提交2。 - user3670011
git checkout . 19ea7e8 怎么样? - John Ilacqua
无法工作:错误:路径规范'19ea7e8'与git已知的任何文件不匹配。 - user3670011
可能把“.”和提交顺序搞反了。 - John Ilacqua
Git reset不会删除历史记录。如果你在9c4180f处创建了一个分支,你不会失去它。 - evolutionxbox
2个回答

7
您可以使用命令 git revert <hash1> <hash2> .. 来进行操作。
请尝试以下命令:
git revert dbd7868

这将创建一个新的提交,该提交将是撤消第3次提交的结果。

如果您想还原其他任何提交,请使用提交哈希运行还原命令。例如:

git revert 5b4baae #to revert commit 1
git revert 19ea7e8 #to revert commit 2

在所有情况下,还原提交将位于第三个提交之上。

如果我想要回到任何时间点,而不仅仅是上一个提交怎么办? - user3670011
我在我的问题上更新了新的提交结构。我运行了命令 git revert 830efcd #to revert def,输出结果是 fatal: bad revision '#to' - user3670011
#to revert commit 1 was a comment for you to understand. Run only git revert 5b4baae - Pankaj Singhal

1
我通过John Ilacqua找到了解决方案。
这里是我输入的确切命令:
git checkout 830efcd .
git commit -am "revert def"

这里是输出结果:

684b0bb (HEAD -> master) revert def
9c4180f jkl
38029d0 ghi
830efcd def
ae96f00 abc

那基本是正确的答案(你还需要删除自从你提取提交以来添加的任何文件)。但如果你在提交消息中称此为“revert”,那么你会误导Git用户,他们已经习惯了在Git中,“revert”意味着“撤消”(也就是“回退”)。它不表示“返回到”即“恢复”。这是英语歧义的不幸情况(revert可以表示“撤消”或“返回”)。 - torek
@user3670011 为什么您取消了我的答案?它没有回答您的问题吗? - Pankaj Singhal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接