git add * 和 git add . 有什么区别,如果有的话?

13

Git 动物们 有一系列的命令:

git init
git add *
git commit -a -m ‘initial commit and release!’

git add *git add .有什么不同(通常我使用后者),它们是相同的吗?


  • 通常表示“匹配任何内容”,而 . 表示“当前目录”,默认情况下是递归进行的。
- TylerH4
但如果 * 的展开包括目录,那么无论如何 git 都会递归地将其添加。 - CB Bailey
2个回答

17

git add * 将添加所有由*shell扩展得出的路径,而git add .会告诉 git 添加当前目录。

git add *不会添加以.开头的路径,因为*的shell扩展将这些路径视为“隐藏”路径。

git add *还将失败,如果任何扩展的路径当前被git忽略了,因为如果你明确指定一个被忽略的路径而不传递-f(强制)标志来显示你确实想要添加一个被忽略的路径,git会认为这是一个错误。

如果让git扩展glob(git add '*'),它将添加“隐藏”的文件并跳过被忽略的文件。在这种情况下,它的工作方式与git add .相同。


这里的“shell”是指命令行应用程序还是操作系统? - Nick Volynkin

2
默认情况下,将目录传递给git add将递归添加其子目录和文件。
通配符*将由您的shell扩展为当前目录下的文件名。
在Unix中,.仅指当前目录,因此这两个命令通常是等效的。尽管*由shell处理,而.由git处理,但它们通常执行相同的操作。
但是,请注意,shell扩展中的*通常不包括隐藏文件(具有.前缀的文件,例如.formatter.yml)。此外,shell扩展不会考虑.gitignore中的git忽略的文件。

5
由于 * 由 shell 处理,它不会考虑 .gitignore 文件,而 . 则会考虑。 - wisbucky
很好的观点@wisbucky。如果您有一个Python项目并且执行git add *,即使在.gitignore中明确指定,"pycache"也将被添加。 - Seth P

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