Git add * (星号) vs git add. (句号)

我是 git 的新手,我有一个关于在 git 中添加文件的问题。我发现了关于 git add .git add -agit add --allgit add -A等之间差异的多个堆栈溢出问题。但是我一直找不到一个地方来解释 git add *是做什么的。我甚至看过 Git 添加手册页,但没有帮助。我一直用它来代替 git add .,我的同事问我为什么。我没有答案。我只是一直使用 git add *

git add .git add *是一样的吗?一个是否只从工作目录中添加已更改的文件,而另一个是否只从工作目录和子目录中(递归地)添加已更改的文件?

在另一堆问题中有一个很棒的图表,它显示了 git add -A git add .git add -u之间的区别,但是它没有 git add *

enter image description here

注意: 我知道星号作为通配符意味着什么(添加具有给定扩展名的所有文件)。例如,git add *.html将添加具有 .html扩展名的所有文件(但忽略 .css.js等)。

谢谢你的帮助!

74149 次浏览

*不是 git 的一部分——它是 shell 解释的通配符。*扩展到工作目录中的所有文件,然后才传递给 git,git 负责 add中的所有文件。 Abc0是工作目录本身,而且 git adding 会添加它和它下面的所有文件。

ABc0表示在工作目录中添加所有文件,但名称以点开头的文件除外。这是您的 shell 功能,Git 只接收文件列表。

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

在 shell 中使用点 abc0通常意味着“工作目录”。

当您在 shell 上使用星号 *时,会使用一个称为 file-globbing的特性。例如,在 bash 上,函数 glob()就是这样做的。Globb 的页面(man 7 glob)指出:

描述

Long ago, in UNIX V6, there was a program /etc/glob that would expand
wildcard patterns.  Soon afterward this became a shell built-in.
These days there is also a library routine glob(3) that will perform this
function for a user program.

通配符匹配

A string is a wildcard pattern  if it contains one of the characters '?', '*' or '['.

球状

Globbing is the operation that expands a wildcard pattern
into the list of pathnames matching the pattern.

这意味着,当您在命令行中向包含 '?''*''['的任何程序传递参数时,首先 globbing 将通配符模式展开为一个文件列表,然后将这些文件作为程序本身的参数提供。

丹尼斯清楚地描述了 'git add .''git add *'之间的意义差异:

git add期望添加一个文件列表。在上面的示例中,shell 分别展开 *.,并将结果作为参数提供给 git add。现在的不同之处在于,使用 git add . git 可以扩展到工作目录,而使用 git add *触发文件 globbing,这样就可以扩展到所有不以点开头的文件和目录。

为了清楚起见,我把答案放在下面的表格中:

enter image description here

附加说明 (受@reka18评论的启发) :

注1。在没有额外参数的情况下执行的 git add -Agit add -u命令将是在整个工作目录范围内的额外改进(子目录或文件名掩码指示)(如果我们在目录的工作子目录中执行该命令也是如此)。

注2。.*分别是目录路径(工作目录)和通配符,它们阐明了命令的路径。例如,如果在某个工作目录的某个子目录中执行 git add .git add *命令,那么它们的操作只能在这个子目录中使用,而不能在整个工作目录中使用。

注3。通过为文件(例如 git add -A app/controllersgit add -u app\styles\*)添加路径或掩码,可以进一步细化 git add -Agit add -u命令。

  • git add -A(—— all)添加所有内容,这样磁盘上文件夹中的所有内容都在临时区域中表示

  • git add .阶段的一切,但不删除已从磁盘删除的文件

  • git add *阶段的一切,但不文件,以点开头 & 不删除文件已从磁盘删除

  • 阶段仅修改文件,从磁盘中删除已删除的文件,不添加新文件

  • git add <file name 1> <file name 2>只添加某些文件