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

6
尽管我已经使用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

然后当我切换到另一个分支进行checkout时,我发现文件bar.txt在那里也被修改了:

$ git checkout foobar
$ git status
modified: quux.txt

我已经知道这种行为允许我选择要提交更改的分支,但我觉得它很烦人。我怀疑我没有理解Git分支背后的基本思想。有没有一种方法告诉Git,当我对master进行更改时,我不希望它们在我选择检出的任何其他分支中可见?


如果你想这样破坏 Git,请在切换分支之前始终进行提交,然后在检出时重置提示,如果那让你得到了一个 WIP 提交。 - jthill
2
我的问题是,为什么我要通过这种方式削弱git?为什么当我切换到分支b时,我在分支a中进行的更改可用是一个好主意。这是一种可取的功能吗? - Boris Stitnicky
因为需要做什么和应该提交到哪个分支是两个独立的问题。 - jthill
3个回答

8
在提交更改之前,您在工作目录中所做的更改并不属于任何分支。因此,您错误地认为当您检出一个分支然后修改文件时,您已经在分支上进行了修改。实际上,您只是修改了工作目录。
因此,您有一个基于一个分支的脏工作目录,并且您检出另一个分支 - 未提交的更改仍留在工作目录中,否则它们将无处保存。您将无法再次检出第一个分支并使本地更改重新出现。
您可能想要在切换分支之前使用“git stash”。这将把本地更改保存到一个临时分支中,稍后可以使用“git stash pop”恢复它们。

git stash popgit stash apply 的同义词吗? - Boris Stitnicky
1
不是的;git stash pop 只是丢弃 stash 中的顶部项。但是,你可以将 git stash drop 看作是 git stash apply + git stash pop(如果应用成功)。 - chepner
4
我认为正确的方式是:pop = apply + drop,意思是 pop 等同于将 applydrop 结合起来。 - user2404501

2

通常情况下,如果检出会影响到脏文件(dirty),则不允许切换分支。在你的情况下,对文件的修改并未影响到foobar的检出。如果要检出的分支中有本地修改的文件更改,则检出将会终止。在切换分支时,没有保留单个分支的修改文件的概念。如果您不想在检出foobar时保留这些本地修改,您有以下几种可能性:

  • stash save 您的更改并清除本地修改。这允许您在切换回主分支时重新应用更改。(使用 git stash save --include-untracked 以捕获新的、未暂存的文件)
  • reset --hard 将当前分支重置为 HEAD,然后再检出(当然会丢弃更改)
  • checkout -f foobar 也可以放弃本地修改(与重置的效果相同)。

2
您可以使用“stash”来存储已暂存/未提交的更改:
git stash

现在您可以使用全新的工作目录切换分支:

git branch master
git status
# On branch master
nothing to commit, working directory clean

应用您的存储的更改:

git branch foobar
git stash apply

当我执行 git stash 命令时,新创建的/删除的文件是否也会被暂存(未创建/未删除)? - Boris Stitnicky
这可以使用--include-untracked选项来实现,但需要注意不要错过它。请参见https://git-scm.com/docs/git-stash(保存)。 - Andreas Jägle
@BorisStitnicky 是的,他们可以!他们使用git stash apply --index来获取这些命令的相同原始输出。 - Nick Bull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接