如何从“分离头状态”中恢复提交?

26

我切换到一个更新的分支并进行了一些更改,然后又切回主分支,现在更改消失了!我能找回来吗?终端大致是这样的:

$ git commit
[detached HEAD 7c09e17] Fixed some stuff
  files changed, insertions(+), deletions(-)
$ git push master
fatal: 'master' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
$ git checkout master
Previous HEAD position was 7c09e17... Fixed some stuff
Switched to branch 'master'
$ git merge theother/directory

dup of https://dev59.com/W2445IYBdhLWcg3wdqIL? - smparkes
这个回答解决了你的问题吗?如何将分离的 HEAD 与 master/origin 合并? - mkrieger1
2个回答

41

假设您仍在主分支上:

git merge 7c09e17

应该够了。如果你观察终端,git通常会告诉你提交ID。


检出主分支,合并7c09e17,检出主分支,推送更改,问题似乎已解决,谢谢! - NoBugs
还有一个好奇的问题,有没有办法在我的本地机器上查看/取消所有这些提交? - NoBugs
12
如果你想查看所有悬空提交(不在分支上的提交),可以使用git fsck --unreachable --no-reflogs命令。 - Matthew Flaschen
6
如果您没有观看终端,您可以从git reflog获取所需的信息。 - William Pursell
2
@MatthewFlaschen 我真希望我能给你点赞不止一次!这简直救了我的命! - KOGI

23

我曾遇到过一个类似的问题。我发现 git reflog 这个命令非常好用。为了帮助说明它的用法,以下是输出结果:

e3191c5 HEAD@{0}: checkout: moving from ec31ccf0735240d0cdc5a44fd443039c3caa43f0 to master
ec31ccf HEAD@{1}: commit: Added code and data for simulation.
781b9ee HEAD@{2}: checkout: moving from 3bd804e635b913840c71b7f8a33665460580d45f to 781b
3bd804e HEAD@{3}: checkout: moving from master to 3bd804

我的情况有点不同,因为我在一个非常旧的提交状态下进行了一次提交。

如果我只是想将ec31ccf0735240d0cdc5a44fd443039c3caa43f0(也称为ec31ccf,那就是我曾经所在的位置)合并到master分支,我认为git merge ec31ccf或者git rebase ec31ccf可能会起作用。但在我的情况下,这主要是合并古老的历史记录(包括合并冲突等)。

相反,我只想恢复我在ec31ccf上所做的更改,git cherry-pick ec31ccf效果很好。


1
“git reflog” 在我找回丢失的分离分支时帮了我很多!感谢你提到它! - Felix D.

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