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

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

git add *命令与git add .我输入参数时*有什么区别.?两种情况下系统都会返回什么文件列表?

答案1

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

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

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

.dotfile-that-must-be-committed
.git/
.gitignore
some-file-that-is-in-gitignore
some-other-file

当你运行 时git add *,glob 会在 git 命令运行之前展开。因此 git 命令收到的内容如下:

git add some-file-that-is-in-gitignore some-other-file

这导致了四个问题。

  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

总之:

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

甚至更好:

  • 使用git add full/file/paths时,您不会错误地添加尚未准备好添加的东西。

甚至更好:

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

答案2

当前答案尚未指出的另一件事是,它git add *不会注意到您是否删除或重命名了任何文件,但git add .会。

答案3

简短的摘要

git add *表示添加当前目录中的所有文件,但名称以点开头的文件除外。这是您的 shell 功能,Git 只会接收文件列表。


git add .在你的 shell 中没有特殊含义,因此 Git 会递归添加整个目录,这几乎相同,但包括名称以点开头的文件。


答案改编自 stackoverflow

相关内容