Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git了解签出分支的行为以及文件的存在和不存在_Git_Git Checkout - Fatal编程技术网

Git了解签出分支的行为以及文件的存在和不存在

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

这个问题的变化已经被问到和回答,但我仍然困惑,因为我的工作方式通过查孔书

我已经从github克隆了我的测试存储库。 我在这个文件中创建了一个名为afile.txt的文件,我将其暂存并提交 我在这个文件中创建了第二个文件,名为asecondfile.txt,我不会转移或提交它

现在我执行

$ 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
测试时,该文件已提交(因此也在索引/暂存区域),而作为branch
master
提示的提交没有该文件


一旦git将其删除(通过切换到
master
),该路径就不再被暂存或提交,因此如果在切换到
master
后创建一个新的
asecondfile.txt
,则该文件为“未跟踪”文件。如果您随后要求git进行
git签出测试
,默认情况下,它会抱怨并失败:它必须删除您的未跟踪文件,以便将其替换为具有(可能)不同内容的跟踪文件。

说得好。另请阅读:在阅读您的回复后,它帮助我将工作区域可视化为跨分支的“普通”。如果我对一个分支中的文件进行了更改,但没有提交,则尝试切换到另一个分支(存在文件的另一个已提交版本)会失败,因为工作区域将被覆盖。Richard-这正是我要谈论的章节:)@torek你的答案遗漏了一些重要的东西-在你的第二段中,你注意到该文件是伪造的,但在第三段中,你说它已被提交。我认为您忘记添加一行,该行指示文件在暂存后已提交。(这肯定会让git新手感到困惑,应该澄清一下。)我将进行编辑。另外,在第二段中,您说,“既然它被跟踪了,git知道在从包含它的提交切换时删除它…”-这是完全错误的。只有在提交文件后才会出现这种行为。