Le but de la zone de transit est d'avoir un espace flexible pour votre commit. Je pense que cela deviendra plus clair si vous comparez git à des systèmes de contrôle de version centralisés, tels que subversion.
Subversion
Dans subversion, vous pouvez choisir de valider certains fichiers de votre copie de travail. Mais seulement les fichiers complets. Maintenant: que se passe-t-il si vous souhaitez mettre en scène le fichier A
, pas le fichier B
, et les parties du fichier C
qui se rapportent au fichier A
mais pas les parties qui dépendent des modifications du fichier B
(car vous auriez alors un problème avec la cohérence de la validation).
Git
Git résout ce problème en fournissant la mise en scène comme deuxième copie de travail. Dans la zone de préparation, vous créez un instantané que vous allez valider (grosso modo).
Par conséquent, dans la zone de transfert, vous pouvez créer un instantané qui inclut des modifications A
et une version de fichier C
qui ne reflète que les modifications apportées A
.
Pour les questions spécifiques
Vous pouvez mettre en scène à tout moment que vous voulez. je préfère personnellement mettre en scène juste avant de lancer le commit.
Lorsque vous modifiez un fichier par étapes, puis que vous modifiez ce fichier dans la copie de travail, vous n'avez bien sûr pas modifié le fichier intermédiaire. Vous pouvez soit décider de les mettre en scène également, soit de ne pas mettre en scène ces modifications. C'est-à-dire que si vous exécutez, git gui citool
vous verrez des différences de versions avec et sans étapes (des outils agréables et simples pour la mise en scène et la validation en ligne).
Git est prudent ici, ce qui est probablement une bonne chose.
Stratégie de validation générale: validations granulaires
Je pense qu'en parlant de la question "Quand dois-je monter", il faut aussi parler des habitudes de commit.
VCS centralisé
Dans les systèmes de contrôle de version centralisés où vous vous engagez sur un serveur central, il était important pour vos collègues que vos validations soient complètes et bien testées. Les utilisateurs essaient donc de valider moins souvent, puis de valider l'état des fichiers complets pour minimiser la possibilité d'une erreur. Ainsi, un commit a tendance à être de gros morceaux qui incluent de nombreux changements (s'ils ne sont pas de simples correctifs). Les modifications d'un commit peuvent être totalement indépendantes.
Git
Dans Git, une validation est effectuée localement, uniquement les pousser vers un serveur les rend publics. Par conséquent, un commit est bon marché dans un sens. Un commit au sens de la subversion est plutôt comparable à plusieurs git commit
suivis de git push
. Cette différence est importante.
Git vous permet de valider des lignes de code uniques, même si vous avez également modifié d'autres lignes dans le même fichier. Cela vous offre de nombreux avantages car vous pouvez par exemple valider un correctif de sécurité dans la ligne 100 tout en ayant modifié les lignes 300-350 en introduisant une nouvelle fonctionnalité.
- Vous pouvez séparer différentes modifications dans différentes validations. Cela les sépare bien dans l'historique de vos versions et vous permet même de revenir sur l'un mais pas sur l'autre.
- Votre commit ne doit pas nécessairement refléter un état de "compilation" de votre copie de travail (bien que j'essaie de le conserver de cette façon).
Alors, où est le "contrôle qualité" et la garantie de construction dans un commit auquel un utilisateur subversion s'attendrait? Il est déplacé vers d'autres actions dans git. Vous voulez toujours pousser un état de fonctionnement du programme dans un référentiel public. Par conséquent, vous vous assurez que les tests sont réussis et que le programme fonctionne avant de pousser vos modifications.
Essayez également d'utiliser les branches au maximum. Lors de la validation de nombreux petits changements, vous vous retrouverez avec un historique de version assez volumineux. Si vous travaillez dans des branches, vous pouvez classer ces validations granulaires par le nom de la branche, puis les fusionner (l'option --no-ff
conservera également que ces fonctionnalités vivaient dans une branche unique).
C'est-à-dire que vous pouvez conserver l'habitude de fusionner avec la master
branche uniquement si la branche est en bon état. Vous pouvez également utiliser des balises pour suivre les jalons et les versions.
Maintenant, revenons à la mise en scène: une fois que vous avez validé quelques lignes par commit, vous effectuerez une étape directement avant de valider. (C'est du moins ainsi que je le fais).
git diff
etgit diff --cached
c'est bien, mais parfois j'en veux plus).