Introduction à Git Merge et Git Rebase: pourquoi et quand les utiliser

Souvent, les développeurs ont le choix entre Fusionner (fusionner) et Rebaser (relocalisation). Dans Google, vous verrez une opinion différente, beaucoup sont invités à ne pas utiliser Rebase, car cela peut causer de graves problèmes. Dans l'article, j'expliquerai ce qu'est la fusion et le déplacement, pourquoi vous devriez (ou ne devriez pas) les utiliser et comment le faire.

image

Git Merge et Git Rebase partagent le même objectif. Ils sont conçus pour intégrer les changements d'une branche à l'autre. Bien que l'objectif final soit le même, les principes de fonctionnement sont différents.

Certaines personnes pensent que vous devriez toujours utiliser Rebase, d'autres préfèrent Fusionner. Cela a ses avantages et ses inconvénients.

Fusion Git


La fusion est une pratique courante pour les développeurs utilisant des systèmes de contrôle de version. Que les branches soient créées pour les tests, la correction de bogues ou pour d'autres raisons, la fusion capture les modifications ailleurs. La fusion prend le contenu de la branche source et les fusionne avec la branche cible. Dans ce processus, seule la branche cible est modifiée. L'historique des branches source reste inchangé.
image
Avantages:

  • simplicité;
  • préserve toute l'histoire et l'ordre chronologique;
  • maintient un contexte de branche.

Inconvénients:

  • l'historique des commits peut être rempli (pollué) avec de nombreux commits;
  • le débogage à l'aide de git bisect peut devenir plus délicat.

Comment faire

Fusionnez la branche principale dans la branche de fonction à l'aide des commandes d'extraction et de fusion .

$ git checkout feature $ git merge master (or) $ git merge master feature 

Cela créera un nouveau «commit de fusion» dans la branche de fonctionnalité, qui contient un historique des deux branches.

Git rebase


Rebase est une autre façon de pousser les changements d'une branche à une autre. Rebase compresse toutes les modifications dans un seul patch. Il intègre ensuite le patch dans la branche cible.

Contrairement à la fusion, le déplacement écrase l'historique car il transfère le travail terminé d'une branche à une autre. Le processus élimine l'histoire indésirable.

image

Avantages:

  • Simplifie une histoire potentiellement complexe
  • Simplification des manipulations avec un seul commit
  • Éviter de fusionner les commits dans des référentiels et des succursales occupés
  • Nettoie les validations intermédiaires, ce qui en fait une seule validation, ce qui est utile pour les commandes DevOps

Inconvénients:

  • La compression des fonctionnalités en quelques validations peut masquer le contexte
  • Le déplacement de référentiels publics peut être dangereux lorsque vous travaillez en équipe
  • Plus de travail apparaît
  • Pour la récupération avec des branches supprimées, une poussée est requise. Cela conduit à une mise à jour de toutes les succursales portant le même nom, à la fois localement et à distance, ce qui est terrible.

Si vous faites le pas incorrectement, l'histoire changera, et cela peut entraîner de graves problèmes, alors assurez-vous de le faire!

Comment faire

Déplacez la branche d'entité vers la branche principale à l'aide des commandes suivantes.

 $ git checkout feature $ git rebase master 

Cela déplace la branche de fonction entière vers la branche principale. L'historique du projet change, de nouveaux commits sont créés pour chaque commit dans la branche principale.

Mouvement interactif


Cela vous permet de modifier les validations lorsqu'elles sont déplacées vers une nouvelle branche. C'est mieux que le déplacement automatique car il offre un contrôle total sur l'historique des validations. Généralement utilisé pour effacer l'historique avant de fusionner la branche de fonction en maître.

 $ git checkout feature $ git rebase -i master 

Cela ouvrira l'éditeur, répertoriant toutes les validations qui seront déplacées.

 pick 22d6d7c Commit message#1 pick 44e8a9b Commit message#2 pick 79f1d2h Commit message#3 

Cela détermine exactement à quoi ressemblera la branche après son déplacement. En organisant des objets, vous pouvez créer l'histoire comme vous le souhaitez. Vous pouvez utiliser les commandes fixup , squash , edit , etc.

image

Lequel utiliser?


Alors quoi de mieux? Que recommandent les experts?

Il est difficile de prendre la seule bonne décision quant à celle qui est la meilleure à utiliser, car toutes les équipes sont différentes. Tout dépend des besoins et des traditions de l'équipe.

Prenez des décisions en fonction des compétences de l'équipe dans Git. La simplicité ou la réécriture de l'histoire est-elle importante pour vous, ou peut-être autre chose?

Qu'est-ce que je recommande?

À mesure que l'équipe grandit, il devient difficile de gérer ou de suivre les changements de développement à l'aide d'une fusion. Pour avoir un historique de commit clair et compréhensible, il est sage d'utiliser Rebase.

Avantages de Rebase:

  • Vous vous développez localement: si vous n'avez partagé votre travail avec personne d'autre. Pour l'instant, vous devriez préférer déplacer la fusion pour garder votre histoire en ordre. Si vous avez un fork de référentiel personnel qui n'est pas partagé avec d'autres développeurs, vous pouvez rebaser même après avoir déménagé dans votre branche.
  • Votre code est prêt à être revu: vous avez créé une pull request. D'autres analysent votre travail et le tirent potentiellement vers leur fiche pour un examen local. Pour le moment, vous ne devez pas déplacer votre travail. Vous devez créer un commit «redo» et mettre à jour la branche. Cela permet de garder une trace des demandes de demandes d'extraction et empêche la rupture accidentelle de l'histoire.
  • L'examen est terminé et prêt à être intégré dans la branche cible. Félicitations! Vous êtes sur le point de supprimer votre branche de fonctionnalité. Étant donné qu'à partir de maintenant, d'autres développeurs ne pourront pas fusionner ces modifications, c'est votre chance de changer votre histoire. À ce stade, vous pouvez réécrire l'historique et réinitialiser les validations d'origine, et ces «altérations» et «fusions» gênantes fusionnent en un petit ensemble de validations ciblées. La création d'une fusion explicite pour ces validations est facultative, mais elle est importante. Il enregistre lorsque la fonction a atteint le maître.

Maintenant, vous savez, bien qu'insignifiant, mais la différence entre Fusionner et Rebaser. Je suis sûr que vous prendrez la bonne décision et utiliserez ce qui vous convient.

N'oubliez pas:

 code = coffee + developer 

Source: https://habr.com/ru/post/fr432420/


All Articles