问题描述
我知道有一个快捷方式,但不记得了。
我在一个存储库中工作,我需要添加和提交大约 8 个文件,还有 2 个已修改,我不需要提交。我不想为我提交的每个文件运行 git add <file>
,而是想运行 2 个命令来忽略我不需要添加的文件,然后为我正在添加/提交的 8 个文件运行 git add .
.
我认为忽略我不需要的文件的命令是 git checkout -- <file I don't need>
,但我不断收到错误 pathspec 'file I don't need' did not match any file(s) kNown to git
我想,当然,这是因为这两个文件仍未被跟踪。所以我用 git add .
添加了所有内容,然后运行 git checkout -- <file I don't need>
。但是,当我在那之后运行 git status
时,这些文件仍然显示为已提交。
任何建议将不胜感激!
解决方法
要将暂存区中的文件取出,请使用 git reset
:
git reset -- file1 file2
,
我想,当然,这是因为这两个文件仍未被跟踪。
如果是这种情况,也许您想要的是 git add -u
或 git add -u .
。这与 git add .
非常不同,因为 -u
表示更新。然后必须问一个显而易见的问题:更新什么?这在the documentation中得到了回答:
-u
、--update
更新索引就在它的位置
已经有一个与
如果在使用 -u
选项时没有给出
这就是答案:-u
表示更新 Git 的索引。索引也称为暂存区,它保存了每个文件的副本,准备提交,与 Git 在进行下一次提交时将使用的格式完全相同。因此,更新索引会更新提议的下一次提交。
请注意,如果某个文件存在于 Git 的索引中,但您已将其从工作树中删除,git add -u
将从 Git 的索引中删除该文件。也就是说,提议的下一次提交现在也缺少文件,就像工作树一样。完成此操作后,稍后的 git add -u
将不会重新添加该文件,因为它已经不在 Git 的索引中。您需要一个非 -u
git add
将文件放入 Git 的索引中,以便 git add -u
会注意到此后工作树副本是否已被修改,并选择新的文件内容。
关于旧版 Git 的括号注释是描述 git add -u
(未列出文件)在 Git 1.x 版中的工作方式。新的 2.x 行为检查当前工作目录之上的位置;要获得 Git 1.x 行为,请使用 git add -u .
。这是有效的,因为 .
表示当前工作目录和所有子目录,这当然是 Git 1.x 解释裸 git add -u
的方式。