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

事情是这样的:

我有一个分支 A 对分支 A 我提交了一些变化。我对这段代码不满意,所以我检查了分支 A 中以前的提交,然后做了一些更改,并在分支 A 上提交了它们。现在我在任何地方都找不到这个承诺。我把密码弄丢了吗?

58092 次浏览

您没有丢失它,Git 仍然保留了一个副本(但是目前任何分支负责人都无法访问它)。使用 git reflog命令可以找到丢失的提交。Reflog 跟踪分支头的历史位置,您可以使用它查找分支头以前指向的内容。

旧的提交仍在重新组合中。

git reflog

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

git branch new-branch ba5a739

请注意,当数据库被删除时,“丢失”的提交将被删除。

Git 用来描述你的工作目录状态是 a & ldquo; 头部分离。这是另一个 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'

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

  1. 查找在分离的 HEAD 状态下进行的提交的 SHA-1哈希表

     git reflog
    
  2. 然后执行,将所有提交哈希值从最早到最近排序:

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

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

     git cherry-pick a21d053
    

这将为当前分支添加新的提交,每分离一个提交-您在命令中提到的 HEAD 提交。它还接管原始的提交消息。

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

首先,通过在命令历史记录中查找消息(视图: Show Command Output)来查找“丢失”的提交。希望它在您丢失的提交之后的命令“ Switch Branch”中,并且您将看到具有1234567提交 ID 的提交注释。

将提交 ID 带到下一步。

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

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

您可能会发现丢失(悬挂)提交与以下命令:

git fsck --lost-found

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

你可以在 Git-fsck (1)手册页找到更多的信息

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

git branch new-branch ba5a739

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

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

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

  1. 从分离分支的提交列表中获取提交 SHA 的列表
  2. git cherry-pick "commit hash1" "commit hash2" "commit hash3"

  3. git push

都准备好了! !