git add *(星号)vs git add。 (期)

时间:2014-09-25 15:28:21

标签: git version-control git-add

我是git的新手,我有一个关于在git中添加文件的问题。我找到了关于git add .git add -agit add --allgit add -A等之间差异的多个stackoverflow问题。但我一直无法找到解释内容的地方{ {1}}。我甚至看过git add man page,但没有帮助。我一直在使用它代替git add *而我的同事问我为什么。我没有答案。我一直使用git add .

git add *git add .是否相同?是否只从当前目录添加更改的文件,而另一个添加当前目录和子目录中的文件(递归)?

其他一个堆栈问题上列出了一个很棒的图表,显示了git add * git add -Agit add .之间的差异,但它没有git add -u。< / p>

enter image description here

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

感谢您的帮助!

5 个答案:

答案 0 :(得分:93)

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

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

答案 1 :(得分:20)

*不是git的一部分 - 它是shell解释的通配符。 *扩展到当前目录中的所有文件,然后才传递给git,add全部都是。 .是当前目录本身,git add将添加它及其下的所有文件。

答案 2 :(得分:6)

在shell中使用点.通常表示“当前目录”。

在shell上使用星号*时,会使用名为file-globbing的功能。例如。在bash上,函数glob()正在这样做。 glob(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

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

这意味着当您将参数传递给命令行上包含'?''*''['的任何程序时,首先将通配符扩展为一个文件列表然后给出这些文件作为程序本身的参数。

'git add .'清楚地描述'git add *'git add之间的含义差异:

*期望添加一个文件列表。在上面的示例中,shell分别展开.git add .,并将结果作为参数提供给git add。现在区别在于,git add * git将扩展到当前目录,而IIF()会触发文件通配,并且会扩展到所有不以点开头的文件和目录。

答案 3 :(得分:4)

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

enter image description here

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

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

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

注3。 git add -Agit add -u命令可以通过添加文件的路径或掩码进一步细化,例如git add -A app/controllers或{{ 1}}。

答案 4 :(得分:2)

  • git add -A(--all)添加所有内容,以便将磁盘上文件夹中的所有内容都显示在暂存区域中

  • git add .暂存所有内容,但不会删除已从磁盘删除的文件

  • git add *暂存所有内容,但不暂存以点开头的文件,并且不会删除已从磁盘删除的文件

  • git add -u(-更新)仅暂存“已修改的文件”,删除已从磁盘删除的文件,不添加新文件

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