El propósito del área de preparación es tener un espacio flexible para su compromiso. Creo que esto se aclarará si contrasta git con los sistemas de control de versiones que están centralizados, como la subversión.
Subversión
En subversion puede seleccionar confirmar ciertos archivos de su copia de trabajo. Pero solo los archivos completos. Ahora: ¿Qué sucede si desea organizar el archivo A, no el archivo B, y las partes del archivo Cque se relacionan con el archivo Apero no las partes que dependen de los cambios en el archivo B(desde entonces tendría un problema con la coherencia de confirmación).
Git
Git resuelve esto al proporcionar la puesta en escena como una segunda copia de trabajo. Dentro del área de preparación, está armando una instantánea que se comprometerá (más o menos).
Por lo tanto, dentro del área de preparación puede crear una instantánea que incluya cambios Ay una versión del archivo Cque solo refleje los cambios A.
Para las preguntas específicas
Puede organizar en cualquier momento que desee. Personalmente prefiero actuar justo antes de lanzar el commit.
Al realizar cambios en un archivo por etapas y luego cambiar ese archivo en la copia de trabajo, no ha alterado el archivo por etapas, por supuesto. Usted puede decidir si organizar esos también o si no realizar esos cambios. Es decir, si ejecuta git gui citool, verá diferencias de versiones preparadas y no preparadas (herramientas agradables y simples para la puesta en escena y la confirmación en línea).
Git es cauteloso aquí, lo que probablemente sea algo bueno.
Estrategia de compromiso general: compromisos granulares
Creo que cuando se habla de la pregunta "¿Cuándo debo presentarme?", También se debe hablar sobre los hábitos de compromiso.
VCS centralizado
En los sistemas de control de versiones centralizados en los que se compromete con un servidor central, era importante para sus compañeros de trabajo que sus confirmaciones estén completas y bien probadas. Por lo tanto, las personas intentarían cometer no tan a menudo y luego confirmar el estado de los archivos completos para minimizar la posibilidad de un error. Por lo tanto, las confirmaciones tienden a ser fragmentos bastante grandes que incluyen muchos cambios (si no son soluciones simples). Los cambios en un commit pueden ser totalmente ajenos.
Git
En Git, una confirmación se realiza localmente, solo enviarlos a un servidor los hace públicos. Por lo tanto, un commit es barato en cierto sentido. Un commit en el sentido de subversión es bastante comparable a varios git commitseguidos de git push. Esta diferencia importa.
Git le permite confirmar líneas de código individuales, incluso si también ha cambiado otras líneas en el mismo archivo. Esto le brinda muchos beneficios, ya que puede, por ejemplo, cometer una corrección de errores de seguridad en la línea 100 al cambiar las líneas 300-350 e introducir una nueva característica.
- Puede separar diferentes cambios en diferentes confirmaciones. Esto los separa muy bien en su historial de versiones e incluso le permite revertir uno pero no el otro.
- Su confirmación no necesariamente tiene que reflejar un estado de "compilación" de su copia de trabajo (aunque trato de mantenerla así).
Entonces, ¿dónde está el "control de calidad" y la garantía de compilación en una confirmación que esperaría un usuario de subversion? Se desplaza a otras acciones en git. Todavía quiere sacar un estado funcional del programa en un repositorio público. Por lo tanto, asegúrese de que las pruebas sean exitosas y que el programa funcione antes de enviar sus cambios.
Además, intente utilizar ramas al máximo. Cuando cometas muchos cambios pequeños, terminarás con un historial de versiones bastante grande. Si trabaja en sucursales, puede clasificar esas confirmaciones granulares por el nombre de la sucursal y luego fusionarlas nuevamente (la opción --no-fftambién preservará que estas características vivieran en una rama única).
Es decir, puede mantener el hábito de fusionarse solo con la masterrama, si la rama está en buen estado. También puede usar etiquetas para rastrear hitos y lanzamientos.
Ahora, para volver a la puesta en escena: una vez que confirme algunas líneas por confirmación, realizará una etapa directamente antes de la confirmación. (Al menos así es como lo hago).
git diffygit diff --cachedson buenos, pero a veces quiero más).