Git merge vs rebase : différences, exemples et quand utiliser chacun

  1. Accueil
  2. Blog
  3. Développement logiciel
Développement logiciel

Git merge vs rebase : différences, exemples et quand utiliser chacun

Git merge vs rebase détermine l’aspect de l’historique de votre projet. Voyez les deux sur le même exemple avec de vraies sorties de log, apprenez la règle qui évite les catastrophes et copiez un flux de travail d’équipe sûr.

7 min de lecture
Git merge vs rebase : différences, exemples et quand utiliser chacun
À retenir
  • Merge réunit deux branches avec un nouveau commit de fusion et conserve l’historique tel qu’il s’est produit.
  • Rebase rejoue vos commits au-dessus d’une autre branche, ce qui donne une ligne droite mais de nouveaux hash.
  • Ne faites jamais de rebase sur des commits que d’autres ont déjà récupérés.
  • Faites un rebase de votre propre branche de fonctionnalité avant d’ouvrir une pull request, puis un merge pour l’intégrer à la branche principale.

Votre branche de fonctionnalité est en retard sur main et vous avez besoin du nouveau travail. Git merge vs rebase est le choix entre deux façons de l’obtenir, et les deux sont correctes. Elles diffèrent par l’aspect de l’historique ensuite.

Nous avons créé un petit dépôt, exécuté les deux commandes et collé les vraies sorties ci-dessous, pour que vous compariez le résultat au lieu de l’imaginer. Débutant avec Git ? Commencez par notre tutoriel Git pour débutants (en anglais).

Ce que font git merge et git rebase

git merge prend les sommets de deux branches et les combine. Si les deux ont de nouveaux commits, Git crée un commit de fusion à deux parents. Rien de ce qui existe déjà n’est modifié.

git rebase prend les commits propres à votre branche, les met de côté, déplace votre branche au sommet de l’autre puis les rejoue un par un. Les commits rejoués sont de nouveaux commits avec de nouveaux hash, même si leurs changements sont identiques.

Git merge en pratique

Notre point de départ : le commit A sur main, deux commits (F1, F2) sur feature, et un commit de plus (M1) ajouté ensuite à main. Nous fusionnons maintenant main dans feature.

git switch feature
git merge main
git log --oneline --graph

*   f507aab Merge main into feature
|\
| * 8842fb5 M1
* | 082cc6a F2
* | 5a71e3c F1
|/
* 8766865 A

Le graphe montre la vraie histoire : deux lignes de travail réunies. Les commits d’origine F1 et F2 gardent leurs hash. Le coût est un commit de fusion supplémentaire et, sur un projet actif, le graphe devient une toile d’araignée.

Git rebase en pratique

Même point de départ, mais cette fois nous faisons un rebase de feature sur main.

git switch feature
git rebase main
git log --oneline --graph

* 1ff474b F2
* bf9149e F1
* 8842fb5 M1
* 8766865 A

L’historique forme une ligne droite, comme si vous aviez commencé après M1. Regardez les hash : F1 était 5a71e3c et devient bf9149e, et F2 passe de 082cc6a à 1ff474b. Git les a réécrits, et c’est pourquoi le rebase demande de la prudence.

Merge vs rebase côte à côte

AspectMergeRebase
Forme de l’historiqueGraphe ramifié avec commits de fusionUne ligne droite
Commits existantsInchangésRéécrits avec de nouveaux hash
ConflitsRésolus une fois, dans le commit de fusionÀ corriger éventuellement pour chaque commit rejoué
Sûr sur les branches partagéesOuiNon
Idéal pourIntégrer un travail terminé dans mainMettre à jour votre propre branche avant la revue

Astuce : si vous hésitez, demandez qui d’autre possède votre branche. Si personne, le rebase est sûr. Si un collègue l’a récupérée, faites un merge.

La règle d’or du rebase

Ne faites pas de rebase sur des commits qui existent hors de votre dépôt. Après un rebase, votre branche ne correspond plus à la copie du serveur, donc l’envoi exige un push forcé. Si un collègue a construit du travail sur les anciens commits, son historique diverge maintenant du vôtre, et le démêler est pénible.

Faire un rebase de votre branche de fonctionnalité privée est correct. Le faire sur main ou sur toute branche utilisée par d’autres, non.

Un flux de travail d’équipe sûr

Cette routine garde un historique propre sans surprendre personne. C’est aussi ce que la plupart des équipes utilisent avant leur pipeline CI, comme celui de notre guide GitHub Actions CI/CD (en anglais).

git switch feature
git fetch origin
git rebase origin/main        # or: git pull --rebase
# fix conflicts, then: git add <file> && git rebase --continue
git push --force-with-lease   # only on your own branch

--force-with-lease refuse d’écraser la branche du serveur si quelqu’un y a poussé depuis votre dernier fetch, ce qu’un simple --force détruirait en silence. Quand la pull request est approuvée, fusionnez-la dans main.

Comment annuler un mauvais rebase

Un rebase paraît destructeur, mais les anciens commits restent un temps dans le reflog de Git, vous pouvez donc revenir en arrière.

git reflog                    # find the commit before the rebase
git reset --hard HEAD@{5}     # example position, check reflog first

Créez une branche de sauvegarde avec git branch backup avant tout rebase risqué et la récupération tient en une commande. Vous lancez une base de données ou des outils dans des conteneurs ? Voir notre tutoriel Docker pour débutants (en anglais).

Pour conclure

Merge garde la vérité, rebase la garde propre. Utilisez rebase pour rafraîchir votre propre branche, merge pour la livrer, et ne réécrivez jamais un historique dont d’autres dépendent.

Questions fréquentes

Quelle est la différence entre git merge et git rebase ?

Merge combine deux branches avec un commit de fusion et conserve tous les commits existants. Rebase déplace vos commits au-dessus d’une autre branche et les réécrit, ce qui produit un historique linéaire.

Dois-je utiliser merge ou rebase ?

Faites un rebase de votre propre branche de fonctionnalité pour la tenir à jour, et un merge pour la livrer dans une branche partagée comme main. Utilisez merge dès que d’autres partagent la branche.

Git rebase est-il dangereux ?

Il est sûr sur les branches privées et risqué sur les branches partagées, car il réécrit les hash des commits. Utilisez une branche de sauvegarde et le reflog pour récupérer en cas de problème.

Que fait force-with-lease ?

Il force le push seulement si la branche distante est toujours là où vous l’avez vue pour la dernière fois, pour ne pas écraser par accident de nouveaux commits d’un collègue.

Le rebase supprime-t-il mes commits ?

Non. Il crée de nouveaux commits avec les mêmes changements, et les anciens restent dans le reflog jusqu’à ce que Git les nettoie.

Pour aller plus loin (articles en anglais)

Travaillez avec Stack Quora

Besoin d’aide pour les tests, WordPress ou le SEO ?

Nous aidons les équipes à livrer de meilleurs logiciels et à développer leurs sites. Dites-nous sur quoi vous travaillez et nous proposerons la prochaine étape.

Continuez à lire

Plus de guides sur tests, IA et développement moderne

Vous avez apprécié cet article ? Choisissez un sujet et accédez directement à nos nouveaux didacticiels.

Intelligence artificielle

Les hallucinations de l'IA expliquées : pourquoi les modèles de langage inventent les choses et comment les réduire

Les hallucinations de l'IA ont expliqué : ce qu'elles sont, pourquoi les modèles de langage les produisent, les types courants, comment les réduire …

Lire l'article →
DevOps

Variables d'environnement expliquées : fichiers .env, secrets et configuration correctement effectués

Variables d'environnement expliquées avec des exemples Python que nous avons exécutés : lecture et définition, pourquoi chaque valeur est une chaîne…

Lire l'article →
Développement logiciel

Limitation du débit de l'API expliquée : algorithmes, en-têtes et gestion des erreurs 429

Limitation du débit de l'API expliquée avec une simulation que nous avons exécutée : compartiment de jetons, fenêtre fixe, fenêtre glissante, 429 ré…

Lire l'article →
Automatisation des tests

Se moquer en Python : unittest.mock, patch et les erreurs qui font mentir les tests

Moquerie en Python avec unittest.mock, testée : Mock et return_value, side_effect, correctifs où un nom est utilisé, spec et autospec, dates moqueus…

Lire l'article →
Tests logiciels

Couverture du code expliquée : couverture des lignes par rapport aux branches et ce que signifie réellement 100 %

Couverture du code expliquée avec une véritable exécution de cover.py : couverture des lignes, des branches et des conditions, lecture d'un rapport,…

Lire l'article →
Bases de données et SQL

DELETE vs TRUNCATE vs DROP dans SQL : différences, restauration et quand les utiliser

DELETE vs TRUNCATE vs DROP expliqué avec SQL testé : ce que chacun supprime, restauration, déclencheurs, réinitialisation d'identité, vitesse et en …

Lire l'article →
Bases de données et SQL

Vues SQL expliquées : créez, utilisez et évitez les pièges, avec des exemples

Vues SQL expliquées avec les requêtes que nous avons exécutées : création d'une vue, résultats en direct, masquage des colonnes, performances, vues …

Lire l'article →
Développement logiciel

Interface TypeScript vs Type : différences réelles, testées avec le compilateur

Interface TypeScript vs type, vérifiée avec le vrai compilateur : ce que les deux peuvent faire, ce qu'un seul peut faire, la fusion des déclaration…

Lire l'article →
Développement logiciel

Python *args et **kwargs expliqués : fonctions flexibles avec des exemples clairs

Python *args et **kwargs expliqués avec le code que nous avons exécuté : emballage et déballage, ordre des paramètres, arguments de mot-clé uniqueme…

Lire l'article →
Développement logiciel

Fonctions Python Lambda : syntaxe, utilisations réelles et quand ne pas les utiliser

Fonctions Python lambda expliquées avec le code que nous avons exécuté : syntaxe, tri avec clé, carte et filtre, fermetures, piège de liaison tardiv…

Lire l'article →
Intelligence artificielle

Que sont les agents IA ? Comment ils fonctionnent, avec une simple boucle d'agent que vous pouvez exécuter

Que sont les agents IA ? Un guide simple sur la boucle d'agent, les outils, la mémoire et les garde-fous, avec une petite boucle Python que nous avo…

Lire l'article →
DevOps

Surveillance vs observabilité : la vraie différence, avec les journaux, les métriques et les traces

Surveillance et observabilité expliquées : échecs connus et inconnus, journaux, métriques et traces, présentation pas à pas des incidents de paiemen…

Lire l'article →
DevOps

Volumes Docker vs montages Bind : conserver les données du conteneur de la bonne manière

Volumes Docker et montages de liaison expliqués : pourquoi les données du conteneur disparaissent, volumes nommés, montages de liaison, tmpfs, exemp…

Lire l'article →
Automatisation des tests

TDD vs BDD : principales différences, une fonctionnalité conçue dans les deux sens et quand les utiliser

TDD vs BDD expliqué avec une fonctionnalité de remise construite dans les deux sens : refactor rouge-vert avec le code que nous avons exécuté, scéna…

Lire l'article →
Développement logiciel

Git merge vs rebase : différences, exemples et quand utiliser chacun

Git merge vs rebase expliqué avec de vraies sorties de log, un tableau comparatif, la règle d'or du rebase et un flux de travail sûr pour les équipes.

Lire l'article →
Développement logiciel

List comprehension Python : syntaxe, exemples et cas à éviter

La list comprehension Python expliquée : syntaxe, filtres, if-else, boucles imbriquées, temps mesurés et cas où une boucle for classique est préféra…

Lire l'article →
Bases de données et SQL

Jointures SQL expliquées avec exemples (Inner, Left, Right, Full)

Comprenez les jointures SQL pas à pas avec des tables et requêtes d'exemple : INNER, LEFT, RIGHT, FULL, CROSS et SELF, plus erreurs courantes et con…

Lire l'article →