这就是发生的事情:
我有一个分支A.在分支A上我提交了一系列更改。我对代码不满意,所以我检查了分支A中的先前提交。然后我做了一些更改并在分支A上提交它们。现在我无法在任何地方找到此提交。我丢失了这段代码吗?
答案 0 :(得分:163)
旧提交仍在reflog中。
git reflog
这将显示提交列表,并且“丢失”提交应该在那里。你可以把它变成一个新的分支。例如,如果SHA-1是ba5a739,那么您可以在旧提交中创建一个名为“new-branch”的新分支:
git branch new-branch ba5a739
请注意,修剪数据库时会删除“丢失”提交。
答案 1 :(得分:49)
如前所述,您的提交仍然可以在reflog中使用。除了其他答案之外,还有一种方法可以将分离的HEAD提交直接接管到当前分支 ,而无需创建和合并新分支:
使用
查找在分离的HEAD状态下提交的提交的SHA-1哈希值git reflog
然后执行,所有提交的哈希值从最旧到最近排序:
git cherry-pick <hash1> <hash2> <hash3> ...
例如,如果我只有一个,以“前7个字符”短哈希格式给出:
git cherry-pick a21d053
这将为您当前的分支创建新的提交,您在命令中提到的每个detached-HEAD-commit哈希提交一次。它还接管原始提交消息。
答案 2 :(得分:10)
您可以使用以下命令找到丢失(悬空)提交:
git fsck --lost-found
注意,如果您当前的头部是悬空提交,则不会将其列为丢失。
找到更多信息然后你可以在丢失的提交上创建分支:
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
git checkout "your branch with path but without remote name"
e.g。如果远程名称是原点且分支名称为bugfix/somebranch
,则使用git checkout bugfix/somebranch
git reflog
从分离分支的提交列表中获取提交的SHA。
git cherry-pick "commit hash1" "commit hash2" "commit hash3"
git push
全部设定!!
答案 6 :(得分:1)
在Sourcetree中,我发现git reflog不起作用,所以我想出了如何使用GUI来做到这一点。
首先,尝试找到&#34;丢失&#34;通过在命令历史记录中查找消息进行提交(视图:显示命令输出)。它有望成为命令&#34; Switching Branch&#34;在您丢失的提交之后,您将看到具有1234567提交ID的提交注释。
将该提交ID转到下一步。
点击&#34;分支&#34;顶部工具栏中的按钮,你应该得到一个对话框&#34; New Branch&#34;您可以在其中指定某个提交。把那个提交ID放在那里,指定一个新的分支名称,点击Create Branch,你应该得到一个新的分支与丢失的提交!
这给我带来了一些失去的工作!