是的,你搞砸了,但好事是你会从这个错误中吸取教训。当您使用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
两个最好的解决方案,以保持你的变化轨迹是:
- 提交频频对虚拟分支。
- 使用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...
你是否也检查过实验分支? –
是的。他们都显示相同的状态。 – Alex
我读过git文章:_note说如果你的工作目录或临时区域有未提交的更改与你正在检查的分支发生冲突,那么Git不会让你切换分支。切换分支时最好有一个干净的工作状态。有很多方法可以解决这个问题(即存储和提交修改),我们稍后会介绍,存储和清理_ –