specific - Diferencia entre "git add-A" y "git add".
git add.vs git add* (10)
El comando git add [--all|-A]
parece ser idéntico a git add .
. ¿Es esto correcto? Si no, ¿en qué se diferencian?
Aquí está la tabla para una rápida comprensión:
Git Version 1.x :
Git Version 2.x :
Banderas largas:
-
git add -A
es equivalente agit add --all
-
git add -u
es equivalente agit add --update
Otras lecturas:
Con Git 2.0, git add -A
es el valor predeterminado: git add .
es igual a git add -A .
.
git add <path>
es lo mismo que "git add -A <path>
" ahora, por lo que "git add dir/
" notará las rutas que eliminó del directorio y registrará la eliminación.
En versiones anteriores de Git, "git add <path>
" se utiliza para ignorar las eliminaciones.Puede decir "
git add --ignore-removal <path>
" para agregar solo las rutas agregadas o modificadas en<path>
, si realmente lo desea.
git add
es como git add :/
( agrega todo desde la carpeta superior de repositorios de git ).
Tenga en cuenta que git 2.7 (noviembre de 2015) le permitirá agregar una carpeta llamada " :
"!
Ver commit 29abb33 (25 de octubre de 2015) por Junio C Hamano ( gitster
) .
Tenga en cuenta que al iniciar git 2.0 (Q1 o Q2 2014) , cuando se habla de git add .
(ruta actual dentro del árbol de trabajo), debe usar '' .
''en los otros comandos de git add
también.
Eso significa:
"
git add -A .
" es equivalente a "git add .; git add -u .
"git add .; git add -u .
(Note el extra '' .
'' Para git add -A
y git add -u
)
Porque git add -A
o git add -u
funcionaría (iniciando git 2.0 solamente) en todo el árbol de trabajo , y no solo en la ruta actual.
Esos comandos operarán en todo el árbol en Git 2.0 por coherencia con "
git commit -a
" y otros comandos . Debido a que no habrá ningún mecanismo para hacer que "git add -u
" se comporte como si "git add -u .
", es importante para aquellos que están acostumbrados a "git add -u
" (sin pathspec) actualizando el índice solo para las rutas en el subdirectorio actual para comenzar a entrenar sus dedos para decir explícitamente "git add -u .
" cuando lo dicen antes de que llegue Git 2.0.Se emite una advertencia cuando estos comandos se ejecutan sin un pathspec y cuando tiene cambios locales fuera del directorio actual , porque el comportamiento en Git 2.0 será diferente de la versión de hoy en tal situación.
En Git 2.x :
Si se encuentra directamente en el directorio de trabajo ,
git add -A
ygit add .
Trabajar sin diferencia.Si se encuentra en algún subdirectorio del directorio de trabajo ,
git add -A
agregará todos los archivos del directorio de trabajo completo, ygit add .
agregará archivos de su directorio actual .
Y eso es todo.
Entonces, según las instrucciones anteriores de Charles, después de probar mi entendimiento propuesto sería el siguiente:
# For the next commit
$ git add . # add to index only files created/modified and not those deleted
$ git add -u # add to index only files deleted/modified and not those created
$ git add -A # do both operation at once, add to index all files
Este enlace también puede ser útil para comprender en qué situación se pueden aplicar esos comandos: Eliminar archivos eliminados de su directorio de trabajo de Git .
Finalmente creo que entiendo esto, muchas gracias a todos. Espero que esto pueda agregar algo más de claridad.
!The syntax is
git add <limiters> <pathspec>
! Aka
git add (nil/-u/-A) (nil/./pathspec)
Los limitadores pueden ser -u o -A o nil.
Pathspec puede ser un filepath o punto, ''.'' para indicar el directorio actual.
Conocimiento de fondo importante sobre cómo git ''agrega''.
- Los archivos invisibles, los prefijados con un punto, (archivos de puntos) nunca son reconocidos automáticamente por Git. Ni siquiera están listados como ''sin seguimiento''.
- Las carpetas vacías nunca son agregadas por git. Ni siquiera están listados como ''sin seguimiento''. (Una solución alternativa es agregar un archivo en blanco, posiblemente invisible, a los archivos rastreados).
- El estado de Git no mostrará información de subcarpetas, es decir, archivos sin seguimiento, a menos que se rastree al menos un archivo en esa subcarpeta. Antes de ese tiempo, git considera que toda la carpeta está fuera del alcance, a la ''vacía''. Está vacío de elementos rastreados.
- Especificando una especificación de archivo = ''.'' (punto), o el directorio actual, no es recursivo a menos que también se especifique -A. Punto se refiere estrictamente al directorio actual, omite las rutas encontradas arriba y abajo.
Ahora, dado ese conocimiento, podemos aplicar las respuestas anteriores.
Los limitadores son los siguientes.
- -u = --update = subconjunto de archivos rastreados => Agregar = No; Cambio = Sí; Eliminar = Sí. => iff el artículo es rastreado.
- -A = --todo (no tal -a, que da error de sintaxis) = superconjunto de todos los archivos no rastreados / rastreados, a menos que en Git <2.0, en donde si se da la especificación de archivo de puntos, solo se considera esa carpeta en particular. => Si se reconoce el elemento, git add -A lo encontrará y lo agregará.
El pathspec es el siguiente.
- En Git <2.0, para los dos limitadores (actualizar y todos), el nuevo valor predeterminado es operar en todo el árbol de trabajo, en lugar de la ruta actual (git <= 1.9),
- Sin embargo, en v2.0, la operación se puede limitar a la ruta actual: simplemente agregue el sufijo de punto explícito (que también es válido en Git <= 1.9);
git add -A .
git add -u .
En conclusión, mi política es;
- 1.Asegúrese de que cualquier archivo / archivo que se agregará se contabiliza en el estado de git.
- 1A. Si falta algún elemento, debido a archivos / carpetas invisibles, agréguelos por separado.
- 2. Tener un buen gitignore para que normalmente solo los archivos de interés estén sin seguimiento y / o no se reconozcan.
- 3. Desde el nivel superior del repositorio, "git add -A" para agregar todos los elementos. Esto funciona en todas las versiones de git.
- 4.Retire los elementos deseados del índice si lo desea.
- 6. Si hay un error grande, haga ''git reset'' para borrar el índice por completo.
La opción -A agrega, modifica y elimina entradas de índice para que coincidan con el árbol de trabajo.
En GIT 2, la opción -A
ahora es predeterminada.
Cuando un .
se agrega que limita el alcance de la actualización al directorio en el que se encuentra actualmente, según la documentación de Git
Si no se proporciona
<pathspec>
cuando se usa la opción -A, se actualizan todos los archivos en todo el árbol de trabajo (las versiones anteriores de Git se utilizan para limitar la actualización al directorio actual y sus subdirectorios).
Una cosa que agregaría es que si se usa el modo --interactive
o -p
, git add se comportará como si se usara el indicador de actualización ( -u
) y no se agregaran nuevos archivos
Tarde a la fiesta, pero esta pregunta también merece una respuesta rápida más detallada.
git add -A
¿Ambos abajo (igual que git add --all )
git add .
Etapas nuevos + archivos modificados
git add -u
Etapas modificadas + archivos borrados
Las cosas cambiaron con Git 2.0:
-
-A
es ahora el predeterminado - el antiguo comportamiento ya está disponible con
--ignore-removal
-
git add -u
ygit add -A
en un subdirectorio sin rutas en la línea de comandos operan en todo el árbol
Así que para git 2 la respuesta es:
-
git add .
ygit add -A .
agregar archivos nuevos / modificados / eliminados en el directorio actual -
git add --ignore-removal .
agrega archivos nuevos / modificados en el directorio actual -
git add -u .
Agrega archivos modificados / eliminados en el directorio actual - sin el punto, agregue todos los archivos en el proyecto independientemente del directorio actual
git add .
es igual a git add -A .
agrega archivos al índice solo desde carpetas actuales y secundarias.
git add -A
agrega archivos al índice de todas las carpetas en el árbol de trabajo.
PS: la información se relaciona con Git 2.0.
Esta respuesta solo se aplica a la versión 1.x de Git . Para la versión 2.x de Git, vea otras respuestas.
Resumen:
git add -A
escalona todos los cambiosgit add .
Etapas de nuevos archivos y modificaciones, sin eliminaciones.Modificaciones y eliminaciones de
git add -u
stage, sin archivos nuevos.
Detalle:
git add -A
es equivalente a git add .; git add -u
git add .; git add -u
.
El punto importante sobre git add .
es que mira el árbol de trabajo y agrega todas esas rutas a los cambios por etapas si se cambian o son nuevas y no se ignoran, no realiza ninguna acción ''rm''.
git add -u
examina todos los archivos ya rastreados y organiza los cambios en esos archivos si son diferentes o si se eliminaron. No agrega ningún archivo nuevo, solo realiza cambios en los archivos ya rastreados.
git add -A
es un atajo útil para hacer ambas cosas.
Puedes probar las diferencias con algo como esto (ten en cuenta que para Git versión 2.x tu salida para git add .
Git git status
será diferente):
git init
echo Change me > change-me
echo Delete me > delete-me
git add change-me delete-me
git commit -m initial
echo OK >> change-me
rm delete-me
echo Add me > add-me
git status
# Changed but not updated:
# modified: change-me
# deleted: delete-me
# Untracked files:
# add-me
git add .
git status
# Changes to be committed:
# new file: add-me
# modified: change-me
# Changed but not updated:
# deleted: delete-me
git reset
git add -u
git status
# Changes to be committed:
# modified: change-me
# deleted: delete-me
# Untracked files:
# add-me
git reset
git add -A
git status
# Changes to be committed:
# new file: add-me
# modified: change-me
# deleted: delete-me