请问,我的项目有一个大问题:这就是场景。 我在GIT下有一个xcode项目。今天我意识到最后一次提交破坏了一些测试,所以我检查了之前的提交。 我使用了SourceTree,这是警告
这样做会使您的工作副本成为'分离的HEAD',这意味着您将不再在分支机构上。如果您想在此之后提交,则可能需要再次签出分支,或者创建新分支。这可以吗?
我工作了一整天,最后我做了一切。 所以我需要将我的工作合并到开发分支上,这样我就可以查看开发分支......我的工作立即消失了:(
我知道分离我的HEAD是错误的,Sourcetree警告我......但有一种方法可以恢复我的工作吗?
非常感谢。
答案 0 :(得分:201)
如果您输入git reflog
,它会显示修订HEAD
指向的历史记录。你的独立头应该在那里。找到后,执行git checkout -b my-new-branch abc123
或git branch my-new-branch abc123
(其中abc123
是分离的HEAD的SHA-1)以创建指向分离头的新分支。现在,您可以随意合并该分支。
通常情况下,如果你在处理一个分离的头后检查一个分支,Git应该告诉你你所处的分离头的提交,所以你可以在需要时恢复它。我从来没有使用过SourceTree,所以我不知道它是否传递了这条消息。但如果它确实显示了该消息,那么您应该能够使用它来查找提交,并再次使用git checkout -b
或git branch
从该提交创建分支。
答案 1 :(得分:11)
在Sourcetree中,您可以使用GUI执行此操作。
首先通过在命令历史记录中查找消息来查找“丢失”提交(视图:显示命令输出)。在您丢失的提交之后,它可能会在命令“Switching Branch”中。在该消息中,希望您将看到带有1234567提交ID的提交注释。
将该提交ID转到下一步。
点击顶部工具栏中的“分支”按钮,您将看到一个对话框“新分支”,您可以在其中指定某个提交。把那个提交ID放在那里,指定一个新的分支名称,点击Create Branch,你应该得到一个新的分支,你的丢失提交!
答案 2 :(得分:4)
如果您不想更改已分离的HEAD并希望直接使用以下命令转到最新的分支提交。
git checkout -
注意:我将删除已分离的HEAD中的所有更改。
答案 3 :(得分:0)
我尝试了这个场景,并发现git告诉我最后一次提交的SHA-1:
vors@localhost:~/git-test$ git checkout master
Warning: you are leaving 1 commit behind, not connected to
any of your branches:
ec600e6 333
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 ec600e6eb2473dd4f3732539c5c1fa5829f631b7
Switched to branch 'master'
你看到这条消息了吗?
答案 4 :(得分:0)
分离的头就可以了。
如果要还原提交,可以在特定分支上使用git revert
如果你想要脱离头并做出承诺;创建一个新分支(稍后合并);
答案 5 :(得分:0)
我的一位同事遇到了这种情况。在他的案例中,有分离的头部提交(他们在R-Studio中工作),并且该工具确实警告他们可以使用该引用和SHA引用创建分支...但是由于唯一的选择是“ Close”(关闭) --du!这是一个信息框-他们关闭了对话,并永远丢失了信息...
借助reflog
命令,我们可以看到所做的更改没有丢失。但是在我们的情况下,git branch
不能按预期方式工作...或者传入的git pull
确实使它混乱。我们必须将更改从reflog转移到新创建的分支:
git cherry-pick 0b823d42..3cce27fc
将所有需要的提交放入分支。然后,我们可以毫无问题地将分支合并到develop
中。
只要对所有人有帮助,我们都通过查看标记为“ checkout”(标识分支)之间的提交,来确定reflog
中 headed 上的提交移):
e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward
我们想要的是HEAD@{8}
至HEAD@{6}
(包括两者)。所以我们得到了他们:
git cherry-pick 0b823d42..3cce27fc
然后,通常的合并解决和最终提交使我们留给了lost_changes分支来托管我们认为丢失的独立工作。这次,将其合并到开发中是快速的。
答案 6 :(得分:0)
git reflog
以查看历史记录。 git checkout -b temp e35d2b3
切换到所需的提交,此处e35dd23是您的提交的哈希值。如果可以解决您的问题,请接受它作为答案。否则,请分享您的评论。