`git add .`和`git add -u`有什么区别? (注:这是一个提问标题,无需回答)

77

我曾经认为它们的工作方式是相同的,都将每个文件添加到索引中。但是我似乎错了。

  • git add .git add -u有什么区别?
3个回答

79

这是git的一个陷阱,在此中提到(Git 2.0之前)。

git add .只会添加已经存在的内容,而不会添加已经删除的内容(如果已被跟踪)。

git add .
git commit
git status
//hey! why didn't it commit my deletes?, Oh yeah, silly me
git add -u .
git commit --amend

git add -A会同时处理这两个步骤...


Git 2.0开始,默认使用git add -A

git add <path>现在与"git add -A <path>"相同,所以"git add dir/"将注意到您从目录中删除的路径并记录删除。
在较旧的 Git 版本中,"git add <path>"会忽略移除操作。

如果确实需要,您可以使用"git add --ignore-removal <path>"仅添加<path>中新增或修改的路径。


警告(2013年4月 git1.8.3,为即将推出的 git2.0)。
我已修改我的答案,建议使用git add -u .而非git add -u

git add -u在 Git 2.0 中将操作整个树,以保持与"git commit -a"和其他命令的一致性。
因为没有机制使"git add -u"像"git add -u ."那样工作,所以对于那些习惯于"git add -u"(不带路径)仅更新当前子目录中路径索引的人来说,在 Git 2.0 推出之前开始训练他们的手指明确地说"git add -u ."非常重要。

正如我在 "e"中提到的那样。


6
谢谢您的回答和举例。"嘿!" 这一句对我很有帮助。 - TK.
@TK:是的,Benjol(http://stackoverflow.com/users/11410/benjol)的例子很好。 - VonC
在 Git 2.x 中似乎不需要使用 .(路径规范)。我测试时它能正常工作。 - Sanghyun Lee
另外,从Git 2.0开始,git add .将所有更改添加到索引中,因为-A选项是默认的。请查看此答案https://dev59.com/lHRB5IYBdhLWcg3wn4UL#26343584。 - Sanghyun Lee
@Sangdol 谢谢你的提醒。我已经相应地更新了答案。 - VonC
非常有帮助,谢谢。不幸的是,这是一个糟糕的设计。属性“-u”本应自己成为更新命令。懒惰?技术债务堆积如山? - Salvador Valencia

25

就像手册所说的那样:git add . 会添加当前目录下的所有文件,而 git add -u . 只会添加已经被跟踪的文件。


12
add -u 命令会将删除操作也提交到暂存区。 - CB Bailey
只有被跟踪的文件才能被删除 ;) - Benjamin Bannier
add -u 是 commit -a 的一种替代方式(在它所操作的文件中)。 - lprsd
如果被删除的文件没有被跟踪,那么无论如何都不会从暂存区中删除任何内容。 - CB Bailey

14

git add 文件

git add . 

将当前目录中的所有文件添加

git add -u 

仅更新当前正在跟踪的文件。


也许可以涵盖Git 2.0与之前版本的差异? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接