尽管使用Git很长一段时间,我仍然无法理解它的分支机制。特别是,考虑一个新项目foo
,其中包含由这些简单命令初始化的单个文件bar.txt
:
$ mkdir foo
$ cd foo
$ git init
$ touch bar.txt
$ git add .
$ git commit -m 'Initial commit'
现在,当我创建分支foobar
时,git branch
显示我仍在master
上:
$ git branch foobar
$ git branch
foobar
* master
但是当我对文件bar.txt
进行更改时:
$ echo quux >> quux.txt
$ git status
modified: quux.txt
然后,当我签出另一个分支时,我可以看到文件bar.txt
也被修改了:
$ git checkout foobar
$ git status
modified: quux.txt
我已经知道这种行为允许我选择我想要提交更改的分支,但我发现它很烦人。我怀疑我无法理解Git分支背后的基本思想。有没有办法告诉git当我对master
进行更改时,我不希望从我可能选择结帐的任何其他分支中看到它们?
答案 0 :(得分:5)
在您提交之前,您在工作目录中所做的更改不是任何分支的一部分。所以,当你出错时,你会想到当你签出一个分支然后修改一个文件时,你已经在分支机构上进行了修改"。您尚未完成此操作,您已修改了工作目录。
所以你有一个基于一个分支的脏工作目录,你检查另一个分支 - 未提交的更改保留在工作目录中,否则他们不会保存在任何地方。您将无法再次签出第一个分支并重新出现本地更改。
在切换分支之前,您可能想要做的是git stash
。这会将本地更改保存到临时分支,您可以稍后使用git stash pop
返回。
答案 1 :(得分:2)
如果结帐影响dirty
的文件,通常不允许切换分支。在您的情况下,对文件的修改不会影响foobar的结帐。如果要检出的分支的本地修改文件发生更改,则结帐将中止。在切换分支时,没有为单个分支保留修改文件的概念。如果您在查看foobar
时不想进行这些本地修改,则可以使用以下方法:
stash save
您的更改并清除您当地的修改。这允许在切换回master时重新应用更改。 (git stash save --include-untracked
也可以捕获新的和尚未上传的文件)reset --hard
您的当前分支到HEAD
之后退房(放弃当然的更改)checkout -f foobar
也会丢弃本地更改(与重置相同的效果)。答案 2 :(得分:1)
您可以使用stash
存储暂存/未更改的更改:
git stash
现在您可以使用新的工作目录切换分支:
git branch master
git status
# On branch master
nothing to commit, working directory clean
要应用您的隐藏更改:
git branch foobar
git stash apply