如何撤消 git 添加 -f?

How to Undo git add -f?

我的存储库中有一个文件夹 .idea/,它在 .gitignore 列表中。

出于某种原因,我曾使用 git add .idea/ -f 强制 git 添加 .idea 文件夹到我的存储库。

我只想做一次。

但我发现当我在另一个时间使用 git add . 时,git 仍然将 .idea 的更改添加到我的存储库中。非我所愿,如何解决?

从 git 缓存中删除 .idea/:

$ git rm -r --cached .idea

确保 .idea/ 已添加到 .gitignore 列表中。现在,git 应该忽略 .idea 目录:

$ git status
# .idea/ is ignored 

问题是 .gitignore 仅适用于 未跟踪 文件。如果 .idea 中的文件已经是项目的一部分(因为您在以前的修订版中添加了它们),那么 git 将开始告诉您文件何时被修改,即使它在 .git 中也会忽略。为了避免 git 告诉您这些文件(假设您想将它们保留在项目的历史记录中),您可以做的是强制 git 不再关心它们。用 git update-index --assume-unchanged 可以实现。这是一个 'per repo' 操作,因此其他开发人员也必须对他们的回购协议执行相同的操作。

https://git-scm.com/docs/git-update-index

附带说明一下,将 IDE 文件之类的元数据添加到项目中并不是一个好主意,但这取决于您。

请记住,Git 主要是关于进行 new 提交。要进行新的提交,您通常会 运行 git commit。此时使用 index 中的任何文件。索引中的文件是:

  • 那些在你开始时就在索引中,并且因为你从那时起就没有改变它们而仍然存在的那些:它们之所以存在是因为你 运行 git checkout 一些现有提交。

  • 现在在索引中的那些,因为你运行git添加<em>文件</em>.将文件 file 从您的工作树复制到您的索引。如果之前索引中有 file 的副本(因为它在您签出的提交中),那么现在有一个 different 复制到索引中。如果之前索引中 没有 一个名为 file 的文件(无论出于何种原因),那么现在 .

索引也称为暂存区。当您使用 git status 时,Git 将索引的内容与 HEAD(当前)提交的内容进行比较,并告诉您 不同 ,说这些是 为提交 .

准备的更改

索引中的文件称为已跟踪 个文件。

删除文件的跟踪副本

您可以使用 git rm --cached <em>file</em> 删除 index 任何文件的副本,而不触及该文件的 work-tree 副本。因此,如果 .idea/somefile 现在在索引 ,您可以使用 git rm --cached .idea/somefile 将其删除。您可以使用 git rm -r --cached .idea 删除索引中以 .idea/ 开头的所有文件:这不会触及您的工作树(您可以在其中查看您的文件并对其进行处理),但会从索引中删除所有 .idea/*.idea/**/* 文件。

旧的提交不会改变;这带来了新的危险

无论您现在做什么,任何之前包含 .idea/somefile 的提交之后都会继续包含 .idea/somefile。该提交 无法更改; 您最多只能停止使用它。例如,你可以做一个新的和改进的提交,它有相同版本的所有相同文件, 除了 它省略了 .idea/somefile。然后,您使用新的提交(没有),而不是原来的提交(其中继续包含 .idea/somefile),这样 Git 就不会尝试创建 .idea/somefile当您提取新提交时。

但是假设您确实检查了旧的提交。当你这样做时,.idea/somefile 将是 in 旧提交。该文件将被复制到您的索引中(因此 .idea/somefile 现在 回到索引 中) 到您的工作树(这样您的工作树中的 .idea/somefile 已被提交中保存的替换)。如果您现在选择从旧提交切换回 没有 具有 .idea/somefile 的较新提交,Git 将看到 .idea/somefile 是在您的工作树中的索引 and 中,并且这两个与您要离开的提交中的文件匹配。所以Git将从你的索引你的工作树[=104]中删除.idea/somefile =] 并移动到新提交。

如果这些文件很重要且难以恢复,那么在访问包含这些文件的历史提交时,您必须非常小心,一旦您做出了 不要 保存这些文件。例如,您可能希望首先将工作树的 .idea 目录 ("folder") 移开,以便当 Git 提取旧提交时,它会创建一个新的 .idea 当你回到较新的提交时你可以丢弃。

请注意 Git 实际上根本不存储目录。 Git 仅存储 文件 — 也不是单独存储,只是在一个或多个提交中。每当你签出一些包含名称为 .idea/somefile 的文件的提交时,Git 提取它,creating .idea/ 如果有必要这样做。但是 .idea/ 本身在 Git 中是 而不是 ,只是 .idea/somefile.

Incase 其他人来这里回答不同的问题:如何撤消 git add -f 以像以前一样,允许将来的 git add -f 工作,如果你想添加它,否则保持忽略状态,我发现常规 git reset 对我来说效果很好。