Git add: ¿Por qué tengo que especificar manualmente qué files comprometer?

Solo estoy aprendiendo a usar git. Por lo tanto, he creado un nuevo repository, que contiene un file "foo.txt". Para agregar esto al control de versiones, ejecuté git add foo.txt . Luego, realicé algunos cambios en el file y ejecuté git commit . Esto pareció actualizar el repository.

Luego hice algunos cambios adicionales al file. Después de esto, ejecuté git commit nuevamente. Sin embargo, esta vez, vuelve no changes added to commit . Pero si luego ejecuto git add foo.txt antes de ejecutar la confirmación, realiza los cambios.

¿Por qué parece que tengo que add mi file cada vez? Quiero poder ejecutar git commit después de mis cambios, sin tener que decir a qué file he hecho cambios.

¿Es normal que tenga que especificar manualmente los files para confirmar? ¿O estoy haciendo algo mal? ¿No puedo decirle a git que cada vez que se cambia "foo.txt", quiero que se agregue a la próxima confirmación?

git add no funciona de la misma manera que svn add funciona, su propósito no es "iniciar el seguimiento de este file". Su propósito es "escenificar este contenido para el siguiente compromiso".

Si lo ejecuta en un file sin seguimiento, git comenzará a rastrear el file e includeá los contenidos actuales del file para la siguiente confirmación. Sin embargo, solo hace un seguimiento de los contenidos: el hecho de que sea un file nuevo para seguir es más o less un efecto secundario al agregar los contenidos del file.

Si modifica un file rastreado, use git add para agregar el contenido de ese cambio a su próxima confirmación.

Si luego modifica el file de nuevo , tendrá que volver a git add para escenificar los nuevos cambios que realizó.

También puede agregar cambios parciales usando git add -p . Esto le permitirá realizar solo algunos cambios realizados en el file, pero no agregará otros cambios. (Cortará los cambios de forma similar a cómo lo haría diff , y le preguntará si desea agregar o ignorar cada uno de los fragments).

Todo esto está al service de la flexibilidad. Puedes controlar muy bien qué cambios se agregan a una confirmación, exactamente cómo prefieres. O bien, puedes git commit -a y simplemente barrer todo a la vez, si es así como quieres trabajar.

Hay una diferencia entre el área de preparación y una instantánea comprometida en git. En su explicación, cuando utilizó el command de commit , realmente cometió la versión de foo.txt tal como estaba cuando utilizó el command de add . En resumen, add solo etapas un file listo para comprometerse. El command de commit es obligatorio para save la instantánea.

Hay veces que ha realizado cambios en varios files, pero quiere que estén en diferentes compromisos, el área de transición le permite elegir qué comprometer y cuándo, en lugar de simplemente download todo de una vez. Hay otros usos, pero este es probablemente el más fácil de entender como un principiante.

No es tan útil si solo está guardando instantáneas de una base de código. https://git-scm.com/book/en/v2/Getting-Started-Git-Basics tiene una buena guía para comenzar a usar git

Porque todos los cambios en todos los files no siempre pertenecen a la misma confirmación.

Por ejemplo, si estoy refacturando una página de inicio mientras también estoy trabajando en una nueva function para el envío de posts entre usuarios, estos cambios no tienen nada que ver entre sí. Por lo tanto, mi confirmación para la página de inicio podría tener un post como "Refactor homepage to include cool photos" mientras que la confirmación de funciones de envío de posts podría tener un post como "Implement message-sending functionality between users" .

También tenga en count que puede, y probablemente a menudo necesite, almacenar solo ciertas partes de un file en una confirmación en particular, y almacenar otros cambios en el mismo file en una confirmación separada.