git add * (asterisco) vs git add. (período)

129

Soy nuevo en git y tengo una pregunta sobre cómo agregar archivos en git. He encontrado varias preguntas sobre stackoverflow la diferencia entre git add .e git add -a, git add --all, git add -A, etc, pero he sido incapaz de encontrar un lugar que explica lo que git add *hace. Incluso he mirado la página de manual de git add , pero no ayudó. Lo he estado usando en lugar de git add .y mi compañero de trabajo me preguntó por qué. No tuve una respuesta. Siempre lo he usado git add *.

¿Son git add .y git add *lo mismo? ¿Uno agrega archivos cambiados desde el directorio actual, mientras que el otro agrega archivos desde el directorio actual y subdirectorios (recursivamente)?

Hay una gran tabla en una de las otras preguntas de la pila que muestra la diferencia entre git add -A git add .y git add -u, pero no tiene git add *.

ingrese la descripción de la imagen aquí

Nota: Entiendo lo que significa usar el asterisco como comodín (agregar todos los archivos con una extensión determinada). Por ejemplo, git add *.htmlsería añadir todos los archivos que tienen una .htmlextensión (pero ignoran .css, .js, etc).

¡Gracias por la ayuda!

Tyler Youngblood
fuente
1
¿De dónde es ese gráfico? Acabo de intentarlo git add .nuevamente, y organizó un archivo eliminado sin problema, a diferencia de lo Xque sugeriría en esa fila.
David
@David Esa imagen es de esta respuesta y se aplica a versiones anteriores de git.
jerry
44
Imagen anticuada! Git 2.x es diferente: i.stack.imgur.com/KwOLu.jpg
Hannes Schneidermayer

Respuestas:

131

add *significa agregar todos los archivos en el directorio actual, excepto los archivos cuyo nombre comienza con un punto. Esta es su funcionalidad de shell y Git solo recibe una lista de archivos.

add . no tiene un significado especial en su shell y, por lo tanto, Git agrega todo el directorio de forma recursiva, que es casi lo mismo, pero incluye archivos cuyos nombres comienzan con un punto.

Denis
fuente
66
entonces git add .agrega todos los archivos, carpetas y subcarpetas, incluidos .gitignore y cualquier otra cosa que comience con un punto, mientras git add *que agregaría cualquier archivo, carpeta y subcarpeta, excepto aquellos que comienzan con un punto. ¿Es eso exacto?
Tyler Youngblood
9
Eso es realmente correcto. Además, git add *aún agregaría archivos que comienzan con un punto si están en un subdirectorio.
Denis
44
git add .también respeta .gitignore, mientras git add *que arrojará un error si se ignoran los archivos que no sean puntos. Mucho mejor de usar git add .que git add *.
rosuav
2
Vale la pena señalar: si invoca Git en DOS / Windows desde CMD.EXE, es Git , no el shell, lo que expande el *. En este caso, Git encontrará archivos de puntos.
torek
2
@ Thor84no: Git encontrará los archivos de puntos incluso en un sistema Linux, si lo cita *para protegerlo del shell. No se trata de lo oculto, es solo que las reglas compiladas de Git difieren.
torek
30

*no es parte de git, es un comodín interpretado por el shell. *se expande a todos los archivos en el directorio actual, y solo se pasa a git, que addes todos ellos. .es el directorio actual en sí, e git adding lo agregará junto con todos los archivos que contiene.

Mureinik
fuente
1
Entonces, ¿habría alguna razón para usar el asterisco? ¿Hay alguna ventaja en usarlo en lugar de un punto? ¿O viceversa? Estoy seguro de que lo vi en un tutorial. No hubiera sabido usarlo de otra manera. No soy un gran tipo de línea de comando (como sin duda has adivinado)
Tyler Youngblood
55
*evita archivos ocultos (es decir, archivos cuyo nombre comienza con a .). En cualquier caso, si no está agregando archivos específicos, simplemente los usaría git add -u(o git add -Asi está creando nuevos archivos).
Mureinik
3
Como ambos respondieron mi pregunta, tuve problemas para decidir a quién dar crédito. Elegí a Denis a continuación porque tiene menos reputación que tú. Entonces pensé que darle el cheque verde lo beneficiaría más que a usted. ¿Espero que tenga sentido? Pero realmente aprecio ambas explicaciones. ¡Gracias!
Tyler Youngblood
7

Usar el punto . en el shell generalmente significa "el directorio actual".

Cuando utiliza el asterisco *en un shell, file-globbingse utiliza una función llamada . Por ejemplo, en bash, la función glob()está haciendo exactamente eso. La página de manual de glob ( man 7 glob) establece:

DESCRIPCIÓN

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.

Coincidencia de comodines

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.

Eso significa que cuando pasa argumentos a cualquier programa en la línea de comandos que contiene '?', '*'o '[', primero, el globbing expande el patrón comodín en una lista de archivos y luego da estos archivos como un argumento para el programa mismo.

Denis describe claramente la diferencia de significado entre 'git add .'y :'git add *'

git addespera que se agregue una lista de archivos. En el ejemplo anterior, el shell se expande *o .da respectivamente el resultado como un parámetro para git add. Ahora la diferencia es que con git add .git se expandirá al directorio actual, mientras que git add *activa el bloqueo de archivos y se expande a todos los archivos y directorios que no comienzan con un punto.

codingdave
fuente
5

Para mayor claridad, pongo la respuesta en la tabla a continuación:

ingrese la descripción de la imagen aquí

Notas adicionales (inspiradas en el comentario @ reka18):

Nota 1. git add -A y los git add -ucomandos ejecutados sin parámetros adicionales serían refinamiento adicional (subdirectorio o indicación de máscara para el nombre del archivo) en el rango de todo el directorio de trabajo (también si ejecutamos el comando en el subdirectorio de trabajo del directorio).

Nota 2. Los .y *son, respectivamente, la ruta del directorio (directorio actual) y el comodín, que aclaran la ruta del comando. Por ejemplo, si el comando git add .o git add *se ejecuta en algún subdirectorio de un directorio de trabajo, entonces su acción solo se usa dentro de este subdirectorio, no en todo el directorio de trabajo.

Nota 3. Los comandos git add -Ay git add -use pueden refinar aún más agregando una ruta o máscara para archivos, por ejemplo, git add -A app/controllerso git add -u app\styles\*.

simhumileco
fuente
2
A fin de Git V2.x git add -Ay git add .son idénticos?
reka18
Gracias @ reka18, por una muy buena pregunta. Me inspiró a completar mi respuesta ... La respuesta a su pregunta: si lo llama en el directorio de trabajo, no, pero si está en un subdirectorio, entonces sí (se git add -Aaplica a todo el directorio de trabajo y git add .siempre al directorio actual).
simhumileco
2
  • git add -A (--todos) Agrega todo, para que todo en su carpeta en el disco esté representado en el área de preparación

  • git add . Organiza todo, pero no elimina los archivos que se han eliminado del disco

  • git add * Organiza todo, pero no los archivos que comienzan con un punto y no elimina los archivos que se han eliminado del disco

  • git add -u (--update) Etapas solo archivos modificados, elimina archivos que se han eliminado del disco, no agrega nuevos

  • git add <file name 1> <file name 2> Agrega solo ciertos archivos

Steffen
fuente