105

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

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

我工作了一整天,最后我承诺了一切。所以我需要在开发分支上合并我的工作,所以我检查了开发分支并且......我的工作立即消失了:(

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

4

7 回答 7

300

如果您键入git reflog,它将向您显示所HEAD指向的修订的历史记录。你分离的头应该在那里。找到它后,执行git checkout -b my-new-branch abc123or git branch my-new-branch abc123abc123分离 HEAD 的 SHA-1 在哪里)创建一个指向分离头的新分支。现在您可以随意合并该分支。

一般来说,如果你在一个分离的头上工作后签出一个分支,Git 应该告诉你从你一直在分离的头上的提交,所以你可以在需要时恢复它。我从未使用过 SourceTree,所以我不知道它是否会转发该消息。但是,如果它确实显示了该消息,那么您应该能够使用它来查找提交,并再次使用git checkout -bgit branch从该提交创建一个分支。

于 2013-02-07T17:45:12.937 回答
11

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

首先通过在命令历史记录中查找一条消息来找到“丢失”的提交(查看:显示命令输出)。它可能会在您丢失的提交之后的“切换分支”命令中。在该消息中,希望您会看到带有 1234567 提交 ID 的提交评论。

将该提交 ID 带到下一步。

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

在此处输入图像描述

于 2014-07-11T14:47:24.237 回答
5

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

git checkout - 

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

于 2017-09-29T07:24:27.513 回答
3
  1. 首先,运行git reflog查看历史。
  2. 最旧的修订将是列表中的最后一个。
  3. 使用此处切换到您想要的提交git checkout -b temp e35d2b3e35dd23 是您提交的哈希值。
  4. 就是这样。现在只需执行 git add 。ETC....

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

于 2019-10-16T05:23:13.463 回答
1

我的一个同事刚遇到这种情况。在他的情况下,在分离的头部有提交——它们在 R-Studio 中工作——并且该工具确实警告他们可以使用这个和那个 SHA 引用创建分支......但因为唯一的选项是“关闭” ——呃!!这是一个信息框——他们关闭了对话并永远丢失了信息……

由于该reflog命令,我们可以看到更改没有丢失。但在我们的例子中,git branch没有按预期工作......或者传入git pull确实以某种方式搞砸了。我们必须将 reflog 中的更改捕获到新创建的分支:

 git cherry-pick 0b823d42..3cce27fc

它将我们想要的所有提交放在分支中。然后我们可以将分支合并到develop没有问题的地方。

以防万一这对任何人都有用,我们确实通过查看标记为“checkout”(识别分支转移)之间的那些来确定分离头上的提交:reflog

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 托管我们认为丢失的分离头工作。这次将其合并到开发中是快进的。

于 2019-02-22T15:04:03.700 回答
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'

你看到这条消息了吗?

于 2013-02-07T17:47:19.237 回答
0

分离头是可以的,只要你想做No change。

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

如果您想摆脱分离的头脑并进行提交;创建一个新分支(然后合并它);

于 2013-02-07T17:47:51.563 回答