2016-06-07 85 views
0

这是一个总的noob git问题,我意识到人们已经问过类似的问题,但我不知道该怎么做。我正在研究一个项目,并想尝试一些东西。它不工作,现在我想回去。git没有提交分支 - 还原变化

在那里我开始我的实验来看,我这样做:

的Git分支实验
混帐结账实验

然后我做了一堆东西。然后我回去试了这一点:

git的结帐发展

但是我所有的实验性更改仍然存在。我可以回到之前的提交,但是这会失去很多工作。

我意识到的是我应该在分支之前进行修改。那么,我在SourceTree中探索一下,试图感受一下我的项目所处的状态。但是现在我陷入了困境。根据SourceTree,最后一次提交是在12小时前。未提交的更改仅显示了我8小时前做出的两项非常小的修改。我似乎失去了我工作的最后8个小时。两个分支都是一样的。

我拧了吗?有没有办法让我回到我分叉的地步?谢谢。

+0

你是否也检查过实验分支? –

+0

是的。他们都显示相同的状态。 – Alex

+0

我读过git文章:_note说如果你的工作目录或临时区域有未提交的更改与你正在检查的分支发生冲突,那么Git不会让你切换分支。切换分支时最好有一个干净的工作状态。有很多方法可以解决这个问题(即存储和提交修改),我们稍后会介绍,存储和清理_ –

回答

0

是的,你搞砸了,但好事是你会从这个错误中吸取教训。当您使用Git时:频繁使用commit,使用切换上下文时使用stash

在你的例子中,你做了一些修改,例如你修改了foo并创建了bar。你可以看到的变化实验开始前:

$ git status 
On branch master 
Changes to be committed: 
     new file: bar  
Changes not staged for commit: 
     modified: foo 

在这一点上,如果你创建一个新的branch并在其上进行切换,什么都不会我修改既不在你working directory或您index因为新的分支experiment指向与主人master一样提交。

$ git checkout -b experiment 
A  bar 
M  foo 
Switched to a new branch 'experiment' 

$ git status 
On branch experiment 
Changes to be committed: 
     new file: bar  
Changes not staged for commit: 
     modified: foo 

所以从这里如果你做了改变,你会失去你以前的工作。也就是说,这并不完全正确,因为bar在索引上(在执行git status时为绿色)。如果修改bar您的通知,您的工作目录的变化,但以前的版本仍保留在指数:

$ echo "bar" >> bar 
$ git status 
On branch experiment 
Changes to be committed: 
     new file: bar 
Changes not staged for commit: 
     modified: bar 
     modified: foo 

两个最好的解决方案,以保持你的变化轨迹是:

  1. 提交频频对虚拟分支。
  2. 使用git stash在上下文之间切换。

在你的情况,你会犯一个虚拟分支更改开始实验前:

$ git checkout -b previous_changes 
$ git commit -am "Something I want to keep" 
$ git checkout -b experiment [email protected]{1} 
do some changes... 
0

我意识到那是什么,我应该犯我我改变之前分支。

是的,当您有未提交的更改并且切换到新的分支时,那些未提交的更改将继续存在,并且在新分支上时仍然存在。由于它们没有提交,所以这些更改不属于某个分支甚至是存储库,因此您无法恢复这些更改。

如果您继续在新分支上工作,您最终修改了这些更改,甚至可能犯下这些更改或将它们还原。在这一点上,他们迷路了。

从未添加到存储库的更改不属于存储库,Git不知道它们。所以不幸的是,如果你不能从你在新分支上做的实际承诺的修改中恢复它们,它们就会丢失。