J'ai vu beaucoup de conseils sur les modèles de branchement git et l'opinion la plus courante semble être que faire des changements directement sur la branche principale est une mauvaise idée.
Un de nos collègues est très heureux d'apporter des modifications directement sur la branche principale, et malgré plusieurs conversations, il ne semble pas probable que cela change.
À ce stade, je ne peux pas convaincre un collègue que c'est une mauvaise pratique de travailler directement sur le maître, mais j'aimerais comprendre les choses qui entreront en conflit avec sa façon de travailler, savoir quand je dois revoir ce problème.
Il y a plusieurs problèmes lorsque les validations sont directement poussées vers le master
Expliquez-lui que nouvelles fonctionnalités ont besoin de leur propre branche de développement qui peut être déployée dans un environnement de test avant d'être poussée en production.
Sinon, vous êtes dans un état perpétuel de fonctionnalités à moitié terminées. Vous ne pouvez pas déployer des fonctionnalités à moitié terminées en production, donc si vous travaillez directement sur la branche principale, tout le monde doit attendre que vous terminiez votre fonctionnalité avant que les modifications de quelqu'un d'autre puissent passer en production, y compris les corrections de bogues.
L'utilisation de branches indépendantes pour les fonctionnalités signifie que chaque nouvelle fonctionnalité peut être testée et déployée indépendamment des autres.
Le maître devrait être potentiellement libérable. Période. Il ne devrait pas y avoir de travail à moitié terminé dans le maître (sauf s'il est désactivé avec un indicateur de fonctionnalité)
Cela dit, j'ai vu certaines équipes compliquer leur flux.
Ne pas utiliser PR lors de l'intégration à master est une erreur car les développeurs n'auront pas le pouvoir de choisir le moment de l'intégration.
Une seule branche de développement apporte très peu de valeur. Habituellement, cela ne fait que compliquer les choses. De nombreuses branches de fonctionnalités apportent beaucoup de valeur.
Faire des branches pour chaque environnement (dev, test, prod) est une erreur. Ceci est hors de portée pour git et devrait être géré par le pipeline de versions. La même version exacte doit être déployée dans tous les environnements, ce qui est impossible s'il existe des branches pour chaque environnement.
Si une fonctionnalité est si volumineuse qu'elle ne peut pas être effectuée en un jour ou deux, tout le travail dans une branche de fonctionnalité doit être dans des branches distinctes et intégré à PR.
Un de nos collègues est très heureux d'apporter des modifications directement sur la branche principale, et malgré plusieurs conversations, il ne semble pas probable que cela change.
Cela m'amène à croire qu'il y a plus de problèmes. Travailler sur master ou non fait principalement partie d'une philosophie plus large sur comment, quoi et quand vous lancez des produits.
Donc, en tandem avec un "vous ne devriez jamais travailler sur le maître", avez-vous des tests de fonctionnalités, testez-vous le travail les uns les autres, examinez-vous le code les uns des autres. Tests d'acceptation et d'intégration.
Si vous n'avez rien de ce qui précède et que vous le faites juste pour "faire du git", vous pourriez aussi bien travailler sur master.
D'autres réponses ont déjà mentionné divers avantages (fonctionnalités isolées, code toujours livrable sur le maître, etc.) pour travailler PAS directement sur le maître.
Pour moi, vous semblez avoir un problème différent. De toute évidence, vous n'avez pas de processus de développement, qui est accepté ou utilisé par tous vos développeurs (ou votre développeur en question ignore totalement le processus).
Avez-vous des branches de fonctionnalités qui sont fusionnées en master ou avez-vous également des branches de versions différentes ou utilisez-vous un processus totalement différent?
"Ne pas utiliser la branche principale" n'est pas suffisant.
Tout d'abord, je tiens à souligner que dans git, chaque pull
est littéralement une opération de branchement, et chaque Push
est une fusion. Le master
sur la machine d'un développeur est une branche complètement distincte du master
sur un référentiel central que vous partagez, avec un statut égal d'un point de vue technique. Je vais parfois renommer ma version locale en upstream
ou quelque chose si cela convient mieux à mes besoins.
Je le signale parce que de nombreuses organisations pensent qu'elles utilisent les succursales plus efficacement que votre collègue, alors qu'en réalité, elles ne font guère plus que de créer un nom supplémentaire pour une succursale en cours de route, qui ne sera de toute façon pas enregistré dans l'historique. Si votre collègue valide des fonctionnalités dans une validation atomique, il est tout aussi facile de revenir en arrière qu'une validation de fusion d'une branche de fonctionnalité. La grande majorité des branches caractéristiques doivent être de très courte durée et souvent fusionnées de toute façon.
Cela dit, les principaux inconvénients de son style de travail sont doubles. Tout d'abord, il est très difficile de collaborer sur une fonctionnalité inachevée. Cependant, il ne serait pas difficile de créer une branche uniquement aux moments où une collaboration est nécessaire.
Deuxièmement, cela rend l'examen avant fusion très difficile. Sur ce point, vous n'avez pas vraiment besoin de le convaincre. Vous pouvez adopter un outil comme github, gerrit ou gitlab, et exiger des révisions de code de demande d'extraction et des tests automatisés réussis pour toutes les fusions. Si vous ne faites pas quelque chose comme ça, franchement, vous n'utilisez pas git à son plein potentiel, et il n'est pas étonnant que votre collègue ne voit pas ce potentiel.
Il n'y a aucune "mauvaise pratique" à travailler directement sur la branche. Mais vous devez décider ce qui soutient le mieux votre processus:
Question 1: Votre maître doit-il représenter l'état de sortie actuel de votre logiciel? Ensuite, vous devez introduire une branche de développement global et fusionner le développement à la fin du développement d'une version.
Question 2: Voulez-vous avoir un processus de révision du code? Ensuite, vous devriez avoir des "branches de fonctionnalités" qui seront fusionnées en master (ou développées, si vous en avez une) via des requêtes pull.
Question 3: Est-il nécessaire de partager l'état de code intermédiaire avec d'autres développeurs qui ne devraient pas encore être publiés en production (ou test)? C'est le cas où plus d'un développeur développe une fonctionnalité. Ensuite, vous devez introduire des "branches de fonctionnalités".