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

Mau*_*imo 126 git

这就是发生的事情:

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

Die*_*Epp 171

旧提交仍在reflog中.

git reflog
Run Code Online (Sandbox Code Playgroud)

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

git branch new-branch ba5a739
Run Code Online (Sandbox Code Playgroud)

请注意,修剪数据库时将删除"丢失"提交.

  • 使用`git cherry-pick [SHA]`将提交移动到现有分支上,以防你在处于分离头状态时意外提交 (14认同)
  • 我做了同样的事情并且心脏病发作认为它丢失了.谢谢(你的)信息! (3认同)
  • 或者,您可以切换到现有分支并执行与glog中列出的"丢失"提交相对应的"git merge HEAD @ {n}"n. (3认同)

tan*_*ius 51

正如已经指出的那样,你的提交仍然可以在reflog中找到.除了其他的答案,这里是一个办法接管分离的头提交到当前分支直接,而无需创建和合并一个新的分支:

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

    git reflog
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后执行,所有提交的哈希值从最旧到最近排序:

    git cherry-pick <hash1> <hash2> <hash3> ...
    
    Run Code Online (Sandbox Code Playgroud)

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

    git cherry-pick a21d053
    
    Run Code Online (Sandbox Code Playgroud)

这将为您当前的分支创建新的提交,您在命令中提到的每个分离的HEAD提交哈希提交一次.它还接管原始提交消息.


ser*_*gtk 10

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

git fsck --lost-found
Run Code Online (Sandbox Code Playgroud)

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

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

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

git branch new-branch ba5a739
Run Code Online (Sandbox Code Playgroud)


Gre*_*con 6

用于工作目录状态的Git用语是" 分离的HEAD".这是另一个git reflog进行保存的地方.

$ git reflog
0b40dd6 HEAD@{0}: commit: my commit on detached HEAD
...
Run Code Online (Sandbox Code Playgroud)

如果我尝试签出一个不同的分支,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'


小智 6

按照以下步骤将分离的头部链接回 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

搞定!!


Gre*_*ill 5

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