在git中恢复丢失的HEAD分支

39

我有一个非常简单的Git项目,只有一个主分支(Master branch),没有源。

在某个时候,我在我的项目中意外地创建了一个分离的HEAD,然后在那个分离的HEAD上做了很多次提交,试图将它合并回我的Master 分支。我在SourceTree中这样做,起初合并似乎成功了(图形显示主分支进入head,有合并冲突,我修复了它们),但是接着我双击Master来切换到该分支,结果我的HEAD突然消失了。我在SourceTree的“所有分支”下找不到它,在命令行上运行git branchgit log也只显示我的主分支。

有没有办法找回我丢失的分离式HEAD的提交?

2个回答

68

以下是我所采用的方法:

  1. 使用git reflog命令查找丢失的头文件版本。
  2. 使用git checkout @{-1}将HEAD移回到消失的版本。数字-X表示从当前HEAD消失了多少次提交。 -1表示消失的版本距离当前HEAD有1个提交。
  3. 创建一个分支来保存消失的版本。

对于那些第二步无法正常工作的人,@{-1} 是堆栈索引,请尝试使用等效的 HEAD@{1} - Ivellios
1
还可以使用从 git reflog 中获取的哈希值(例如 git checkout 9cbbe15)来操作。 - FireFragment

46

我无法在SourceTree中找到它

返回命令行界面并执行git reflog
您应该能够在该日志中找回HEAD的SHA1。

请注意,您不需要将分离的HEAD分支“合并”回主分支。

您只需将主分支重置为当前分离的HEAD提交即可。
参见“如何修复Git分离的头?

git checkout master

以纯SourceTree风格(就像这个帖子中

http://edwon.tv/wordpress/wp-content/uploads/2012/09/Screen-Shot-2012-10-15-at-4.15.22-PM.png

您也可以检出一个已存在的分支,然后右键点击最新提交并选择“重置到此提交以移动分支指针到您想要的位置”。当显示“HEAD”时,这意味着您在分离 HEAD 状态,这意味着您没有检出任何分支,任何提交都不会在进行时移动任何分支。如果您在 SourceTree 中检出了分离 HEAD 状态,它会明显地警告您,所以可能是之前在命令行中完成的,并且您在 SourceTree 中看到了其余效果。
另一种方法是:使用新分支命令从我的“HEAD”分支(实际上并不是分支)创建一个分支。此时,“HEAD” 就消失了。然后我就能够将该分支与主分支合并并删除我从“HEAD”创建的不需要的分支。

1
非常全面的回答。谢谢! - MattD

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