如何撤消 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
对我来说效果很好。
我的存储库中有一个文件夹 .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
对我来说效果很好。