El ciclo de commits


Digamos que llevas veinte minutos trabajando en weather-app. Corregiste un error real en src/index.js (la conversión de temperatura estaba mal calculada), y mientras estabas ahí también empezaste a retocar los estilos en styles.css, pero ese cambio está a la mitad y no está listo para que nadie más lo vea. Quieres guardar la corrección del error como su propio punto de guardado ahora mismo, sin arrastrar con ella el estilo sin terminar.
Para eso exactamente sirve el ciclo de commits. Si todavía no has configurado un repositorio, Tu primer repositorio explica primero git init y cómo clonar. A partir de aquí, este capítulo asume que ya tienes uno abierto.
Las tres paradas: directorio de trabajo, área de staging, commit
Cada cambio que haces en Git pasa por tres paradas antes de convertirse en historial permanente. Tu directorio de trabajo es el proyecto tal como está en el disco en este momento, los archivos que estás editando activamente. El área de staging es un lugar de espera donde colocas exactamente los cambios que quieres guardar a continuación. Un commit es la instantánea guardada en sí, una vez que la escribes, junto con el mensaje que la describe.
Imagina que estás empacando para una mudanza. Toda tu casa es el directorio de trabajo: todo lo que posees, en el estado en que se encuentre. Las cajas que ya empacaste y cerraste con cinta junto a la puerta principal son el área de staging: solo lo que decidiste deliberadamente llevarte. El camión de mudanza que se aleja con esas cajas es el commit: un registro exacto de lo que salió, en ese momento, con una etiqueta afuera que indica qué hay dentro.
Aquí tienes ese modelo mental aplicado en una terminal real. Después de editar los dos archivos en weather-app, git status muestra el estado actual sin cambiar nada:
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: src/index.js
modified: styles.css
no changes added to commit (use "git add" to commit)Ambos archivos aparecen como "not staged" porque editar un archivo solo modifica tu directorio de trabajo. Nada se mueve al área de staging hasta que le digas a Git que lo ponga ahí con git add, que es el tema de la siguiente sección.
Aquí es donde queda claro para qué existe realmente el área de staging. El área de staging te permite elegir exactamente qué entra en tu commit, sin importar qué otras cosas sigan editadas en tu directorio de trabajo. Sin ella, guardar un punto de control te obligaría a incluir de golpe todos los cambios del disco, estuvieran listos o no.
Con ella, puedes agregar al staging la corrección terminada en src/index.js, dejar afuera el styles.css a medio terminar, y hacer commit solo de la parte que en realidad ya está lista. Este detalle, que el staging y tu directorio de trabajo pueden contener cosas distintas al mismo tiempo, confunde a casi todo el mundo en la primera semana. Una vez que lo entiendes, el resto del flujo diario de Git tiene mucho más sentido.
git add, y eso es lo que te permite guardar un cambio terminado mientras dejas afuera otro que está a medias. Agregando cambios al staging: git add
git add mueve un cambio de tu directorio de trabajo al área de staging. Apúntalo al archivo cuyos cambios quieres incluir en el próximo commit:
$ git add src/index.js
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/index.js
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: styles.csssrc/index.js se movió a "Changes to be committed": la corrección del error ya está en staging y lista. styles.css sigue apareciendo bajo "not staged", justo donde quieres que esté mientras el rediseño no está terminado. Ejecutar también git add styles.css lo pondría en staging a él también; ejecutar git add . pone en staging todos los archivos modificados de la carpeta actual de una sola vez, lo cual es conveniente una vez que confías en que todo lo que hay en el disco realmente está listo.
git add <archivo> mueve los cambios actuales de ese archivo al área de staging, listos para el próximo commit. Los archivos que aún no has agregado se quedan afuera, así que puedes terminar una cosa y dejar otra a medio editar. git add . pone en staging todos los archivos modificados a la vez, útil cuando todo realmente ya está listo. Guardando una instantánea: git commit
Una vez que el área de staging tiene lo que quieres, git commit lo guarda como una instantánea permanente, con la opción -m (abreviatura de "message", mensaje) proporcionando la descripción que la acompaña:
$ git commit -m "Fix temperature conversion in Celsius-to-Fahrenheit formula"
[main 4f2a1c9] Fix temperature conversion in Celsius-to-Fahrenheit formula
1 file changed, 1 insertion(+), 1 deletion(-)Solo entró src/index.js, porque eso fue lo único que pusiste en staging. styles.css sigue editado en tu directorio de trabajo, intacto, esperando a que termines el rediseño. El identificador corto, 4f2a1c9, nombra este commit específico, y el capítulo Historial explica cómo leer la lista completa de commits de un proyecto, como este.
git commit -m "mensaje" guarda lo que esté en staging en ese momento como una instantánea permanente, con el mensaje que le pongas. Todo lo que no pusiste en staging se queda afuera y sigue siendo editable. Mantén el mensaje corto y claro sobre qué hace el commit; tu yo del futuro lo leerá más veces de las que crees. 
