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

这是发生了什么事:

我有一个分支A.在分支AI上犯了一堆的变化。 我对代码不满意,所以我检查了分支A中的前一个提交。然后我做了更多的更改,并在分支A上提交它们。现在我无法在任何地方find此提交。 我失去了这个代码?

旧的提交仍然在reflog中。

 git reflog 

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

 git branch new-branch ba5a739 

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

正如已经指出的,您的提交仍然可以在reflog中find。 除了其他答案之外,这里还有一种方法可以直接接pipe分离的HEAD提交到你当前的分支,而不需要创build和合并一个新的分支:

  1. 查看您在分离HEAD状态下提交的SHA-1哈希值

     git reflog 
  2. 然后执行所有提交散列从最旧到最近的sorting:

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

    例如,如果我只有一个,在“前7个字符”短散列格式给出:

     git cherry-pick a21d053 

这将创build一个新的提交到你当前的分支(每个分离的HEAD提交,你在命令中提到的一个)。 它也接pipe了原来的提交信息。

你可能会发现使用以下命令丢失(悬挂)提交:

 git fsck --lost-found 

请注意,如果您当前的头是悬挂提交,它不会列为丢失。

您可以在git-fsck(1)手册页find更多信息

那么你可以在失去的提交上创build分支:

 git branch new-branch ba5a739 

你没有失去它,Git仍然保留一个副本(但目前无法通过任何分支头)。 你可以使用git reflog命令find你丢失的提交。 refloglogging分支头的历史位置,您可以使用它来查找分支头以前指向的东西。

你的工作目录状态的Git说法是一个“ 分离的头”。这里是另一个地方, git reflog使保存。

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

如果我尝试检出一个不同的分支,git-1.7.5.1给出了一个有用的build议。

  $ git checkout master
警告:你要离开1落后,没有连接到
你的任何分支机构:

   0b40dd6我提交分离的HEAD

如果你想通过创build一个新的分支来保留它们,这可能是一个好时机
这样做:

  git分支new_branch_name 0b40dd65c06bb215327863c2ca10fdb4f904215b

切换到分支“主” 

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

首先,通过在Command History(查看:显示命令输出)中查找消息来尝试查找“lost”提交。 在失败的提交之后,希望在“切换分支”命令中,您将看到具有1234567提交ID的提交注释。

把这个提交ID下一步。

点击顶部工具栏中的“分支”button,你应该得到一个对话框“新分支”,你可以指定一个提交。 把那个提交ID放在那里,指定一个新的分支名称,点击创build分支,你应该得到一个新的分支丢失的提交!

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

按照以下步骤将你分离的头连回到git repo

  1. git checkout "your branch with path but without remote name"

例如,如果远程名称是来源,分支名称是bugfix/somebranch那么使用git checkout bugfix/somebranch

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

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

  3. git push

可以了,好了!!