在分离的HEAD状态下创建的git提交会发生什么?

时间:2012-04-02 21:38:04

标签: git

这就是发生的事情:

我有一个分支A.在分支A上我提交了一系列更改。我对代码不满意,所以我检查了分支A中的先前提交。然后我做了一些更改并在分支A上提交它们。现在我无法在任何地方找到此提交。我丢失了这段代码吗?

7 个答案:

答案 0 :(得分:163)

旧提交仍在reflog中。

git reflog

这将显示提交列表,并且“丢失”提交应该在那里。你可以把它变成一个新的分支。例如,如果SHA-1是ba5a739,那么您可以在旧提交中创建一个名为“new-branch”的新分支:

git branch new-branch ba5a739

请注意,修剪数据库时会删除“丢失”提交。

答案 1 :(得分:49)

如前所述,您的提交仍然可以在reflog中使用。除了其他答案之外,还有一种方法可以将分离的HEAD提交直接接管到当前分支 ,而无需创建和合并新分支:

  1. 使用

    查找在分离的HEAD状态下提交的提交的SHA-1哈希值
    git reflog
    
  2. 然后执行,所有提交的哈希值从最旧到最近排序:

    git cherry-pick <hash1> <hash2> <hash3> ...
    

    例如,如果我只有一个,以“前7个字符”短哈希格式给出:

    git cherry-pick a21d053
    
  3. 这将为您当前的分支创建新的提交,您在命令中提到的每个detached-HEAD-commit哈希提交一次。它还接管原始提交消息。

答案 2 :(得分:10)

您可以使用以下命令找到丢失(悬空)提交:

git fsck --lost-found

注意,如果您当前的头部是悬空提交,则不会将其列为丢失。

您可以在git-fsck(1) Manual Page

找到更多信息

然后你可以在丢失的提交上创建分支:

git branch new-branch ba5a739

答案 3 :(得分:6)

Git对工作目录状态的说法是“detached HEAD。”这是另一个git reflog进行保存的地方。

$ git reflog
0b40dd6 HEAD@{0}: commit: my commit on detached HEAD
...

如果我尝试签出另一个分支,git-1.7.5.1给出了一个有用的建议。

$ git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  0b40dd6 my commit on detached HEAD

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 0b40dd65c06bb215327863c2ca10fdb4f904215b

Switched to branch 'master'

答案 4 :(得分:5)

你没有丢失它,Git仍然保留一份副本(但目前任何分支机构都无法访问)。您可以使用git reflog命令找到丢失的提交。 reflog会跟踪分支头的历史位置,您可以使用它来查找分支头先前指向的内容。

答案 5 :(得分:3)

按照以下步骤将分离的头部链接回git repo

  1. git checkout "your branch with path but without remote name"
  2. e.g。如果远程名称是原点且分支名称为bugfix/somebranch,则使用git checkout bugfix/somebranch

    1. git reflog 从分离分支的提交列表中获取提交的SHA。

    2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

    3. git push

    4. 全部设定!!

答案 6 :(得分:1)

在Sourcetree中,我发现git reflog不起作用,所以我想出了如何使用GUI来做到这一点。

首先,尝试找到&#34;丢失&#34;通过在命令历史记录中查找消息进行提交(视图:显示命令输出)。它有望成为命令&#34; Switching Branch&#34;在您丢失的提交之后,您将看到具有1234567提交ID的提交注释。

将该提交ID转到下一步。

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

这给我带来了一些失去的工作!