Git理解checkout分支的行为以及文件的存在和缺失

时间:2015-09-23 02:27:54

标签: git git-checkout

这个问题的变化已经被问及并得到了回答,但是当我通过Chacon书的方式工作时,我仍然感到困惑。

我从github克隆了我的测试库。 我在这个名为afile.txt的文件中创建了一个我暂存和提交的文件 我在这个名为asecondfile.txt的第二个文件中创建了一个我不会暂存或提交的文件

现在我执行

$ git checkout -b testing
Switched to a new branch 'testing'

当我列出文件时,我只看到asecondfile.txt。

我对此文件进行了更改,不要暂存或提交并执行

$ git checkout master

如果我cat asecondfile.txt,我可以看到我在测试分支中所做的更改。

$ git checkout testing

我暂停并将更改提交到asecondfile.txt。

$ git checkout master

我列出的文件没有看到aseconfile.txt。

对这种行为感到非常困惑,并且很乐意作出解释。

1 个答案:

答案 0 :(得分:2)

当文件既没有暂存也没有提交时,git对此一无所知。这样的路径被称为“未跟踪”。 Git独自留下这些,但是当你跑git status时,他们抱怨他们“没有跟踪”。 (你可以闭嘴,但在你到达.gitignore之前忽略它。)

一旦文件上演,它就不再“未跟踪”了。它现在是一个跟踪文件(并将其添加到.gitignore将无济于事,它已被跟踪)。现在它已被跟踪,git知道删除它从具有它的提交(例如您在testing上提交的提交)切换到不提交的提交。

这就是你所看到的:git checkout master删除了文件,因为当你在分支testing时它被提交(因此也在index / staging-area中),并且提交是分支master的提示具有该文件。

一旦git删除了它(通过切换到master),该路径就不再是暂存或提交的,所以如果你在切换到{之后创建一个新的asecondfile.txt {1}},这是一个“未跟踪”的文件。如果你然后问git master它应该在默认情况下抱怨并失败:它必须删除你未跟踪的文件,以便用跟踪文件(可能是)不同的内容替换它。