Git Checkout将代码还原到旧版本,如何再次还原?

5
我一直在编写一些IT相关的代码,并使用git进行管理。早些时候,我使用commit保存了一个可运行的代码版本。后来,由于需要添加新功能并且设计不佳,我决定重新编写代码。在成功完成后,我又进行了一次git commit。在执行git log命令后,我发现自己没有处于任何分支上。于是,我执行了"git checkout master"命令,这将我带回到旧代码版本,并且git log显示了我的最新提交。这是非常繁琐的工作,所以我想知道是否有方法可以撤销我的操作,恢复到最新的代码版本。感谢您的帮助。

相似,但我又遇到了另一个问题 - 当合并时,一些Xcode文件(请参见下面我的评论)出现冲突。 - futurevilla216
2个回答

14

查看 git reflog,找到你的提交记录。

最安全的方法是在“丢失”的提交上创建一个分支,然后使用 gitkgit log -p 来检查是否一切正常。

git branch recovery HEAD@{1} # use whatever commit you need
git log -p recovery

这个新分支可以合并,可以在主分支上变基,它的提交可以挑选出来等等。在 Git 中有许多可能会踩到自己的坑,但也有更多种方法重新连接脚(可能连接到你的手臂上)。

如果您在主分支上没有进行任何新的提交,您可以简单地将该提交合并,Git 会将其解决为快进式合并:

git merge HEAD@{1} # use whatever commit you need

如果你不关心主分支上的任何新提交,只想将主分支重置为那个丢失的提交,请使用git reset。为了不丢失任何更改,请先将更改暂存到你的工作副本中(git stash save)。

git reset --keep HEAD@{1}

下次发现自己不在任何分支上时,请使用git branch newbranchgit checkout -b newbranch


谢谢。然而,当我这样做时,我遇到了两个冲突(都不是在我的文件上,而是在Xcode文件上)。有没有办法让我用新版本覆盖当前版本? - futurevilla216
另外,感谢下次的建议。但是,如果我不想创建一个新的分支怎么办? - futurevilla216
@Lenny:要覆盖,请使用 git reset --hard/--keep。如果您真的不想创建新分支,可以在恢复更改后删除它,或者移动主分支(git resetgit branch -f)。 - knittl
1
我仍然遇到了冲突。使用git reset(使用--hard和--keep)可以正常工作,但是在合并时仍然会发生冲突。另外,感谢您的分支提示,我会在下次记住的。 - futurevilla216
@Lenny:当你将分支重置到“丢失”的提交时,你不需要合并(即使你这样做,Git 也应该告诉你 “一切都是最新的”)。对于 Git 新手来说,更容易的方法是在丢失的提交上创建一个新分支,然后检查是否真的有所有内容(gitkgit log -p)。验证完毕后,您可以随时重置您的主分支并删除临时的“恢复”分支。 - knittl
显示剩余3条评论

1

使用 git reflog 命令,获取你的新提交的 SHA(或者你可以以 HEAD@{1} 的格式引用它),然后使用 git cherry-pickgit merge 等命令将该提交合并到主分支。


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