Extrait du livre Git SCM :
Souvent, lorsque vous travaillez sur une partie de votre projet, les choses sont dans un état désordonné et vous voulez changer de branche pour travailler un peu sur autre chose. Le problème est que vous ne voulez pas faire un commit de travail à moitié fait juste pour pouvoir revenir à ce point plus tard. La réponse à ce problème est la commande git stash.
Le stashing prend l'état sale de votre répertoire de travail - c'est-à-dire vos fichiers suivis modifiés et les changements intermédiaires - et l'enregistre sur une pile de changements inachevés que vous pouvez réappliquer à tout moment.
Compte tenu de cette description, je dirais qu'il s'agit d'un Anti Pattern. Une explication trop simplifiée de Git Stash serait qu'il s'agit du "couper-coller" du contrôle de code source. Vous prenez un tas de fichiers modifiés, les «planquez» dans un stylo en dehors du flux de travail de branchement normal de Git, puis réappliquez ces modifications à une autre branche à une date ultérieure.
Pour revenir un peu plus loin, s'engager à maîtriser est ici le modèle anti . Utilisez des branches. C'est pour cela qu'ils ont été conçus.
Cela se résume vraiment à ceci:
Vous pouvez enfoncer une vis dans le mur et elle tiendra une photo, mais vous devez utiliser un tournevis. N'utilisez pas de marteau lorsque le tournevis est assis juste à côté de vous.
A propos de la validation du code "cassé"
Bien que ce qui suit soit une opinion, je suis arrivé à cette opinion par expérience.
Engagez-vous tôt et engagez-vous souvent. Validez autant de code cassé que vous le souhaitez. Affichez votre historique de validation local en tant que «points de sauvegarde» pendant que vous piratez quelque chose. Une fois que vous avez fait un travail logique, faites un commit. Bien sûr, cela pourrait tout casser, mais cela n'a pas d'importance tant que vous ne poussez pas ces commits. Avant de pousser, rebaser et écraser vos commits.
- Créer une nouvelle branche
- Hack hack hack
- Valider le code cassé
- Polir le code et le faire fonctionner
- Valider le code de travail
- Rebase et Squash
- Tester
- Poussez lorsque les tests réussissent
Pour l'OP, ce fil de message kernel Linux pourrait être intéressant, car il semble que certains membres de l'équipe de l'OP utilisent Git de manière similaire.
@RibaldEddie a déclaré dans un commentaire ci-dessous:
Tout d'abord, une cachette n'est pas en dehors d'un "workflow de branchement" car sous la hotte, une cachette n'est qu'une autre branche.
(au risque de provoquer la colère de nombreuses personnes)
Linus a déclaré:
Avec "git stash", vous pouvez aussi avoir plusieurs choses cachées différentes, mais elles ne font pas la queue les unes sur les autres - ce sont juste des correctifs indépendants aléatoires que vous avez cachés parce qu'ils étaient gênants à un moment donné.
Ce que je pense que @RibaldEddie essaie de dire, c'est que vous pouvez l'utiliser git stash
dans un flux de travail de branche de fonctionnalité - et c'est vrai. Ce n'est pas l'utilisation de git stash
qui est le problème. C'est la combinaison de l'engagement à maîtriser et à utiliser git stash
. Ceci est un anti motif.
Clarifier git rebase
Du commentaire de @ RibaldEddie:
Le rebasage ressemble beaucoup plus au copier-coller et, pire encore, modifie l'historique engagé.
(Souligner le mien)
La modification de l'historique des validations n'est pas une mauvaise chose, tant qu'il s'agit de l'historique des validations locales . Si vous rebasiez les commits que vous avez déjà poussés, vous serez essentiellement orphelin pour toute autre personne utilisant votre branche. C'est mauvais.
Supposons maintenant que vous ayez effectué plusieurs validations au cours d'une journée. Certains commits étaient bons. Certains ... pas si bons. La git rebase
commande associée à l'écrasement de vos validations est un bon moyen de nettoyer votre historique de validations local. Il est agréable de fusionner en un seul commit avec les branches publiques, car il garde propre l'historique des commit des branches partagées de votre équipe. Après le rebasage, vous voudrez tester à nouveau, mais si les tests réussissent, vous pouvez pousser un commit propre au lieu de plusieurs sales.
Il existe un autre fil intéressant du noyau Linux sur l'historique des validations propres .
Encore une fois, de Linus:
Je veux une histoire propre, mais cela signifie vraiment (a) une histoire propre et (b).
Les gens peuvent (et devraient probablement) rebaser leurs arbres privés (leur propre travail). C'est un nettoyage . Mais jamais les autres peuples ne codent. C'est une "histoire de détruire"
La partie historique est donc assez facile. Il n'y a qu'une seule règle majeure et une précision mineure:
Vous ne devez JAMAIS détruire l'histoire des autres peuples. Vous ne devez pas rebaser les engagements d'autres personnes. Fondamentalement, s'il n'a pas votre approbation, il est interdit: vous ne pouvez pas le rebaser, car ce n'est pas le vôtre.
Notez que cela concerne vraiment l' histoire des autres peuples , pas le code des autres peuples . S'ils vous ont envoyé des trucs sous forme de patch envoyé par e-mail et que vous les avez appliqués avec "git am -s", alors c'est leur code, mais c'est
votre historique.
Ainsi, vous pouvez vous déchaîner sur la chose "git rebase", même si vous n'avez pas écrit le code, tant que la validation elle-même est privée.
Clarification mineure de la règle: une fois que vous avez publié votre historique sur un site public, d'autres personnes peuvent l'utiliser, et maintenant ce n'est clairement plus votre historique privé .
Donc, la clarification mineure est vraiment qu'il ne s'agit pas seulement de "votre commit", mais aussi qu'il est privé de votre arbre, et que vous ne l'avez pas encore poussé et annoncé.
...
Maintenant, la partie "propre" est un peu plus subtile, bien que les premières règles soient assez évidentes et faciles:
Gardez votre propre histoire lisible
Certaines personnes le font simplement en réglant les choses en tête et en ne faisant pas d’erreurs. mais c'est très rare, et pour le reste d'entre nous, nous utilisons "git rebase" etc. pendant que nous travaillons sur nos problèmes.
Donc, "git rebase" n'est pas faux. Mais ce n'est vrai que si c'est VOTRE TRÈS PROPRE arbre git PRIVÉ.
N'exposez pas vos conneries.
Cela signifie: si vous êtes encore dans la phase "git rebase", vous ne le repoussez pas. S'il n'est pas prêt, vous envoyez des correctifs ou utilisez des arborescences git privées (tout comme un «remplacement de série de correctifs») dont vous ne parlez pas au grand public.
(c'est moi qui souligne)
Conclusion
En fin de compte, l'OP a quelques développeurs qui font ceci:
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
Ici, nous avons deux problèmes:
- Les développeurs s'engagent à maîtriser. Verrouillez-le immédiatement. C'est vraiment le plus gros problème.
- Les développeurs utilisent
git stash
et git pull
maîtrisent constamment quand ils devraient utiliser des branches de fonctionnalités.
Il n'y a rien de mal à utiliser git stash
- en particulier avant un pull - mais utiliser git stash
de cette manière est un anti-pattern quand il y a de meilleurs workflows dans Git.
Leur utilisation d' git stash
un hareng rouge. Ce n'est pas le problème. S'engager à maîtriser est le problème.