git add * (asterisk) vs git add . (period)
add *
means add all files in the current directory, except for files whose name begin with a dot. This is your shell functionality and Git only ever receives a list of files.
add .
has no special meaning in your shell, and thus Git adds the entire directory recursively, which is almost the same, but including files whose names begin with a dot.
*
is not part of git - it's a wildcard interpreted by the shell. *
expands to all the files in the current directory, and is only then passed to git, which add
s them all..
is the current directory itself, and git add
ing it will add it and the all the files under it.
Using the dot .
in the shell usually means "the current directory".
When you use the asterisk *
on a shell a feature called file-globbing
is utilized. E.g. on bash the function glob()
is doing just that. The manpage for glob (man 7 glob
) states:
DESCRIPTION
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.
Wildcard matching
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.
That means when you pass arguments to any program on the commandline that contain '?'
, '*'
or '['
, first globbing expands the wildcard pattern into a list of files and then gives these files as an argument to the program itself.
The difference in meaning between 'git add .'
and 'git add *'
is clearly described by Denis:
git add
expects a list of files to be added. In the above example the shell expands *
or .
respectively and gives the result as a parameter to git add. Now the difference is that with git add .
git will expand to the current directory whereas git add *
triggers file globbing and such expands to all files and directories that do not start with a dot.