在分离的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和合并一个新的分支:
-
查看您在分离HEAD状态下提交的SHA-1哈希值
git reflog
-
然后执行所有提交散列从最旧到最近的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
-
git checkout "your branch with path but without remote name"
例如,如果远程名称是来源,分支名称是bugfix/somebranch
那么使用git checkout bugfix/somebranch
-
git reflog
获取从分离分支的提交列表中列出的提交SHA。 -
git cherry-pick "commit hash1" "commit hash2" "commit hash3"
-
git push
可以了,好了!!