GIT恢复最后一个分离的HEAD

时间:2013-02-07 17:38:55

标签: git

请问,我的项目有一个大问题:这就是场景。 我在GIT下有一个xcode项目。今天我意识到最后一次提交破坏了一些测试,所以我检查了之前的提交。 我使用了SourceTree,这是警告

  

这样做会使您的工作副本成为'分离的HEAD',这意味着您将不再在分支机构上。如果您想在此之后提交,则可能需要再次签出分支,或者创建新分支。这可以吗?

我工作了一整天,最后我做了一切。 所以我需要将我的工作合并到开发分支上,这样我就可以查看开发分支......我的工作立即消失了:(

我知道分离我的HEAD是错误的,Sourcetree警告我......但有一种方法可以恢复我的工作吗?

非常感谢。

7 个答案:

答案 0 :(得分:201)

如果您输入git reflog,它会显示修订HEAD指向的历史记录。你的独立头应该在那里。找到后,执行git checkout -b my-new-branch abc123git branch my-new-branch abc123(其中abc123是分离的HEAD的SHA-1)以创建指向分离头的新分支。现在,您可以随意合并该分支。

通常情况下,如果你在处理一个分离的头后检查一个分支,Git应该告诉你你所处的分离头的提交,所以你可以在需要时恢复它。我从来没有使用过SourceTree,所以我不知道它是否传递了这条消息。但如果它确实显示了该消息,那么您应该能够使用它来查找提交,并再次使用git checkout -bgit branch从该提交创建分支。

答案 1 :(得分:11)

在Sourcetree中,您可以使用GUI执行此操作。

首先通过在命令历史记录中查找消息来查找“丢失”提交(视图:显示命令输出)。在您丢失的提交之后,它可能会在命令“Switching Branch”中。在该消息中,希望您将看到带有1234567提交ID的提交注释。

将该提交ID转到下一步。

点击顶部工具栏中的“分支”按钮,您将看到一个对话框“新分支”,您可以在其中指定某个提交。把那个提交ID放在那里,指定一个新的分支名称,点击Create Branch,你应该得到一个新的分支,你的丢失提交!

enter image description here

答案 2 :(得分:4)

如果您不想更改已分离的HEAD并希望直接使用以下命令转到最新的分支提交。

git checkout - 

注意:我将删除已分离的HEAD中的所有更改。

答案 3 :(得分:0)

我尝试了这个场景,并发现git告诉我最后一次提交的SHA-1:

vors@localhost:~/git-test$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ec600e6 333

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name ec600e6eb2473dd4f3732539c5c1fa5829f631b7

Switched to branch 'master'

你看到这条消息了吗?

答案 4 :(得分:0)

只要你想做出无变化,

分离的头就可以了。

如果要还原提交,可以在特定分支上使用git revert

如果你想要脱离头并做出承诺;创建一个新分支(稍后合并);

答案 5 :(得分:0)

我的一位同事遇到了这种情况。在他的案例中,有分离的头部提交(他们在R-Studio中工作),并且该工具确实警告他们可以使用该引用和SHA引用创建分支...但是由于唯一的选择是“ Close”(关闭) --du!这是一个信息框-他们关闭了对话,并永远丢失了信息...

借助reflog命令,我们可以看到所做的更改没有丢失。但是在我们的情况下,git branch不能按预期方式工作...或者传入的git pull确实使它混乱。我们必须将更改从reflog转移到新创建的分支:

 git cherry-pick 0b823d42..3cce27fc

将所有需要的提交放入分支。然后,我们可以毫无问题地将分支合并到develop中。

只要对所有人有帮助,我们都通过查看标记为“ checkout”(标识分支)之间的提交,来确定reflog headed 上的提交移):

e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward

我们想要的是HEAD@{8}HEAD@{6}(包括两者)。所以我们得到了他们:

git cherry-pick 0b823d42..3cce27fc

然后,通常的合并解决和最终提交使我们留给了lost_changes分支来托管我们认为丢失的独立工作。这次,将其合并到开发中是快速的。

答案 6 :(得分:0)

  1. 首先,运行git reflog以查看历史记录。
  2. 最早的修订版将是列表中的最后一个修订版。
  3. 使用git checkout -b temp e35d2b3切换到所需的提交,此处e35dd23是您的提交的哈希值。
  4. 就是这样。现在只需执行git add即可。等等...

如果可以解决您的问题,请接受它作为答案。否则,请分享您的评论。