当我切换Git分支时,更改文件会发生什么?

时间:2016-08-10 17:20:55

标签: git sh

尽管使用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进行更改时,我不希望从我可能选择结帐的任何其他分支中看到它们?

3 个答案:

答案 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