El bucle de commit


Digamos que has estado trabajando en weather-app durante los últimos veinte minutos. Corregiste un error real en src/index.js, la conversión de temperatura estaba mal, y mientras estabas ahí también comenzaste a restylear styles.css, pero ese cambio está a medio terminar y no está listo para que otros lo vean. Quieres guardar la corrección del error como su propio punto de control ahora mismo, sin arrastrar el estilo sin terminar junto con él.
Para eso es exactamente el bucle de commit. Si aún no has configurado un repositorio, Tu primer repositorio te guía a través de git init y clonación primero. De aquí en adelante, este capítulo asume que tienes uno abierto.
Las tres paradas: directorio de trabajo, área de preparación, commit
Cada cambio que hagas en Git pasa por tres paradas antes de convertirse en un historial permanente. Tu directorio de trabajo es el proyecto tal como está en el disco ahora mismo, los archivos que estás editando activamente. El área de preparación es un lugar de espera donde colocas exactamente los cambios que quieres guardar después. Un commit es la instantánea guardada en sí, una vez que la escribes, más el mensaje que la describe.
Imagina que estás empacando para una mudanza. Tu casa completa es el directorio de trabajo: todo lo que posees, en el estado en que está. Las cajas que has empacado y sellado cerca de la puerta son el área de preparación: solo lo que has elegido deliberadamente llevar. El camión de mudanzas que se aleja con esas cajas es el commit: un registro de exactamente qué se fue, en ese momento, con una etiqueta en el exterior diciendo qué hay adentro.
Aquí está ese modelo mental apareciendo en una terminal real. Después de editar ambos archivos en weather-app, git status lee 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 "no preparados" porque editar un archivo solo cambia tu directorio de trabajo. Nada se mueve al área de preparación hasta que le digas a Git que lo ponga ahí con git add, que es la siguiente sección.
Aquí es donde la razón completa de existencia del área de preparación se vuelve clara. El área de preparación te permite elegir exactamente qué va en tu commit, independientemente de qué más siga editado en tu directorio de trabajo. Sin ella, guardar un punto de control te forzaría a tomar cada cambio en el disco a la vez, esté listo o no.
Con ella, puedes preparar la corrección del error terminada en src/index.js, dejar fuera el styles.css a medio terminar, y hacer commit solo de la parte que está realmente hecha. Este detalle, que la preparación y tu directorio de trabajo pueden contener cosas diferentes al mismo tiempo, confunde a casi todos en la primera semana. Una vez que lo captas, el resto del flujo de trabajo diario de Git tiene mucho más sentido.
git add, y eso es lo que te permite guardar un cambio terminado mientras dejas uno a medio hacer fuera. Preparando cambios: git add
git add mueve un cambio de tu directorio de trabajo al área de preparación. Apúntalo al archivo cuyos cambios quieres 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 está preparada y lista. styles.css sigue listado bajo "not staged", exactamente donde lo quieres mientras el restyling está sin terminar. Ejecutar git add styles.css también lo prepararía; ejecutar git add . prepara cada archivo modificado en la carpeta actual a la vez, lo cual es conveniente una vez que confías en que todo en el disco está realmente listo.
git add <file> mueve los cambios actuales de ese archivo al área de preparación, listo para el próximo commit. Los archivos que no has añadido todavía se quedan fuera, así que puedes terminar una cosa y dejar otra a mitad de edición. git add . prepara cada archivo modificado a la vez, útil una vez que todo está realmente listo. Guardando una instantánea: git commit
Una vez que el área de preparación contiene lo que quieres, git commit lo guarda como una instantánea permanente, con la bandera -m (abreviatura de "message") proporcionando la descripción que viaja con él:
$ 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 src/index.js entró, porque eso es todo lo que preparaste. styles.css sigue sentado editado en tu directorio de trabajo, sin tocar, esperando por siempre que el restyling esté terminado. El id corto, 4f2a1c9, nombra este commit exacto, y el capítulo History cubre la lectura de la lista completa de commits de un proyecto como este.
git commit -m "message" guarda lo que está actualmente preparado como una instantánea permanente, con el mensaje que le das. Cualquier cosa que no hayas preparado se queda fuera y sigue siendo editable. Mantén el mensaje corto y claro sobre lo que el commit hace, el futuro tú lo leerá de vuelta más a menudo de lo que esperas. 
