首页 > 解决方案 > 以下未跟踪的工作树文件将被合并覆盖 - 意思是?

问题描述

我已经查看了与此类似的其他问题,但谁能解释在这种情况下发生了什么?

所以我有一个运行 master 的开发服务器,我从 master 创建了一个名为 Feature_123 的分支。

我有一个 master 的本地副本,我确保它是最新的,使用 git pull origin master,然后创建了一个本地分支 feature_123,并提交了我的更改并将它们推送到 origin feature_123。

然后我在我的开发分支上进行了抓取,并尝试将 Feature_123 与 feature_123 合并,并得到以下消息:

错误:以下未跟踪的工作树文件将被合并覆盖:test_files/lists/file_list

这是另一个开发人员正在处理的文件,但我很困惑,因为该文件在最新的 git pull 之后位于我的本地仓库中。

那么,如果文件在我的本地存储库中,为什么在我的服务器上未跟踪该文件?这里发生了什么?

标签: git

解决方案


在 Git 中,未跟踪的字面意思是不在索引中(但必须在工作树中,否则根本没有文件)。test_files/lists/file_list工作树中但不在索引中的文件也是如此。

请记住,索引(也称为暂存区域或有时称为缓存)保存此提交中每个文件的副本,准备放入下一次提交。您可以使用以下命令覆盖存储在索引中的文件版本git add:这会将您在工作树中更新的所有内容复制到您的索引中。但是您的工作树中可以有现在不在索引中的文件。这些是您未跟踪的文件。

(如果这些文件被忽略以及未跟踪,git status则不会抱怨它们。否则,它会。请注意,您不能忽略已跟踪的文件:只能忽略未跟踪的文件。)

签出提交,使其成为当前提交,从该提交中填写您的索引,同时填写您的工作树。这样,您当前的提交、您的索引和您的工作树都匹配。这就是为什么您必须git add在编辑完文件后进行归档:您必须将新版本复制回索引中,覆盖之前的内容。该git commit命令从当时索引中的任何内容构建其新提交,因此您必须更新任何您想要不同的文件。

换句话说,无论现在索引中的内容是什么,这都是您提议的 next commit。它开始匹配你当前的提交——所有文件都具有相同的内容——然后你使用git add, 修改它,以便为下一次提交提议所有更改的文件,以及所有.

但是请注意,仅仅因为某些文件现在不在您的索引中,并不意味着它不在某些提交中!您可以从索引和工作git rm somefile

显然,您也可以在工作树中创建一个文件而不将其添加到您的索引中(因此即使您进行新的提交也不提交它)。该文件未被跟踪,因为它不在您的索引中。然而,与此同时,其他可以进行具有该文件的新提交。当您从其他人那里获得这些提交然后运行git merge时,您的 Git 会告诉您:嘿,您在工作树中拥有的未跟踪文件......我将不得不用另一个文件覆盖它男人的承诺!请先把它移开,或者提交它,或者别的什么,这样我就不会覆盖你未跟踪的文件!

这就是你现在看到的。


推荐阅读