分支后恢复git损失?

时间:2017-03-28 15:21:27

标签: git

我似乎在错误的分支后丢失了一些代码,并希望有人可以帮我恢复它。在我工作的时候,我正在遵循SO建议......

我在我的主分支中对一个与电子邮件处理相关的文件进行了一系列更改,并最终意识到我应该在一个单独的分支中完成这项工作,因为它花了太长时间而且更改是太重要了,我需要处理修补程序。我没有提交电子邮件代码,因为它还没有准备好提交。按照这里的指南,我做了以下几点:

$ git checkout -b email # to create the new branch with my current work
$ git checkout master
$ git reset --soft HEAD~3 # intended to get master back to original state
$ git pull # make sure I'm up-to-date
# seemed not to work, so I tried:
$ git checkout -- lib/email.rb # intended to get this file back to orig state in the master branch

然后我创建了一个修补程序分支,对其进行了处理,将其合并到master,并将其删除。

然后我回到了我的"电子邮件"分支,但我所做的改变不存在;它从一段时间以前就恢复了。而且我不知道为什么,因为我没有(故意)在"电子邮件"中做任何事情。科。显然,工作也不在主分支中,因为我重置了它。

我的reflog看起来像这样,在相关的时间(这是一个小时前,所以希望还没有垃圾收集):

87067bb HEAD@{4}: checkout: moving from master to email
41fddb9 HEAD@{5}: merge hotfix: Fast-forward
87067bb HEAD@{6}: checkout: moving from hotfix to master
41fddb9 HEAD@{7}: commit: refactored database call to avoid need to send DB info
87067bb HEAD@{8}: checkout: moving from email to hotfix
87067bb HEAD@{9}: checkout: moving from hotfix to email
87067bb HEAD@{10}: checkout: moving from master to hotfix
87067bb HEAD@{11}: pull: Fast-forward
154f1f3 HEAD@{12}: reset: moving to HEAD~3
87067bb HEAD@{13}: checkout: moving from email to master
87067bb HEAD@{14}: checkout: moving from master to email

有什么方法可以让这些代码回来吗? (在此期间,没有其他人一直在研究该项目。)谢谢!

2 个答案:

答案 0 :(得分:2)

  

git checkout -b email

     

然后我回到了我的“电子邮件”分支机构,但我所做的更改并不存在;它从一段时间以前就恢复了。

不,它没有。你从未对那个分支做过任何事情;你只创建了一个分支本身,它只是一个标签,指向你当时所做的任何提交(我猜是master)。

您需要git addgit commit进行更改。

  

我不知道为什么,

这个是你的问题。虽然使用SE来解决关于git和类似问题的硬坚果是好的,但事先从其他来源获得对它的基本了解更为重要。如果没有,你很容易陷入“教程”陷阱 - 也就是说,执行一些命令,你不知道他们做了什么,而没有更大的图片。

所以... http://git-scm.com上的在线“git book”是你的朋友。阅读它,至少与您的日常操作相关的几个章节,对于git的大多数用途,您应该没问题。

从SE输入命令时,我也强烈建议您查看他们的操作。对于git,这意味着git help。与此特定示例中的git help checkout类似。包含的参考页面编写得非常好,通常会解释正好正在发生什么,至少在你掌握了基础知识之后(什么是提交,什么是分支等)。

我希望这不会像居高临下一样过来。如果有办法恢复你的文件,我会解释一下,但不幸的是你没有任何痕迹地擦掉它们(除非你有一个文件系统备份,也许你正在快照文件系统......我猜不太可能)。 / p>

答案 1 :(得分:1)

您提到电子邮件代码未提交。

  

我没有提交电子邮件代码,因为它还没有准备好提交。

如果是这种情况,Git没有它的记录,也无法恢复,因为Git只存储提交。代码“没有准备好提交”的概念不适用于Git,因为没有其他人可以看到你提交的提交,除非你选择推送它们。保存正在进行的工作的一些选项:

  • 创建正在进行的工作分支,并将更改保存在那里。

    git checkout -b email-wip  
    git add .  
    git commit -m "Still working on this" 
    
  • 经常提交给电子邮件分支,但在推送之前使用interactive rebase将这些提交压缩为“可共享”提交。

    git add .  
    git commit -m "Squash this later, still in progress"  
    git checkout master  
    [some time later]  
    git checkout email-branch  
    [fix things up]  
    git add .  
    git commit -m "Good professional commit message here"  
    git rebase -i   
    [Follow text prompt to combine above commits. No one will ever see the temporary one.]  
    git push  
    
  • 使用git stash命令。

    git stash  
    git checkout master  
    [do hot fix stuff]  
    git checkout email-branch  
    git stash pop