doc-locale/fr-fr/user/project/merge_requests/methods/_index.md
{{< details >}}
{{< /details >}}
La méthode de fusion que vous sélectionnez pour votre projet détermine comment les modifications de vos merge requests sont fusionnées dans une branche existante.
Les exemples de cette page supposent une branche main avec les commits A, C et E, et une branche feature avec les commits B et D :
%%{init: { "fontFamily": "GitLab Sans" }}%%
gitGraph
accTitle: Diagram of a merge
accDescr: A Git graph of five commits on two branches, which will be expanded on in other graphs in this page.
commit id: "A"
branch feature
commit id: "B"
commit id: "D"
checkout main
commit id: "C"
commit id: "E"
Par défaut, GitLab crée un commit de fusion lorsqu'une branche est fusionnée dans main. Un commit de fusion distinct est toujours créé, que les commits soient ou non squashés lors de la fusion. Cette stratégie peut entraîner l'ajout à la fois d'un commit squash et d'un commit de fusion à votre branche main.
Ces diagrammes montrent comment la branche feature fusionne dans main si vous utilisez la stratégie Validation de fusion. Ils sont équivalents à la commande git merge --no-ff <feature>, et à la sélection de Merge commit comme Méthode de fusion dans l'interface utilisateur GitLab :
Après la fusion d'une branche feature avec la méthode Validation de fusion, votre branche main ressemble à ceci :
%%{init: { 'gitGraph': {'logLevel': 'debug', 'showBranches': true, 'showCommitLabel':true,'mainBranchName': 'main', 'fontFamily': 'GitLab Sans'}} }%%
gitGraph
accTitle: Diagram of a merge commit
accDescr: A Git graph showing how merge commits are created in GitLab when a feature branch is merged.
commit id: "A"
branch feature
commit id: "B"
commit id: "D"
checkout main
commit id: "C"
commit id: "E"
merge feature
En comparaison, un squash merge construit un commit squash, une copie virtuelle de tous les commits de la branche feature. Les commits d'origine (B et D) restent inchangés sur la branche feature, puis un commit de fusion est créé sur la branche main pour fusionner la branche squashée :
%%{init: { 'gitGraph': {'showBranches': true, 'showCommitLabel':true,'mainBranchName': 'main', 'fontFamily': 'GitLab Sans'}} }%%
gitGraph
accTitle: Diagram of a squash merge
accDescr: A Git graph showing repository and branch structure after a squash commit is added to the main branch.
commit id:"A"
branch feature
checkout main
commit id:"C"
checkout feature
commit id:"B"
commit id:"D"
checkout main
commit id:"E"
branch "B+D"
commit id: "B+D"
checkout main
merge "B+D"
Le graphe de squash merge est équivalent à ces paramètres dans l'interface utilisateur GitLab :
Le graphe de squash merge est également équivalent à ces commandes :
git checkout `git merge-base feature main`
git merge --squash feature
git commit --no-edit
SOURCE_SHA=`git rev-parse HEAD`
git checkout main
git merge --no-ff $SOURCE_SHA
Si vous continuez à travailler sur une branche source à long terme après un squash merge, les merge requests suivantes peuvent afficher des commits déjà fusionnés et un avertissement indiquant que la branche source est en retard par rapport à la branche cible. Pour plus d'informations, voir le comportement des branches à long terme.
Un commit de fusion est créé pour chaque fusion, mais la branche n'est fusionnée que si une fusion en avance rapide est possible. Cela garantit que si la compilation de la merge request a réussi, la compilation de la branche cible réussit également après la fusion. Exemple de graphe de commits généré à l'aide de cette méthode de fusion :
%%{init: { "fontFamily": "GitLab Sans" }}%%
gitGraph
accTitle: Diagram of a merge commit with semi-linear history
accDescr: Shows the flow of commits when a branch merges with a merge commit and semi-linear history.
commit id: "Init"
branch mr-branch-1
commit id: "B"
commit id: "C"
checkout main
merge mr-branch-1
branch mr-branch-2
commit id: "D"
commit id: "E"
checkout main
merge mr-branch-2
commit id: "F"
branch squash-mr
commit id: "Squashed commits"
checkout main
merge squash-mr
Lorsque vous consultez la page de la merge request avec la méthode Merge commit with semi-linear history sélectionnée, vous pouvez l'accepter uniquement si une fusion en avance rapide est possible. Lorsqu'une fusion en avance rapide n'est pas possible, l'utilisateur a la possibilité de rebaser ; voir Rebasage dans les méthodes de fusion (semi-)linéaires.
Cette méthode est équivalente aux mêmes commandes Git que dans la méthode Validation de fusion. Cependant, si votre branche source est basée sur une version obsolète de la branche cible (comme main), vous devez rebaser votre branche source. Cette méthode de fusion crée un historique à l'apparence plus claire, tout en vous permettant de voir où chaque branche a commencé et a été fusionnée.
Parfois, une politique de workflow peut imposer un historique de commits propre sans commits de fusion. Dans ce cas, la fusion en avance rapide est appropriée. Avec les merge requests en avance rapide, vous pouvez conserver un historique Git linéaire sans créer de commits de fusion.
Une fusion en avance rapide n'est possible que lorsque la branche cible (telle que main) n'a pas divergé du commit de base de la branche source. Si la branche cible comporte de nouveaux commits qui ne se trouvent pas dans la branche source, vous devez d'abord rebaser la branche source.
Lorsque le paramètre de fusion en avance rapide (--ff-only) est activé, la fusion n'est autorisée que si la branche peut être avancée rapidement. Si une fusion en avance rapide n'est pas possible, vous avez la possibilité de rebaser. Pour plus d'informations, voir Rebasage dans les méthodes de fusion (semi-)linéaires.
Lorsque le squashing est désactivé, tous les commits de la branche source sont ajoutés directement à la branche cible, en conservant leur historique de commits individuel.
Avant la fusion, avec main au commit A et feature contenant les commits B, C et D :
%%{init: { "fontFamily": "GitLab Sans" }}%%
gitGraph
accTitle: Branch state before fast-forward merge
accDescr: Shows main branch at commit A, with feature branch containing commits B, C, and D.
commit id: "A (main)"
branch feature
commit id: "B"
commit id: "C"
commit id: "D"
Après la fusion en avance rapide, main pointe désormais vers le commit D, incluant tous les commits de la branche feature :
%%{init: { "fontFamily": "GitLab Sans" }}%%
gitGraph
accTitle: Result after fast-forward merge without squashing
accDescr: Shows linear history with all individual commits B, C, and D now on main branch.
commit id: "A"
commit id: "B"
commit id: "C"
commit id: "D (main)"
Cette méthode est équivalente à git merge --ff-only <source-branch>.
Lorsque le squashing est activé, tous les commits de la branche source sont d'abord combinés en un seul commit, puis avancés rapidement vers la branche cible.
Avant la fusion, avec main au commit A et feature contenant les commits B, C et D :
%%{init: { "fontFamily": "GitLab Sans" }}%%
gitGraph
accTitle: Branch state before fast-forward merge with squashing
accDescr: Shows main branch at commit A, with feature branch containing commits B, C, and D.
commit id: "A (main)"
branch feature
commit id: "B"
commit id: "C"
commit id: "D"
Après la fusion en avance rapide avec squashing, main inclut désormais un seul commit contenant toutes les modifications de B, C et D :
%%{init: { "fontFamily": "GitLab Sans" }}%%
gitGraph
accTitle: Result after fast-forward merge with squashing
accDescr: Shows linear history with commits B, C, and D combined into one squashed commit on main branch.
commit id: "A"
commit id: "B+C+D (main)"
Cette méthode est équivalente à git merge --squash <source-branch> suivi de git commit.
Dans ces méthodes de fusion, vous ne pouvez fusionner que lorsque votre branche source est à jour avec la branche cible :
Si une fusion en avance rapide n'est pas possible mais qu'un rebasage sans conflit est possible, GitLab fournit :
/rebase.Vous devez rebaser la branche source localement avant une fusion en avance rapide si les deux conditions sont vraies :
Un rebasage peut être nécessaire avant le squashing, même si le squashing peut lui-même être considéré comme équivalent au rebasage.
{{< history >}}
rebase_on_merge_automatic. Désactivés par défaut.rebase_on_merge_automatic a été supprimé dans GitLab 19.0.{{< /history >}}
Lorsque vous utilisez la méthode Validation de fusion avec un historique semi-linéaire ou Fusion en avance rapide, vous pouvez activer le rebasage automatique avant la fusion. Lorsque ce paramètre est activé, GitLab rebase automatiquement la branche source sur la branche cible au moment de la fusion lorsque la branche source est en retard par rapport à la branche cible. Vous n'avez pas besoin de rebaser manuellement ou d'attendre qu'un rebasage soit terminé avant de fusionner.
Le rebasage côté serveur supprime les signatures GPG des commits. Si votre projet nécessite des commits signés, déterminez si le rebasage automatique est approprié.
Rebasage automatique :
[!note] Étant donné que le pipeline CI/CD ne s'exécute pas à nouveau après le rebasage automatique, le résultat fusionné peut différer de la dernière exécution du pipeline. Pour valider le résultat rebasé avant la fusion, utilisez les merge trains.
Prérequis :
Pour activer le rebasage automatique :
Pour rebaser la branche d'une merge request sans déclencher de pipeline CI/CD, sélectionnez Rebaser sans pipeline dans la section des rapports de la merge request.
Cette option est :
Le rebasage sans pipeline CI/CD économise des ressources dans les projets avec un workflow semi-linéaire nécessitant des rebasages fréquents.