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
这导致了四个问题。
- Git 会抱怨
some-file-that-is-in-gitignore
无法添加,并会要求您添加 force (-f
) 参数(如果您确实要添加它)。 .dotfile-that-must-be-committed
和均未.gitignore
添加,因为*
不会扩展到点文件。- 如果您已经删除了所在目录中的文件,则
*
永远无法扩展到这些文件,因此已删除的文件将不会被暂存。 - 如果您重命名了所在目录中的文件,
*
则永远无法扩展为旧名称,但可以扩展为新名称。因此,git 将看到您添加了一个新文件,并且由于旧名称未被暂存,因此最终将出现两次相同的文件,即旧名称和新名称。
但是,运行命令git add .
会告诉 git 添加当前目录,而不指定要添加哪个文件。在这种情况下,git 将检查文件.gitignore
并递归添加 中未提及的所有文件.gitignore
。
总之:
- 您应该使用
git add .
notgit add *
。
甚至更好:
- 使用
git add full/file/paths
时,您不会错误地添加尚未准备好添加的东西。
甚至更好:
- 用于
git add -p
检查您的更改并挑选您想要添加的补丁。
答案2
当前答案尚未指出的另一件事是,它git add *
不会注意到您是否删除或重命名了任何文件,但git add .
会。
答案3
简短的摘要
git add *
表示添加当前目录中的所有文件,但名称以点开头的文件除外。这是您的 shell 功能,Git 只会接收文件列表。
git add .
在你的 shell 中没有特殊含义,因此 Git 会递归添加整个目录,这几乎相同,但包括名称以点开头的文件。