我有一个关于在git中添加文件的问题。我发现了很多关于git add .
和git add -a
,git add --all
,git add -A
等的区别的stackoverflow问题。但是我一直找不到一个地方来解释git add *
是做什么的。我甚至看过git add man page,但是没有用,我一直用它代替git add .
,同事问我为什么,我没有答案,我一直用git add *
。git add .
和git add *
是一样的吗?一个只添加当前目录中更改的文件,而另一个添加当前目录和子目录中的文件(递归)吗?
在另一个堆栈问题上列出了一个很棒的图表,显示了git add -A
git add .
和git add -u
之间的差异,但它没有git add *
。
注意:我理解使用星号作为通配符的含义(添加具有给定扩展名的所有文件)。例如,git add *.html
将添加具有.html
扩展名的所有文件(但忽略.css
、.js
等)。
谢谢你的帮助!
5条答案
按热度按时间zynd9foi1#
add *
意味着添加当前目录中的所有文件,除了文件名以点开始的文件。这是你的shell功能,Git只接收文件列表。add .
在shell中没有特殊的含义,因此Git递归地添加整个目录,这几乎是相同的,但包括名称以点开始的文件。qybjjes12#
*
不是git的一部分--它是一个由shell解释的通配符。*
扩展到当前目录中的所有文件,然后才传递给git,add
将它们全部传递给git。.
是当前目录本身,git add
ing它将添加它和它下面的所有文件。3bygqnnd3#
git add -A
(--all)添加所有内容,以便在临时区域中显示磁盘上文件夹中的所有内容git add .
暂存所有内容,但不删除已从磁盘中删除的文件git add *
转移所有内容,但不转移以点开始的文件,并且不删除已从磁盘中删除的文件git add -u
(--update)仅暂存已修改的文件,移除已从磁盘中删除的文件,不添加新文件git add <file name 1> <file name 2>
仅添加特定文件bqf10yzr4#
为清楚起见,我将答案列在下表中:
附加注解(受@reka18评论启发):
注1.
git add -A
和git add -u
命令在没有附加参数的情况下执行将是在整个工作目录范围内的附加细化(子目录或文件名的掩码指示)工作(如果我们在目录的工作子目录中执行命令也是如此)。注2.
.
和*
分别是目录路径(当前目录)和通配符,用于明确命令的路径。例如,如果git add .
或git add *
命令在工作目录的某个子目录中执行,则它们的操作仅在该子目录中使用,而不是在整个工作目录中使用。注3.
git add -A
和git add -u
命令可通过添加文件路径或掩码(例如git add -A app/controllers
或git add -u app\styles\*
)进一步细化。ljsrvy3e5#
在shell中使用点
.
通常表示“当前目录”。当你在shell上使用星号
*
时,会用到一个叫做file-globbing
的特性。例如,在bash上,函数glob()
就是这样做的。glob(man 7 glob
)的手册页说明:说明
通配符匹配
全球
这意味着,当您在命令行上向任何包含
'?'
、'*'
或'['
的程序传递参数时,首先使用globbing将通配符模式扩展为文件列表,然后将这些文件作为参数提供给程序本身。Denis清楚地描述了
'git add .'
和'git add *'
之间的意义差异:git add
期望添加一个文件列表,在上面的例子中shell分别扩展*
或.
,并将结果作为参数提供给git add。现在的区别是,对于git add .
,git将扩展到当前目录,而git add *
触发文件globbing,并扩展到所有不以点开头的文件和目录。