git add comando: cancelar, todo, directorio de archivos, -u, -i opción
Siguiendo con git init command, este post trata sobre el comando git add
.
Cubriremos cómo funciona git desde add
hasta commi
t, opciones para aumentar la productividad, y cómo deshacer archivos y directorios organizados.
También resumiremos el funcionamiento interno al final para aquellos que quieran saber más.
1. Mecánica simple desde añadir hasta confirmar
1.1 Entendiendo los flujos de git add y git commit
Antes de sumergirnos en cómo funciona git, hay algo en lo que pensar. Si necesitáramos crear y guardar un nuevo documento, ¿cuántos pasos daríamos?
La respuesta es sencilla: write -> save -> commit, y el documento queda guardado. Esto es simple, pero hay un problema. Como es sólo un paso, hay muchas posibilidades de que lo guardes incorrectamente.
Git se toma muy en serio lo de guardar una vez. Por eso realiza dos pasos para minimizar las posibilidades de cometer un error en un único guardado. These steps are the following
Cuando se hacen cambios en cualquier archivo, se confirman con el comando git add
.
A continuación ejecutamos git commit
, que confirma todos los cambios actualmente en el estado por etapas a la historia como una única confirmación.
Cuando se realiza un nuevo cambio en un archivo que ha sido confirmado, se convierte en el objeto de otro comando git add
.
Así es como funciona el control de versiones: git add
-> git commit
-> cambio de archivo -> git add
.
Veamos un ejemplo para entenderlo.
1.2 Entendiendo git add y git commit haciéndolo tú mismo
Primero preparamos el directorio donde se almacenan los 2 archivos markdown y creamos un nuevo repo. Cuando miramos el estado actual con el comando git status
, vemos 2 archivos que aún no hemos rastreado.
Añadimos un archivo, 1.md
, al estado por etapas con el comando git add. El seguimiento del archivo 1.md
, mostrado en verde claro, ha comenzado y está esperando a ser confirmado.
Tras ejecutar la confirmación con el comando git commit -m "mensaje de confirmación"
, los cambios en el archivo 1.md
se registran como una nueva confirmación y desaparecen del estado por etapas.
En este punto, si hay nuevos cambios en el archivo 1.md
, volverá al estado staged.
Así es como se repiten los comandos add
y commit
.
1.3 Un poco más de detalle
Git mantiene un registro de todos los archivos o carpetas de una carpeta de trabajo en dos estados principales
untracked
: git no está siguiendo los cambios en el archivo.tracked
: git está siguiendo los cambios en el archivo. Cuando creas un nuevo repositorio con el comando git init, todos los archivos están sin seguimiento. El comandogit add
cambia un archivo de no rastreado a rastreado, y continúa vigilando los cambios.
git mantiene los archivos rastreados en uno de estos tres estados
staged
: El estado staged se prepara para convertirse en un commit. Cuando un archivo en el estado sin seguimiento se cambia por primera vez al estado con seguimiento, se convierte en staged. Los archivos en estado modificado también pasan a este estado mediante el comandogit add
.unmodified
: Un archivo en el estado "staged" pasa a estar "unmodified" cuando se confirman los cambios realizados en él mediante el comandogit commit
. Este estado se mantiene hasta que no se realizan más cambios.Modified
: Un archivo en estado no modificado se modifica cuando se realiza un cambio en él. Los archivos en este estado se convierten en el objetivo del comandogit add
.
Para resumir todos los estados, puedes pensar en ellos como si fueran de no rastreado --(git add
)--> rastreado/establecido --(git commit
)--> no modificado --(se producen cambios) --> estable.
2. Añadiendo todos los archivos y carpetas usando el comando git add -A o --all
Como se muestra en el ejemplo anterior, para añadir un archivo o carpeta específicos en la carpeta de trabajo actual, usa el siguiente comando
git add <archivo 1>, <archivo 2>, <carpeta 1>
Si hay subdirectorios en <carpeta 1>
, Git los añadirá automáticamente todos juntos al estado preparado.
Si quieres preparar todos los archivos y carpetas de la carpeta de trabajo actual, sin tener que seleccionar archivos o carpetas específicos, utiliza el siguiente comando. Esto se dirigirá a todos los archivos sin seguimiento y modificados.
$ git add -A
O puedes usar
$ git add .
3. Añadiendo sólo los archivos y carpetas rastreados con git add -u
Para escenificar sólo todos los archivos y carpetas modificados que Git rastrea en la carpeta de trabajo actual, usa el siguiente comando. Comparado con el comando de la Sección 2, este excluye los archivos y carpetas no rastreados.
$ git add -u
4. Añade fácilmente los archivos y carpetas que quieras con el comando git add -i
Si inicias el modo interactivo con el siguiente comando, puedes añadir sólo los archivos que quieras poner en escena, o eliminarlos con un simple número.
$ git add -i
Este es el aspecto del modo interactivo
El modo interactivo imprime los comandos junto con la salida `git status'. Dependiendo de tus elecciones, 4 se usa para poner en stage archivos sin seguimiento, y 2 se usa para poner en stage archivos modificados. 3 se usa para revertir los archivos escaneados por 2 y 4.
5. undo git add
Además del modo interactivo, existe un comando para revertir archivos y carpetas añadidos por el comando git add
.
Para revertir archivos y carpetas específicos dentro de una carpeta de trabajo, usa el comando
git restore --staged <file 1>, <folder 1>
Para restaurar todos los archivos y carpetas, utilice el comando
$ git restore --staged .
6. Comportamiento interno del comando git add
Internamente, Git utiliza algunas estructuras de datos y conceptos clave para gestionar y seguir los cambios. Veamos paso a paso qué ocurre internamente cuando ejecutas el comando `git add'.
- Cuando ejecutas el comando
git add
, Git toma una instantánea del contenido del archivo especificado y crea un nuevo objeto blob en la base de datos de objetos de Git (ubicada en.git/objects
). El objeto blob representa el contenido del archivo, no el archivo en sí. - A continuación, Git hace referencia al objeto blob para añadir una entrada al área de almacenamiento del archivo (en otras palabras, índice). Esta entrada contiene la ruta al archivo, el modo (tipo de archivo y permisos) y el hash SHA-1 del objeto blob. Si añades múltiples archivos, Git creará un objeto blob y una entrada de índice separados para cada archivo.
- Ahora estás listo para confirmar tus cambios incrementales. Ejecutando el comando `git commit' se crea un nuevo objeto árbol que representa la estructura de directorios y el contenido de los archivos de la nueva confirmación. También crea un nuevo objeto commit que apunta al objeto árbol, almacena los metadatos del commit (p.e. autor, fecha, mensaje), y apunta al commit padre.
- Por último, Git actualiza la referencia de la rama (por ejemplo,
refs/heads/master
para la rama maestra) para que apunte al nuevo objeto de confirmación, convirtiéndolo en la última confirmación del historial de la rama.
En resumen, cuando ejecutas el comando git add
, se crea un objeto blob para el archivo añadido, se actualiza el área de preparación con información sobre ese archivo, y luego se prepara para la siguiente confirmación,
y lo prepara para la siguiente confirmación. El commit en sí no se crea hasta que ejecutas git commit
.
7. 7. Reflexiones finales
El comando git add
es el corazón del sistema de control de versiones git, y hay muchos conceptos que te darán una buena comprensión de cómo funciona.
Espero que este artículo te haya dado una buena comprensión de los conceptos detrás del sistema de control de versiones git y las muchas opciones que tienes para hacer más fácil la puesta en escena.
