web-dev-qa-db-fra.com

Utilise GIT Stash comme workflow un anticipateur?

J'ai récemment envisagé comment moi et mon équipe utilise Git et comment nos flux de travail fonctionnent. Nous utilisons actuellement un flux de travail fonctionnel qui semble bien fonctionner.

J'ai également vu certaines personnes sur notre équipe utilisent le flux de travail basé sur git Stash . Le flux de travail va quelque chose comme ça:

  • Travailler sur une branche principale (comme master)
  • Faire des engagements comme vous allez
  • Si vous avez besoin d'obtenir des modifications ou des succursales, appuyez sur vos modifications non engagées sur la cachette.
  • Une fois que votre mise à jour est terminée, évitez les modifications de la cachette.

Je devrais mentionner que ce flux de travail est utilisé au lieu de un flux de travail de branche de fonctionnalité. Au lieu de prendre une succursale et de travailler dessus, des développeurs ne fonctionnent ici que sur une seule branche et poussent/apparaissent de la pile comme ils le voient.

En fait, je ne pense pas que c'est un grand flux de travail et que la ramification serait plus appropriée que d'utiliser la cachette GIT de cette manière. Je peux voir la valeur de Git Stash comme une opération d'urgence, mais pas pour l'utiliser dans un flux de travail quotidien et régulier.

Utiliser la cachette GIT sera-t-il régulièrement considéré comme un anti-motif? Si oui, quels sont certains problèmes spécifiques qui pourraient survenir? Sinon, quels sont les avantages?

25
joshin4colours

Du Git SCM Book :

Souvent, lorsque vous travaillez dans une partie de votre projet, les choses sont dans un état désordonné et vous souhaitez basculer des succursales pour travailler sur autre chose. Le problème est que vous ne voulez pas faire une commission de travail à moitié fait pour que vous puissiez revenir à ce point plus tard. La réponse à ce problème est la commande git catastrophe.

La cachette prend la saleté de votre répertoire de travail - c'est-à-dire vos fichiers suivis modifiés et vos modifications d'étapes - et l'enregistre sur une pile de modifications inachevées que vous pouvez présenter une nouvelle répartition à tout moment.

Compte tenu de cette description, je dirais que c'est un modèle anti-modèle. Une explication trop simplifiée de Stash de Git serait que c'est la "coupe et la pâte" du contrôle de la source. Vous prenez un tas de fichiers changés, "Stash" dans un stylo de maintien en dehors du flux de travail de branche normal de Git, puis réappliquez ces modifications à une branche différente à une date ultérieure.

En remontant un peu plus loin, En vous engageant à maîtriser est le modèle anti-modèle ici. Utiliser des branches. C'est ce qu'ils ont été conçus pour.

Il se résume vraiment à ceci:

Vous pouvez marteler une vis dans le mur et contenir une image, mais utiliser un tournevis est ce que vous devriez faire. N'utilisez pas de marteau lorsque le tournevis est assis juste à côté de vous.

À propos de commettre le code "cassé"

Bien que ce qui suit est d'avis, je suis venu à cette opinion de l'expérience.

S'engager tôt et commettre souvent. Commettre autant de code brisé que vous le souhaitez. Visualisez votre historique de validation local comme "Sauvegarder des points" pendant que vous pirez sur quelque chose. Une fois que vous avez effectué un travail logique, faites un commit. Bien sûr, cela pourrait tout briser, mais cela n'a pas d'importance tant que vous ne le faites pas Push Ceux-ci. Avant de pousser, de rebaser et de courter votre engagement.

  1. Créer une nouvelle branche
  2. Hack hack hack
  3. Commettre le code brisé
  4. Polir le code et le faire fonctionner
  5. Commettre le code de travail
  6. Rebase et courge
  7. Test
  8. Pousser lorsque des tests passent

Pour l'OP, ceci thread de message Kernal Linux Pourrait être intéressant, car il semble que certains membres de l'équipe de l'OP utilisent de manière similaire.

@Ribaldeddie a dit dans un commentaire ci-dessous:

Tout d'abord, une cachette n'est pas en dehors d'un "flux de travail de ramification" depuis sous la capuche, une cachette est juste une autre branche.

(au risque d'engager la colère de nombreuses personnes)

Linus a dit:

Avec "git Stash", vous pouvez également avoir plusieurs choses cachées différentes, mais elles ne font pas la queue sur l'autre - elles ne sont que des correctifs indépendants aléatoires que vous avez cachés parce qu'ils étaient peu pratiques à un moment donné.

Ce que je pense @ribaldeddie essaie de dire, c'est que vous pouvez utiliser git stash Dans un flux de travaux de branche de fonctionnalité - et c'est vrai. Ce n'est pas l'utilisation de git stash c'est le problème. C'est la combinaison de s'engager à maîtriser et à utiliser git stash. Ceci est un modèle anti-modèle.

Clarification git rebase

Du commentaire de @ Ribaldedie:

Rebasing est beaucoup plus semblable à la copie-colle et même pire modifie l'historique commis.

(Mettre l'accent sur le mien)

La modification de l'historique de validation n'est pas une mauvaise chose, tant que c'est Histoire de validation locale. Si vous rebasez comme vous l'avez déjà poussé, vous vous orpherez essentiellement quelqu'un d'autre à l'aide de votre succursale. C'est mauvais.

Maintenant, disons que vous avez fait plusieurs commits au cours d'une journée. Certains commets étaient bons. Certains ... pas si bon. Les git rebase commande en conjonction avec écrasement de vos engagements est un bon moyen de nettoyer votre historique de validation local. C'est bien de fusionner dans un engagement envers les succursales publiques, car il conserve l'historique de validation des branches partagées de votre équipe propre. Après la reconditionnement, vous voudrez rétablir à nouveau, mais si les tests passent, vous pouvez pousser un commettre propre au lieu de plusieurs sales.

Il y a un autre fil de noyau de linux intéressant sur historique de validation propre .

Encore une fois, de Linus:

Je veux une histoire propre, mais cela signifie vraiment (a) l'histoire propre et (b).

Les gens peuvent (et devraient probablement) rebaser leur privé Arbres (leur propre travail). C'est un nettoyage. Mais jamais le code des autres peuples. C'est une "histoire destroy"

Donc, la partie d'histoire est assez facile. Il n'y a qu'une seule règle majeure et une clarification mineure:

  • Vous ne devez jamais détruire jamais l'histoire des autres peuples. Vous ne devez pas rebaser commettre d'autres personnes. Fondamentalement, s'il ne dispose pas de votre signature, c'est hors limites: vous ne pouvez pas la repasser, car ce n'est pas à vous.

    Notez que cela concerne vraiment les autres peuples Histoire, pas sur les autres peuples Code. S'ils vous ont envoyé des choses comme un patch email, et que vous l'avez appliqué avec "Git AM -S", c'est leur code, mais c'est votre Historique.

    Donc, vous pouvez aller à l'état sauvage sur la chose "Git Rebase", même si vous n'avez pas écrit le code, tant que la commission elle-même est votre entreprise privée.

  • Clarification mineure à la règle: Une fois que vous avez publié votre histoire sur certains sites publics, d'autres personnes peuvent l'utiliser, et il n'est donc clairement pas votre privé Historique.

    Donc, la clarification mineure est vraiment que ce n'est pas seulement à propos de "votre commit", il s'agit également d'être privé pour votre arbre, et vous n'avez pas encore poussé et l'a 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 en travaillant en premier lieu dans leur tête et ne faisant pas d'erreur. 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.

    SO "GIT REBASE" n'est pas faux. Mais c'est juste seulement si c'est votre propre arbre privé privé.

  • N'exposez pas votre merde.

    Cela signifie: Si vous êtes toujours dans la phase "Git Rebase", vous ne le poussez pas. Si ce n'est pas prêt, vous envoyez des correctifs, ou utilisez des arbres privés de git (tout comme un "remplacement de la série de correctifs") que vous ne dites pas au grand public.

(mettre l'accent sur le mien)

Conclusion

En fin de compte, l'OP a des développeurs qui font cela:

git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)

Ici, nous avons deux problèmes:

  1. Les développeurs s'engagent à maîtriser. Verrouiller cela immédiatement. Vraiment, c'est le plus grand problème.
  2. Les développeurs utilisent constamment git stash et git pull sur maître quand ils devraient utiliser des branches de fonctionnalités.

Il n'y a rien de mal à utiliser git stash - surtout avant une traction - mais en utilisant git stash De cette manière est un anti-modèle lorsqu'il y a de meilleurs flux de travail dans Git.

Leur utilisation de git stash un hareng rouge. Ce n'est pas le problème. S'engager à maîtriser est le problème.

32
Greg Burghardt

Personnellement, j'utilise uniquement stash pour des interruptions courtes et inattendues, comme une personne posant une question qui nécessite de passer à une branche différente. Je fais cela parce que j'ai oublié les cachettes avant, puis ils ne s'appliqueraient pas proprement. Les commissions régulières sur les branches de fonctionnalités sont beaucoup plus difficiles à oublier et plus facile à fusionner, alors j'ai tendance à faire un commit brisé, puis faire un git reset HEAD~1 ou une boîte de rebas si je ne veux pas le garder plus tard.

Cependant, la grande chose à propos du contrôle de la version distribuée est que les gens peuvent utiliser leur flux de travail préféré dans leurs propres référentiels, à condition que les référentiels partagés répondent aux normes. Je ferais que les gens ne veulent pas simplement utiliser un flux de travail stash, car ils n'ont pas assez de formation ni de sensibilisation aux alternatives, mais s'ils choisissent toujours un flux de travail que vous trouvez sous-optimal, je le laisserais.

7
Karl Bielefeldt

Je pense que la partie de votre question qui est un anti-motif est l'utilisation d'une branche unique partagée maître. Cependant, si vous devez inclure une succursale Développer en plus de la succursale principale, puis utilisez des cachettes pour faire face à vos propres commutateurs contextuels dans la branche Développement, ce ne serait pas un anti-motif, et Très étroitement reflète une partie du flux de travail décrit par des organisations telles que Etsy et Facebook.

Cela a été dit, la réponse de @greg Burghardt ci-dessus est un peu trop favorable au flux de travaux dites du flux git-fluide ou de la branche de fonctionnalité. Je plaidais pour une stratégie similaire, mais après avoir réalisé qu'il ajoute une complexité inutile et crée un faux sentiment de sécurité, je ne le fais plus. C'est aussi une hausse des jours des systèmes de contrôle de version non décentralisés tels que Subversion.

Tout d'abord depuis que GIT est un système de contrôle de version décentralisé contrairement à la subversion, le référentiel local du développeur est essentiellement une branche géante du code en soi. Ce qu'un individu se développe localement ne doit pas avoir d'impact sur les autres membres de l'équipe, à moins que le code brisé ou le code de buggy ne soit poussé à des succursales partagées dans un référentiel partagé.

Le commandement de la Rebase peut toutefois endommager l'histoire de la succursale lorsqu'il existe un conflit de fusion dans l'un des engagements rejoués. De http://ryantablada.com/post/the-dangers-of-rebasing-a-branch

Le reste de la boîte de rebas va bien, les tests semblent tous passer. Un PR est fait.

Et puis un autre code est écrit qui s'appuie sur la propriété commentairesForAlposts et tout est cassé. Mais à qui allons-nous demander de l'aide? GIT blâme montre que la ligne de code n'a été écrite que par l'ingénieur latéral du serveur et il jette ses mains.

Maintenant, votre ingénieur front-end est en vacances, congé de maladie ou qui sait. Personne ne peut comprendre ce que ce code devrait ressembler!

Rebase a tué la capacité de l'équipe à regarder l'histoire pour trouver ce qui s'est mal passé, car tout conflit de fusion sur la branche enfant est tué et que le code d'origine est perdu pour toujours.

Si ce même conflit de fusion a eu lieu et que la fusion a été utilisée, le blâme montrerait que cette ligne de code avait été touchée dans le processus de fusion, la STATE de la Direction des parents et la STATE de la Direction de l'enfant. Certaines jouant avec les trois permutations et vous pouvez obtenir l'intention d'origine dans la base de code et travailler sans tonne de tête gratter un doigt pointé. Et tout ce que tu avais vraiment était un autre commettre

En outre, un modèle de branchement multiple présuppose que les deux branches ne pouvaient jamais contenir des changements de code interdépendants. Lorsque cela se produit inévitablement, le développeur doit maintenant jongler en jonghant encore plus de branches pour travailler efficacement.

L'anti-modèle fondamental que je vois n'est pas lié aux succursales par rapport aux catastrophes, mais plutôt plus sur les types de problèmes que certaines personnes très intelligentes parlent depuis un moment: avez-vous confiance dans votre code via l'utilisation de Tests unitaires et une bonne architecture? Pouvez-vous effectuer des modifications incrémentielles à votre code de manière à ce que vos développeurs puissent raisonner facilement les changements et comprendre ce qu'un changement fera? Vos développeurs courent-ils même à travers un nouveau code une fois pour voir si cela fonctionne réellement? (Oui je l'ai déjà vu auparavant).

Si la réponse à ces questions est non, cela n'a pas d'importance combien de succursales que vous avez ... Les développeurs diront que le code est prêt, travaillant et conviendra pour la production quand ce n'est vraiment pas, et aucun nombre de branches ne le fera vous aider lorsque ce code monte à la production de toute façon.

1
RibaldEddie

git stash Est un outil. En soi, ce n'est pas un motif, ni un anti-motif. C'est un outil, tout comme un marteau est un outil. L'utilisation d'un marteau pour entraîner des clous est un motif et l'utilisation d'un marteau pour entraîner des vis est un modèle anti-modèle. De même, il y a des flux de travail et des environnements où git stash Est l'outil correct à utiliser, ainsi que les flux de travail et les environnements où il est faux.

Le flux de travail "Tout le monde commettez-vous et appuyez sur le flux de travail de la ligne principale est celui qui fonctionne assez raisonnablement là où il n'y a pas de changements à risque élevé. C'est souvent vu utilisé dans les environnements SVN où il y a un serveur central faisant autorité qui a le code.

Git, cependant, liens pour éliminer le serveur central. Avoir tous les développeurs qui font commit, pull (ou rebase si vous êtes dans cela), Push Tout le temps peut faire un gros gâchis.

Les principaux problèmes proposent que vous ayez quelque chose en progrès qui vous est brisé et vous devez travailler sur un bogue prioritaire. Cela signifie que vous devez définir ce travail de côté pour un peu, attrapez le dernier travail sur ce Sans Avoir les travaux précédents en cours, causer des problèmes avec la construction que vous essayez de faire.

Pour cela, git stash Serait l'outil approprié à utiliser.

Il y a cependant un problème plus important qui se cache au cœur de ce flux de travail. Est-ce tout Les rôles des branches de contrôle de la version sont sur une seule branche. La ligne principale, le développement, la maintenance, l'accumulation et l'emballage sont tous en maîtrise. Ceci est un problème. (Voir Stratégies de branchement SCM avancées Pour plus d'informations sur cette approche des branches)

Et oui, vous avez appelé que ce n'est pas un grand flux de travail et qu'il y ait des problèmes avec cela. Cependant, le problème n'est pas avec l'outil git stash. Le problème est le manque de ramification distincte pour les rôles ou pour politiques incompatibles .

git stash Cependant, c'est quelque chose que j'ai utilisé quand j'ai eu une situation où j'ai construit un peu, j'ai eu un état collant que je n'étais pas sûr si c'était le bon .. . Ainsi j'ai caché mes modifications puis j'ai exploré une autre approche pour résoudre le problème. Si cela fonctionnait - génial, jetez les trucs sur la cachette et continuez. Si l'autre exploration a été collante, réinitialisez-vous à la modification précédente et réappliquez la réserve pour travailler à ce sujet. L'alternative serait de commettre, de la caisse, de la succursale, puis de continuer sur cette nouvelle branche ou de revenir en arrière et de le réinitialiser. La question est que cela vaut vraiment la peine de mettre cela dans l'histoire quand c'est juste quelque chose que je veux explorer un peu?

git stash N'est pas un modèle anti-modèle. En utilisant git stash Comme alternative à la ramification, tandis que tout le monde s'engage au maître est un modèle anti-modèle - mais pas à cause de git stash.

Si vous n'avez pas encore frappé cela, attendez simplement que vous ayez problèmes avec les constructions , lorsque quelqu'un doit apporter des modifications architecturales importantes dans de nombreux fichiers (et les conflits de fusion) ou certains travaux non testés dans le code de progression. Cela échappe à la production pour cet anti-motif pour vous rattraper.

1
user40980