Git Merge – option no-ff

Git Merge No Ff Option



La capacité de fusion facile de git est l'un de ses points forts. Lors d'une fusion, git utilise une fusion rapide lorsqu'il remarque que le HEAD de la branche actuelle est un ancêtre du commit que vous essayez de fusionner. Dans une fusion rapide, il n'y a pas de nouveau commit. Git déplace simplement le pointeur. Si ce comportement n'est pas souhaitable, vous pouvez utiliser l'indicateur no-ff pour créer un nouveau commit pour la fusion.

A quoi ressemble la fusion avec et sans avance rapide

Après une avance rapide, votre historique git ressemblera à ceci :







C0 —> C1 —> C2—> C3



Pour le même nombre de commits, voici un historique de fusion sans avance rapide :







Dans le premier cas, rien n'indique qu'il y ait eu une ramification. Dans le second cas, l'historique affiche un commit C4 pour indiquer où la fusion a eu lieu.

Parcourir un exemple

Vous allez créer un référentiel git, créer une branche, puis essayer les fusions avec et sans avance rapide.



Section 1 : Configuration

Tout d'abord, vous pouvez créer le référentiel git avec les étapes suivantes :

$ mkdir mon_projet
$ cd mon_projet
$ git init
$ toucher un.txt
$ git ajouter -A
$ git commit -m 'C0: Ajout d'un.txt'

Créons maintenant une branche appelée features et validons quelques modifications :

$ git branch fonctionnalités
$ git checkout fonctionnalités
$ touch b.txt
$ git ajouter -A
$ git commit -m 'C1: Ajout de b.txt'
$ touch c.txt
$ git ajouter -A
$ git commit -m 'C2 : Ajout de c.txt'
$ touch d.txt
$ git ajouter -A
$ git commit -m 'C3: Ajout d.txt'

Section 2 : Fusionner avec l'avance rapide

Revenons à la branche master et fusionnons la branche de fonctionnalités dedans :

$git caisseMaître
$git fusionnercaractéristiques

Sortir:

Mise à jour 08076fb..9ee88eb
Avance rapide
b.txt | 0
c.txt | 0
d.txt | 0
3 fichiers modifiés, 0 insertions(+), 0 suppressions(-)
créer le mode 100644 b.txt
créer le mode 100644 c.txt
créer le mode 100644 d.txt

Si vous consultez l'historique, vous verrez :

$ git log --oneline
9ee88eb C3 : Ajout d.txt
c72b92c C2 : Ajout de c.txt
2e4039e C1 : Ajout de b.txt
08076fb C0 : Ajout d'un fichier.txt

Ainsi, tous les commits de la branche features se trouvent maintenant dans la branche master. Si vous continuez à apporter des modifications à master, il n'y a aucun moyen de savoir quand la branche de fonctionnalités y a été fusionnée.

Section 3 : Sans avance rapide

Répétez la section 1 pour un nouveau dossier.

Ensuite, essayez une fusion sans avance rapide :

$git caisseMaître
$git fusionner --no-ffcaractéristique

Il ouvrira ce qui suit dans l'éditeur de texte par défaut de votre git :

Fusionner la branche'caractéristiques'
# Veuillez saisir un message de validation pour expliquer pourquoi cette fusion est nécessaire,
# surtout s'il fusionne un amont mis à jour dans une branche thématique.
#
# Les lignes commençant par '#' seront ignorées et un message vide sera annulé
# le commit.

Modifiez les commentaires. Dans ce cas, vous pouvez simplement ajouter C4: avant Fusionner les « caractéristiques » de la branche. La sortie devrait ressembler à ceci :

Fusion faite par la stratégie 'récursive'.
b.txt | 0
c.txt | 0
d.txt | 0
3 fichiers modifiés, 0 insertions(+), 0 suppressions(-)
créer le mode 100644 b.txt
créer le mode 100644 c.txt
créer le mode 100644 d.txt

Maintenant, si vous vérifiez l'historique, il devrait ressembler à ce qui suit :

$ git log --oneline
e071527 C4 : Fusionner les « fonctionnalités » de la branche
bb79c25 C3 : Ajout de d.txt
692bd8c C2 : Ajout de c.txt
a0df62a C1 : Ajout de b.txt
7575971 C0 : Ajout d'un fichier.txt

Vous pouvez voir que même si vous avez exactement les mêmes modifications, cette version de fusion a le commit C4 supplémentaire qui signifie la fusion de la branche de fonctionnalités dans le maître.

Conclusion

L'indicateur git merge no-ff permet de créer un historique plus lisible. Il vous permet de mettre des balises qui montrent clairement où les fusions ont eu lieu. Cela peut vous faire gagner du temps et des efforts lors du débogage.

Une étude plus approfondie:

Les références: