J'ai eu une discussion récemment avec des gens absolument opposés à une stratégie de rebase des branches de fonctionnalités sur GIT. Cela semble être un modèle accepté d'utiliser uniquement le rebasage pour les branches locales et privées, mais ne l'utilisez jamais lorsqu'il y a plusieurs personnes travaillant sur une même fonctionnalité et branche, selon cette soi-disant "règle d'or de la refondation" (comme expliqué ici: https : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )
Je suis juste surpris qu'il y ait un consensus à ce sujet. J'ai travaillé 3 ans avec une stratégie de rebasage complète, avec environ 20 développeurs travaillant ensemble et devinez quoi, cela a fonctionné.
Le processus est essentiellement:
- Vous créez votre branche de fonctionnalité, appelons-la "myfeature" et poussez-la vers origin / myfeature
- D'autres personnes peuvent le vérifier et y travailler
- Vous pouvez parfois le rebaser depuis master: depuis "myfeature", git rebase origin / master ; et puis, oui, vous devez pousser la force.
- Que se passe-t-il lorsque d'autres personnes veulent pousser leurs commits? Ils le rebasent simplement: git rebase origin / myfeature . Ils sont donc maintenant en avance rapide et peuvent le pousser sans forcer.
Le seul principe à respecter est que la branche de fonctionnalité appartient à quelqu'un . Le propriétaire est le seul à pouvoir pousser.
Donc, j'avoue: dès qu'il y a une force de poussée, il y a un risque de faire des erreurs. C'est vrai. Mais il y a aussi de nombreuses façons de se remettre des erreurs, et vraiment, en 3 ans de développement, je n'ai pas vu beaucoup d'erreurs poussant la force, et quand cela se produisait, nous avons toujours trouvé un moyen de récupérer correctement.
Alors, pourquoi cette "règle d'or du rebase" est-elle si largement acceptée? Y a-t-il autre chose que j'ai manqué avec ça? Je comprends que cela nécessite un minimum d'organisation (chaque stratégie nécessite une certaine organisation), mais cela fonctionne.
Réponses:
Le problème avec la poussée forcée ne concerne pas votre branche de fonctionnalité et votre maître, mais le fait de pousser votre maître vers le maître de quelqu'un d'autre - cette synchronisation va écraser leur maître avec vos modifications, ignorant tout ce qui est sur leur astuce.
Compte tenu de ce danger, il y a une raison pour laquelle vous ne devriez pas l'utiliser du tout, sauf si les choses ont mal tourné et que vous devez absolument, totalement l'utiliser pour effectuer des réparations. Un système SCM ne devrait jamais avoir besoin d'être forcé comme ça, s'il le fait parce que quelque chose a horriblement mal tourné (et ma première approche dans de tels cas serait de restaurer les sauvegardes et de répéter les opérations pour garder l'historique intact).
Alors peut-être que la question est: pourquoi rebasez-vous du tout? Pour une histoire `` propre '' lors du retour des fonctionnalités au maître? Si oui, vous jetez toute la bonne histoire concernant la ramification pour des raisons purement de style. La fusion rapide à mon humble avis n'est pas non plus une meilleure pratique non plus, vous devriez garder toute l'histoire afin de pouvoir voir ce que vous avez vraiment fait, pas une version aseptisée par la suite.
la source
Le rebase n'est pas essentiel, car vous dites que c'est principalement cosmétique. Parfois, c'est beaucoup plus simple qu'une fusion. Il peut donc avoir une valeur "réelle", mais seulement "parfois"
Une mauvaise utilisation de rebase peut être coûteuse. Il est peu probable que vous perdiez des données si vous en savez assez pour ne pas paniquer et rechercher les procédures de récupération, mais "hé personne ne pousse pendant un certain temps, je dois réparer ..." n'est pas génial. Il n'y a pas non plus de temps à consacrer à la récupération et aux tests de recherche alors qu'il aurait pu ajouter des fonctionnalités ou éliminer des bugs (ou rentrer chez lui en famille).
Avec ce compromis, les résultats de "très peu de gens font un rebase et une poussée forcée" ne sont pas très surprenants.
Certains workflows peuvent réduire le risque, par exemple le réduire à «zéro tant que vous vous souvenez des branches que vous êtes autorisé à forcer et que vous ne pouvez pas». En réalité, ils peuvent être suffisamment sûrs pour justifier le risque, mais les gens font souvent des choix basés sur un folklore plus large. Là encore, en réalité, les avantages sont assez faibles, alors à quel point le risque doit-il vraiment être minime?
la source
Pour ajouter une voix différente:
Oui, si vous travaillez comme vous le décrivez, il n'y a aucun problème avec l'utilisation
rebase
et la poussée forcée. Le point critique est: vous avez un accord dans votre équipe.Les avertissements
rebase
et amis sont pour le cas où il n'y a pas d'accord spécial. Normalement, git vous protège automatiquement, par exemple en ne permettant pas une poussée non rapide. L'utilisationrebase
et la poussée forcée annulent cette sécurité. C'est ok si vous avez autre chose en place.Dans mon équipe, nous rebasons aussi parfois les branches de fonctionnalités si l'historique est devenu désordonné. Nous supprimons l'ancienne branche et en créons une nouvelle avec un nouveau nom, ou nous nous coordonnons simplement de manière informelle (ce qui est possible car nous sommes une petite équipe et personne d'autre ne travaille dans notre référentiel).
Notez que le projet git lui-même fait aussi quelque chose de similaire: ils ont une branche d'intégration régulièrement recréée, appelée "pu" ("mises à jour proposées"). Il est documenté que cette branche est recréée régulièrement et que vous ne devez pas baser de nouveaux travaux dessus.
la source
La raison pour laquelle les utilisateurs de Git ont tendance à éviter l'historique mutable partagé est qu'il n'y a pas d'évitement ou de réparation automatique de ces problèmes. Vous devez savoir ce que vous faites et vous devez tout réparer manuellement si vous vous trompez. Autoriser exactement une personne à effectuer une poussée forcée n'est pas intuitif et contraire à la conception distribuée de Git. Que se passe-t-il si cette personne part en vacances? Est-ce que quelqu'un d'autre possède temporairement la succursale? Comment savez-vous qu'ils ne marcheront pas partout quoi que le propriétaire d'origine faisait? Et dans le monde de l'open source, que se passe-t-il si le propriétaire de l'agence s'éloigne progressivement de la communauté, sans partir officiellement? Vous pourriez perdre beaucoup de temps à attendre de céder la propriété de la succursale à quelqu'un d'autre.
Mais le vrai problème est le suivant: si vous vous trompez et que vous ne le réalisez pas immédiatement, les anciens commits disparaîtront finalement après suffisamment de temps. À ce stade, le problème peut être irrécupérable (ou au moins, potentiellement très difficile à récupérer, selon l'apparence de votre sauvegarde - sauvegardez-vous d'anciennes copies de votre référentiel Git, c'est-à-dire pas seulement des clones?).
Comparez cela avec le travail d'évolution de l'ensemble de modifications de Mercurial (qui, je dois le noter, n'est pas encore terminé ou stable). Tout le monde peut apporter les modifications à l'historique qu'il souhaite, à condition que les ensembles de modifications ne soient pas marqués comme publics. Ces modifications et rebases peuvent être poussées et tirées en toute impunité, sans avoir besoin d'un propriétaire de succursale. Aucune donnée n'est jamais supprimée; l'ensemble du référentiel local est uniquement en annexe. Les ensembles de modifications qui ne sont plus nécessaires sont marqués comme obsolètes, mais conservés indéfiniment. Enfin, lorsque vous gâchez votre historique (qui est traité comme une partie normale de votre flux de travail quotidien), il y a une commande astucieuse pour le nettoyer automatiquement pour vous. C'est le genre d'UX que les gens attendent avant de modifier l'historique partagé.
la source