我已经看过其他与此类似的问题,但是谁能解释这种情况下发生了什么?
因此,我有一个运行主服务器的开发服务器,并从主服务器创建了一个名为Feature_123的分支。
我有一个本地主副本,并确保它是最新的,并使用git pull origin master,然后创建了LOCAL分支feature_123,并提交了我的更改并将其推送到原始feature_123。
然后我在开发分支上进行了获取,并尝试将Feature_123与feature_123合并,并获得以下消息:
错误:以下未跟踪的工作树文件将被覆盖 通过合并: test_files / lists / file_list
这是另一个开发人员正在处理的文件,但是我感到困惑,因为该文件在最新的git pull之后位于我的本地存储库中。
那么,如果文件在我的本地仓库中,为什么在服务器上未跟踪该文件?这是怎么回事?
答案 0 :(得分:3)
在Git中,未跟踪的字面意思是不在索引中(但必须在工作树中,否则根本就没有文件)。因此test_files/lists/file_list
是一个文件,它在您的工作树中,但不在您的索引中。
请记住,索引(也称为暂存区域或有时称为 cache )保留此提交中的每个文件的副本,准备放入 next 提交。您可以使用git add
覆盖存储在索引中的文件的版本:这会将您在工作树中更新的内容复制到索引中。但是,您现在可以在工作树中拥有不在索引中的 文件。这些是您未跟踪的文件。
(如果这些文件被忽略和未跟踪,则git status
不会抱怨它们。否则,它将抱怨。请注意,您不能忽略已跟踪的文件:只能忽略未跟踪的文件。)>
检出一个提交,使其成为当前提交,根据该提交填充您的索引,并同时填充您的工作树。这样,您当前的提交,索引和工作树都将匹配。这就是为什么在编辑文件后必须git add
个文件:您必须将新版本复制回索引,覆盖以前的文件。 git commit
命令会根据当时索引中的内容建立新的提交,因此您必须更新任何想要不同的文件。
换句话说,无论当前索引中有什么,这就是您的建议的下一次提交。它首先匹配您当前的提交(所有文件具有相同的内容),然后使用git add
对其进行修改,以建议下一次提交所有未更改的文件,以及所有是的。
但是,请注意,仅仅是因为某些文件当前不在索引中,并不意味着它不在某些提交中!您可以从索引和工作树(git rm somefile
)中删除文件,现在该文件位于当前提交中,但不在索引中,也不在工作树中—不会出现在您所做的下一个提交中。
很显然,您还可以在工作树中创建文件而无需将其添加到索引中(因此即使提交新的提交也无需提交)。该文件未跟踪,因为它不在您的索引中。但是,与此同时,某人 else 可以进行做具有该文件的新提交。当您从其他人那里获得这些提交,然后运行git merge
时,您的Git会告诉您:嘿,您在工作树中未跟踪的这个文件……我必须覆盖它与另一个家伙的承诺!请先删除它,或提交它,或执行其他操作,以免覆盖未跟踪的文件!
这就是您现在所看到的。