Diviser les progrès de codage en validations significatives sans trop de frais généraux

23

Lorsque je travaille sur un correctif ou une fonctionnalité, je tombe parfois sur d'autres petits problèmes qui peuvent être améliorés à la volée en quelques secondes. Lorsque je les fais immédiatement, puis que je valide la fonctionnalité / correction terminée, la validation inclut plus d'une chose. Par exemple "add feature X and code clean up"ou "fix bug X and improved logging". Il serait préférable de diviser cela en deux commits. Dans le cas où les deux changements se sont produits dans le même fichier, je ne peux pas simplement ajouter un fichier, valider, ajouter l'autre puis recommencer. Je vois donc les trois options suivantes:

  1. Oubliez délibérément les choses non liées tout en travaillant sur quelque chose.

  2. Copiez le fichier avec deux modifications, annulez-le, incluez une modification, validez, incluez l'autre modification, validez à nouveau.

  3. Ne modifiez pas les petites choses sans rapport, mais ajoutez-les à une liste de tâches et faites-les plus tard.

Je n'aime pas vraiment les trois options, pour les raisons suivantes:

  1. La qualité du code peut souffrir si l'on ne résout pas les petits problèmes. Et je me sens mal si je manque consciemment une chance d'améliorer quelque chose sans trop d'effort.

  2. Cela augmente le travail manuel et est sujet aux erreurs.

  3. C'est bien pour les tâches pas si minuscules, mais ajouter un petit élément à une liste de tâches et le revisiter plus tard prend souvent beaucoup plus de temps que de le corriger immédiatement.

Comment gérez-vous de telles situations?

Tobias Hermann
la source
7
Git ne vous permet-il pas d'archiver des lignes individuelles plutôt que des fichiers entiers?
Kilian Foth
Le doublon possible des validations peut-il être considéré comme trop petit?
gnat
J'utilise git add -pbeaucoup ce qui me permet de sélectionner de manière interactive les parties des fichiers que je veux valider. Si le nettoyage est suffisamment séparé, c'est facile à faire. Si la séparation est plus difficile, je valide l'état sur une branche temporaire, puis j'ajoute manuellement les modifications à ma branche réelle jusqu'à ce qu'il n'y ait pas de différence dans la branche temporaire. Cela nécessite beaucoup plus de travail, mais me permet de vérifier que chaque commit fonctionne seul.
amon
1
@gnat: évidemment pas dupe. OP ne demande pas la taille correcte d'un commit - il veut faire de petits commits. Il cherche simplement un moyen plus efficace de le faire.
Doc Brown
2
@gnat: la première réponse ne dit rien (!) sur la façon de gérer les différentes modifications dans un fichier et de les diviser en commits séparés.
Doc Brown

Réponses:

11

Je pense que vous devez être très pragmatique lors de la programmation. Même s'il est possible de formuler le schéma, le flux de travail ou la mise en œuvre parfaits, il suffit parfois de faire le travail. Voici ce que je fais:

J'utilise la capacité de git pour mettre en scène / valider des morceaux et des lignes individuels, dans la mesure du possible, pour séparer les modifications non liées, bien que cela puisse occasionnellement introduire des problèmes temporaires, si la séparation n'a pas été effectuée correctement. Étant donné que les modifications seront adjacentes, ce n'est généralement pas un problème majeur, sauf si vous avez une politique de test de chaque modification individuelle dans votre pipeline CI.

Lorsque le changement non lié est trop important, je le mettrai sur une liste de tâches et le prendrai généralement juste après, tout en étant frais dans ma tête. Parfois, cela peut prendre un jour ou deux avant que je puisse y revenir, cela dépend de ma tâche actuelle et de mon courant de pensée. Parfois, je vais simplement mettre un TODO: à côté du code incriminé, si je n'ai pas une bonne solution prête.

Il arrive que ce n'est tout simplement pas pratique de séparer les choses et je vais commettre l'ajustement mineur avec le travail original.

La taille du changement est généralement le facteur déterminant lorsque je choisis l'itinéraire à suivre, mais au final, je préfère de loin ignorer une règle de workflow, plutôt que de laisser une odeur derrière.

axl
la source
7

Mon éditeur dispose d'un plugin qui facilite extrêmement la mise en scène de parties individuelles d'un fichier. J'imagine que d'autres éditeurs de programmeurs pourraient avoir des plugins similaires, bien que vous puissiez toujours le faire de manière manuelle avec git add --patch | -p. Ensuite, j'utilise git stash pour enregistrer mes autres modifications afin de tester mon petit commit de manière isolée. Ensuite, après avoir commis, je fais juste un git stash popet continue où je me suis arrêté. C'est précisément pour cela que ces fonctionnalités ont été conçues.

Karl Bielefeldt
la source
2

L'astuce n'est pas de faire des changements à moins que vous ne soyez prêt à y consacrer autant d'efforts que le changement le mérite.

Ce que j'ai tendance à faire, c'est d'ajouter à une liste de tâches (parfois en ajoutant des commentaires au code, parfois dans une note sur un ticket de bogue, et parfois en mettant à jour le code dans une branche distincte sachant que le correctif sera éventuellement fusionné). S'il n'y a pas de ticket de bogue pour un cumul de problèmes de qualité mineurs, j'en soulève un spécifiquement pour cela, donc moi et tout le monde pouvons dire quelle était la raison de ces changements de code lorsque la branche est fusionnée. Je ne fais jamais que des changements pour le plaisir, tout est traçable afin que mes collègues ne soient pas trop surpris lorsque le code change.

Donc en bref - oui, ignorez-les lors du codage. Si vous ajoutez une fonctionnalité, ne soyez pas tenté d'ajouter 2 fonctionnalités, aussi petites soient-elles. Si quelqu'un décide de rétablir votre branche (parce que votre fonctionnalité n'est plus requise, disons), vous perdrez également tous vos mini-corrections de bogues. De même, vous ne voulez pas faire un petit «correctif» dans un code critique qui fonctionnait correctement.

gbjbaanb
la source
1
Le PO n'a pas suggéré de fusionner deux changements en un seul commit, bien au contraire.
Doc Brown
1
@DocBrown, il suggère cependant de mélanger 2 changements dans une seule branche, ce qui peut être compliqué à décocher plus tard, mais évidemment pas aussi compliqué que 2 changements dans un seul commit.
gbjbaanb
Ok, je vois ce que vous avez en tête avec votre dernier paragraphe.
Doc Brown
2

Une option que j'utilise un peu est d'ajouter des TODOcommentaires, puis de faire de nombreuses validations "partielles" fréquentes, en utilisant git add --patchpour sélectionner les parties pertinentes du fichier. Ensuite, utilisez git rebase --interactivepour réorganiser et fusionner les validations partielles dans la fonctionnalité finale et les validations de correction avant de les pousser.

Cela maintient votre commit principal propre et vous permet toujours de résoudre immédiatement les autres problèmes que vous rencontrez.

Il n'y a rien de mal à un git rebasedans ce contexte car vous ne faites que réécrire les commits locaux.

À M
la source
1

Une autre option pourrait être de "git stash" vos modifications actuelles. Le flux de travail ressemblerait à ceci:

  1. Commencez à apporter des modifications liées à la fonction A
  2. Découvrez le bug B et décidez de le corriger immédiatement
  3. À partir de la ligne de commande de votre dépôt, effectuez git stash (après quoi votre code reviendra à l'état dans lequel il se trouvait avant de commencer à travailler sur la fonction A )
  4. À ce stade, vos modifications non validées pour la fonctionnalité A sont stockées dans la "cachette"
  5. Apportez les modifications de code nécessaires pour corriger le bogue B et effectuez une nouvelle validation dans le référentiel
  6. Depuis la ligne de commande, exécutez git stash pop
  7. Vos modifications non validées pour la fonctionnalité A sont maintenant retirées de la cachette et restaurées dans votre code en cours à côté du correctif (déjà validé ) pour le bogue B
Zach
la source
Pourriez-vous développer un peu plus sur le fonctionnement de ce flux de travail? Quel est l'état du référentiel à chaque point? Pourriez-vous expliquer à quelqu'un comment utiliser git stash?
0

Mettez en scène (et validez) séparément les modifications liées à la correction de bogue. Dans Git Extensions, cela est extrêmement facile à faire. Depuis la ligne de commande, je pense que vous devez le faire git add -p.

Andrew Coleson
la source