git add * 和 git add . 有什么区别?

vic*_*ico 13 command-line git

git add *命令之间和git add .我输入参数时*有什么区别.?在这两种情况下,文件系统返回什么列表?

Dan*_*Dan 32

  • *是一个 bash 全局变量。它将扩展到您所在目录中的所有文件,不包括点文件(以点 ( .) 开头的文件)。
  • .表示当前目录。

根据目录的内容以及是否有文件,结果可能会有很大不同.gitignore

假设您的目录中有以下文件和目录:

.dotfile-that-must-be-committed
.git/
.gitignore
some-file-that-is-in-gitignore
some-other-file
Run Code Online (Sandbox Code Playgroud)

当您运行时git add *,glob 将在 git 命令运行之前展开。那么 git 命令接收到的内容如下:

git add some-file-that-is-in-gitignore some-other-file
Run Code Online (Sandbox Code Playgroud)

这会导致四个问题。

  1. Git 会抱怨无法添加,并且如果你确实想添加它,some-file-that-is-in-gitignore会要求你添加force( )参数。-f
  2. 两者.dotfile-that-must-be-committed均未.gitignore添加,因为*不会扩展为点文件。
  3. 如果您已删除所在目录中的文件,*则永远无法扩展到这些文件,因此删除的文件将不会被暂存。
  4. 如果您已重命名所在目录中的文件,*则永远无法扩展为旧名称,但它将扩展为新名称。因此 git 会看到的是,您添加了一个新文件,并且由于旧名称没有暂存,您最终会发现同一个文件存在两次,即旧名称和新名称。

但是,运行会git add .告诉 git 添加您所在的当前目录,而不指定要添加哪个文件。在这种情况下,git 将检查.gitignore文件并递归添加 .gitignore 中未提及的所有文件.gitignore

总之:

  • 你应该使用git add .not git add *

更好的是:

  • 使用git add full/file/paths这样您就不会错误地添加尚未准备好添加的内容。

甚至更好:

  • 用于git add -p查看您的更改并选择要添加的补丁。

  • @JörgWMittag 有趣......尽管我认为只有当您不返回并测试生成的提交时才会出现危险。进行该测试是人们完全合理的做法和期望。因此,就我个人而言,我不同意应注意这一点;我认为这会让人分心,而不值得将其添加到答案中。 (4认同)
  • 更好的是:`git add be/explicit`。你不应该使用 `git add *` 也不应该使用 `git add .`,因为你应该更加谨慎地考虑要添加到 git 的内容。 (2认同)