已删除 Files/Folders 坚持分支更改 Git

Deleted Files/Folders persisting on branch change Git

我有两个分支,master,feature/...

功能已从 master 中删除,要求清理项目。我在哪里删除文件和目录。完成我的工作,git add .git commit -m 'updated'git push。总而言之,我看到了远程来源的更新。我回到 master,正如预期的那样,我删除的代码重新出现。

问题: 我切换回我删除 files/folders 的功能分支,但我删除的 files/folders 仍然存在。即使我可以清楚地看到文件已在远程 origin 分支上删除。

这似乎是我找到的最佳分辨率,How do I force "git pull" to overwrite local files?

但是,它并没有真正回答我为什么会这样的问题?当你认为 Git 只会在分支交换机上更新它时,为什么我必须做所有这些刷新?

被 Git 跟踪 的文件将被 Git 从它们存在的提交切换时删除(因此被跟踪 1) 到它们不存在的提交(因此不被跟踪)。通过从存在并跟踪这些文件的提交切换到不存在且未跟踪它们的提交来删除它们,它们不在工作树中,也不是未跟踪的文件。

你是否应该以某种方式——通过任何意味着——从跟踪文件的提交切换到不跟踪文件的提交,从而删除文件的副本从索引 2 中删除文件,这样它就不会被跟踪,同时也不会从您的工作树中删除文件的副本,3 该文件现在是未跟踪 因此Git 不会 删除它。有多种方法可以实现这一点,包括 运行ning git rm --cached,它会从索引中删除文件的副本,而不会触及工作树中的文件副本。

Git 很少做,也不关心 文件夹: 文件夹是您 计算机系统的省份、困扰和问题 ,而不是 Git。所有 Git 关心的是 文件 ,它们的名称出于某种原因,您的计算机坚持分成以文件 Y 片结尾的文件夹 Y 片:dir/sub/file.ext,在Git眼里是一个文件,不是你电脑上的文件:它是一个名为dir的文件夹(或目录)包含一个名为 sub 的文件夹,其中包含一个名为 file.ext 的文件。 Git 通过 creating dir/ 尽力满足您的操作系统对 "folders" 的痴迷,以便它可以 create dir/sub/ 这样它就可以按需创建 dir/sub/file.ext——它关心的文件。当Git正在清理一堆文件,比如dir/sub/file1.extdir/sub/fileN.ext,如果已经清理了last 文件,它也会删除 dir/sub/。但是如果 any 文件(包括未跟踪的文件)保留在该目录中,它就不能这样做,所以在这种情况下,它不会......并且删除了所有 dir/sub/* 文件——记住,Git,这些只是 文件,这里不涉及文件夹——它正在跟踪,Git 现在不知道dir/sub/ 甚至不再存在。这就是 你的 问题;如果您从那里删除了最后一个未跟踪的文件,您也可以删除该目录。

几十年来,我看到过各种极端情况,其中 Git 没有 删除空文件夹/目录,尽管在更新索引时刚刚清除了它们.随着时间的推移,它们已经减少了:现在比 2005 年 稀有(以至于我已经有几年没有亲眼见过它了)。如果你能找到一个 repeatable 序列将这些留在后面,不涉及操作员错误(未跟踪文件),这是一个错误,你可以使用 [=149 提交错误报告=]伙计们。4


1一个 Git 文件被 跟踪 当且仅当它在索引中。这就是全部内容:索引中存在文件意味着该文件已被跟踪。索引中缺少文件意味着未跟踪该文件。

检查索引内容——注意这很长,不适合用户日常使用——运行 git ls-files --stage。这个东西——Git 调用 index 的实体——是一个核心和关键的概念;您 必须 了解 Git 如何使用它,至少在某种程度上,才能有效地使用 Git。不幸的是,许多 Git 教程试图隐藏它。 Git本身表现的不是很好:git ls-files --stage一点都不友好

该索引也称为 暂存区,以及(现在很少见)缓存。这三个名称指的是同一事物,尽管某些命令(例如 git apply)以不同的方式使用 --cached--index

2从技术上讲,索引中的 "copies" 个文件实际上是对 Git 内部 blob 对象的引用。请参阅脚注 1 的 git ls-files --stage 输出:索引中的每个文件条目由一个 mode、一个 blob 哈希 ID、一个 暂存槽编号——通常为零——和一个名称。 (该索引还包含缓存数据,因此是其三个备用名称之一。)

3您的工作树中的文件副本供您使用。那就是 为什么 这是你的工作树:这是你工作的地方。 Git 不使用这些文件进行 next 提交;它使用索引中的副本/引用。在进行新提交时,重要的是 index,并且 git checkout 首先提取已签出的提交 索引,然后再取消 -冻结和解压缩并通常取消 Git 化您的文件,以便您可以在工作树中访问它们。

这也是为什么你必须一直git add文件的原因:git add意味着将文件复制回索引,即替换冻结格式的 blob 对象,用现在工作树中的任何内容创建一个新对象。请注意 git add 实际上会 从索引中删除 一个文件,如果该文件在工作树中 ,那么在从这个意义上说,它实际上是 使索引副本与工作树副本匹配 ,即使这意味着 删除文件 .

4如果您使用的是 Git 的旧版本,请在归档前升级。如果 git --version 打印任何早于 2.17 的东西,那是相当古老的。当前版本为 2.25.1.