如何撤消git add -f?

时间:2019-05-03 15:47:00

标签: git gitignore

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

由于某种原因,我曾经使用git add .idea/ -f强制git将.idea文件夹添加到我的仓库中。

我只想做一次。

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

3 个答案:

答案 0 :(得分:2)

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

  • 那些在您开始时位于索引中并且仍在那儿的原因是因为自那时以来您没有对其进行更改:它们之所以到达那里是因为您运行了git checkout个现有的提交。

    < / li>
  • 现在已在索引中的那些,因为您运行了git add file。那将文件 file 从工作树复制到索引。如果以前在索引中有 file 的副本(因为它是在您签出的提交中),那么,现在在目录中就有一个不同的副本。指数。如果以前(由于某种原因)在索引中没有 名为 file 的文件,那么现在是

索引也称为登台区域。当您使用git status时,Git会将索引的内容与HEAD(当前)提交的内容进行比较,并告诉您什么是不同,并说这些是针对进行的更改提交

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

删除文件的跟踪副本

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

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

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

但是假设您签出旧的提交。这样做时,.idea/somefile该旧提交中。该文件将被复制到您的索引中(这样.idea/somefile现在回到索引中到您的工作树中(因此{{1} }中的内容已替换为提交中保存的内容)。如果您现在选择从旧提交切换回没有没有.idea/somefile的新提交,Git将看到.idea/somefile在索引中,并且在您的工作树中,并且这两个与您要移开的提交中的文件匹配。因此,Git将从您的索引工作树删除 .idea/somefile并移至新提交。

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

请注意,Git实际上根本不存储目录。 Git仅存储文件-而不是单独存储,仅存储在一个或多个提交中。每当您检出一些包含名称为.idea的文件的提交时,Git 都会提取它,并在必要时创建 .idea/somefile。但是.idea/本身在Git中不是 ,只是.idea/

答案 1 :(得分:1)

从git缓存中删除.idea /:

$ git rm -r --cached .idea

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

$ git status
# .idea/ is ignored 

答案 2 :(得分:-1)

问题是.gitignore仅适用于未跟踪的文件。如果.idea中的文件已经是项目的一部分(因为您在以前的版本中添加了它们),则git将开始告诉您文件何时被修改,即使它位于.gitignore中。然后,为了避免git无法告诉您这些文件(假设您希望将它们保留在项目的历史记录中),您可以采取的措施是迫使git不再关心它们。用git update-index --assume-unchanged可以达到的目标。这是一个“每次回购”操作,因此其他开发人员也必须在其回购上也做同样的事情。

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

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