恢复 Git 提交到无分支状态

3

我在(no branch)分支上提交了代码,然后进行了一次pull操作。接着我意识到我在错误的分支上,于是使用了'checkout master'命令并再次进行了一次pull操作。现在我找不到原来提交的代码以便将其推送到主分支,并且也无法切换到(no branch)分支。有没有办法让我找回我的代码或获取差异文件?


2
也许 - git reflog 显示了提交记录 - 你可以将其拉取到一个真正的分支中吗? - Adrian Cornish
1
@AdrianCornish 这可能是正确的答案:请在下面发布以进行投票。 - Alex Brown
这个回答解决了你的问题吗?如何在Git中恢复丢失的提交? - starball
1个回答

6

git reflog会列出您做的所有提交,例如git merge HEAD@{1}将其合并回您的分支。

$ git reflog
734713b... HEAD@{0}: commit: fixed refs handling, added gc auto, updated
d921970... HEAD@{1}: merge phedders/rdocs: Merge made by recursive.
1c002dd... HEAD@{2}: commit: added some blame and merge stuff

来自 git rev-parse

<refname>@{<n>}, e.g. master@{1}

一个带有序数说明的后缀 @ 的 ref(例如 {1}{15})指定该 ref 的第 n 个先前值。
请注意,git rebase -i 也会执行相同操作。 Revision Selection 页面提到:
重要的是要注意,reflog 信息严格局限于本地——它记录了您在存储库中所做的操作。引用在其他人的存储库副本上不会相同;并且在您最初克隆存储库之后,由于尚未在存储库中发生任何活动,因此您将拥有一个空的 reflog。
配置 gc.reflogExpire 指定何时删除早于此时间的 reflog 条目;默认为 90 天。

这通常是正确的,但可能会因git reflog配置而失败。 - Alex Brown
我为什么记得只有最后20个提交的内容 - 还是我错了? - Adrian Cornish
谢谢你的快速回答!今天早上我解决了一些空格冲突,并成功地将所有内容合并了。 - Patrick Auld
@VonC 谢谢 - 真的,这是你的答案 - 我的只是对我大致认为可能有效的评论 - 你的回答实际上解释了它,功劳应归于你。 - Adrian Cornish
你用这个命令救了我的命!GIT太棒了!(虽然有点复杂,但最终解决了问题!)- 谢谢! - Norman H

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