Versioning avec Git & GitHub · Étape 12

Fusionne en fast-forward ou avec un merge commit

Compare deux formes d’intégration, inspecte le graphe obtenu et choisis explicitement la forme d’historique attendue.

Durée indicative · ~1 h 30Niveau intermédiairePrérequis conseillé · Leçon 11 — création et parcours des branchesPratique · TP
L’idée reçue

« git merge crée toujours un commit de merge. »

Si la branche courante n’a pas divergé, Git peut simplement avancer sa référence. Un merge commit apparaît lorsque deux lignes d’histoire doivent être réunies ou lorsque –no-ff l’impose.

01Observe le scénario fast-forward

cd /tmp/soria-git-branches-$USER/fast-forward
git log --oneline --decorate --graph --all
git merge-base main feature/healthcheck
git rev-list --count main..feature/healthcheck

main est encore l’ancêtre direct de la branche fonctionnalité.

02Exige le fast-forward

git switch main
git merge --ff-only feature/healthcheck
git rev-parse main
git rev-parse feature/healthcheck
git show -s --format='%H%nparents=%P%n%s' HEAD

Les deux références pointent vers le même commit. HEAD possède un seul parent : aucun merge commit n’a été créé.

03Observe un historique divergent

cd ../merge-commit
git log --oneline --decorate --graph --all
git log --left-right --oneline main...feature/backup

La branche feature contient le runbook tandis que main contient une modification d’exploitation. Aucun côté n’est l’ancêtre direct de l’autre.

04Crée un merge commit explicite

git switch main
git merge --no-ff feature/backup -m "merge: integrate backup runbook"
git show -s --format='%H%nparents=%P%n%s' HEAD
git log --oneline --decorate --graph --all

Le commit final possède deux parents : l’ancien HEAD de main et le dernier commit de la branche intégrée.

05Vérifie le contenu, pas seulement le graphe

test -f docs/backup.md
test -f operations.conf
git diff HEAD^1 HEAD --stat
git diff HEAD^2 HEAD --stat
git status --porcelain

06Teste les politiques

git merge --ff-only feature/backup
# échoue si la fusion nécessite un merge commit

git merge --no-ff feature/backup
# conserve une frontière de branche même si un fast-forward serait possible

Une équipe peut choisir une politique uniforme. L’important est que le graphe corresponde au besoin de traçabilité, et non à une option utilisée par habitude.

07Évite de confondre contenu et forme

Deux historiques peuvent produire le même état final des fichiers tout en conservant une structure différente. La recette doit donc vérifier à la fois contenu, tests et forme du graphe attendue.

Challenge autonome

Produis deux intégrations comparables

Réalise un fast-forward dans un dépôt et un merge commit dans un autre. Fournis le graphe, les parents du commit final et les fichiers intégrés.

Ce que tu retiens

Fast-forward avance une référence. Un merge commit relie deux parents. Le choix doit être explicite, vérifié et cohérent avec la stratégie d’équipe.

Ta progression

Chargement de l’état… Se connecter pour synchroniser.