Git了解签出分支的行为以及文件的存在和不存在
这个问题的变化已经被问到和回答,但我仍然困惑,因为我的工作方式通过查孔书 我已经从github克隆了我的测试存储库。 我在这个文件中创建了一个名为afile.txt的文件,我将其暂存并提交 我在这个文件中创建了第二个文件,名为asecondfile.txt,我不会转移或提交它 现在我执行Git了解签出分支的行为以及文件的存在和不存在,git,git-checkout,Git,Git Checkout,这个问题的变化已经被问到和回答,但我仍然困惑,因为我的工作方式通过查孔书 我已经从github克隆了我的测试存储库。 我在这个文件中创建了一个名为afile.txt的文件,我将其暂存并提交 我在这个文件中创建了第二个文件,名为asecondfile.txt,我不会转移或提交它 现在我执行 $ git checkout -b testing Switched to a new branch 'testing' 当我列出文件时,我只看到一个secondfile.txt $ git checkout
$ git checkout -b testing
Switched to a new branch 'testing'
当我列出文件时,我只看到一个secondfile.txt
$ git checkout master
我对该文件进行了更改,不暂存或提交并执行
$ git checkout master
如果我cat asecondfile.txt,我可以看到我在测试分支中所做的更改
$ git checkout testing
我将更改转移并提交到asecondfile.txt
$ git checkout master
我列出了看不到aseconfile.txt的文件
我真的对这种行为感到困惑,并希望得到一个解释。当一个文件既没有暂存也没有提交时,git对此一无所知。这种路径称为“未追踪”。Git将这些放在一边,但在运行
Git status
时抱怨它们“未被跟踪”。(你可以停止抱怨,但在进入.gitignore
之前不要理会它)
但是,一旦文件被暂存,它就不再是“未跟踪的”。它现在是一个被跟踪的文件(将它添加到.gitignore
将没有帮助,它已经被跟踪)。一旦被跟踪的文件被提交,git就知道在从具有该文件的提交(如您刚才在测试中所做的提交)切换到不具有该文件的提交时将其删除
这就是您所看到的:git checkout master
删除了该文件,因为当您在branch测试时,该文件已提交(因此也在索引/暂存区域),而作为branchmaster
提示的提交没有该文件
一旦git将其删除(通过切换到master
),该路径就不再被暂存或提交,因此如果在切换到master
后创建一个新的asecondfile.txt
,则该文件为“未跟踪”文件。如果您随后要求git进行git签出测试
,默认情况下,它会抱怨并失败:它必须删除您的未跟踪文件,以便将其替换为具有(可能)不同内容的跟踪文件。说得好。另请阅读:在阅读您的回复后,它帮助我将工作区域可视化为跨分支的“普通”。如果我对一个分支中的文件进行了更改,但没有提交,则尝试切换到另一个分支(存在文件的另一个已提交版本)会失败,因为工作区域将被覆盖。Richard-这正是我要谈论的章节:)@torek你的答案遗漏了一些重要的东西-在你的第二段中,你注意到该文件是伪造的,但在第三段中,你说它已被提交。我认为您忘记添加一行,该行指示文件在暂存后已提交。(这肯定会让git新手感到困惑,应该澄清一下。)我将进行编辑。另外,在第二段中,您说,“既然它被跟踪了,git知道在从包含它的提交切换时删除它…”-这是完全错误的。只有在提交文件后才会出现这种行为。