Merge vs Rebase

Illustration

Soit le petit scénario suivant avec 5 commits pour voir concrètement la différence entre Merge et Rebase

Merge

echo 1 > Readme.md
git add Readme.md
git commit -m "un"
echo 2 > Readme.md
git commit -am "deux"

git checkout -b feature
echo 3 > feature.md
git add feature.md
git commit -m "trois"

git checkout master
echo 4 > Readme.md
git commit -am "quatre"

git merge feature --no-edit

echo 5 > Readme.md
git commit -am "cinq"

git log --graph --pretty='format:%h %an (%ar) %s' --abbrev-commit
* 8161013 Gerard (il y a 2 jours) cinq
*   a6deee3 Gerard (il y a 2 jours) Merge branch 'feature'
|\
| * 6c0bcf0 Gerard (il y a 2 jours) trois
* | 881c431 Gerard (il y a 2 jours) quatre
|/
* 88d5081 Gerard (il y a 2 jours) deux
* d761e62 Gerard (il y a 2 jours) un

Rebase

echo 1 > Readme.md
git add Readme.md
git commit -m "un"
echo 2 > Readme.md
git commit -am "deux"

git checkout -b feature
echo 3 > feature.md
git add feature.md
git commit -m "trois"

git checkout master
echo 4 > Readme.md
git commit -am "quatre"

git rebase feature
git log --graph --pretty=oneline --abbrev-commit

echo 5 > Readme.md
git commit -am "cinq"

git log --graph --pretty='format:%h %an (%ar) %s' --abbrev-commit
* 824e964 cinq
* 5164ca2 quatre
* 4905a5f trois
* f0b3d04 deux
* 2d84cee un

merge vs rebase en français

Utilisation de Merge

L’utilisation la plus courante est :

git checkout master
git merge feature

Si tout se passe sans encombre, parfait ! Sinon on est dans les ennuis :

Auto-merging Document
CONFLICT (content): Merge conflict in mon-prog.py
Automatic merge failed; fix conflicts and then commit the result.

On peut alors editer le fichier et régler le conflit à la main ou avec un outil comme kdiff3 ou vscode.

Sinon, si on sait que la version correcte est dans master :

git checkout --ours mon-prog.py

Si au contraire, on veut garder la version de la branche feature :

git checkout --theirs mon-prog.py

puis dans tous les cas :

git add mon-prog.py
git merge --continue

Le conflit est résolu !

Utilisation de Rebase

Le merge est souvent le plus utilisé (Merge request, etc.) mais il y a quelques utilisations importantes du rebase dont les 2 suivantes :

pour se mettre à jour sur un projet sur lequel on collabore

Si Bob a réalisé une feature dans une branche new_feature dans un projet auquel il collabore et que le projet évolue sensiblement pendant la réalisation de cette feature, Bob va devoir se remettre à jour du projet pour cela il fera usage du rebase comme ceci par exemple :

git checkout master
git pull depot-reference master
git checkout new_feature
git rebase master

pour revisiter un historique défaillant

Les historiques Git sont rarement parfaits du premier coup alors il y a parfois nécessité de revisiter le passé et de faire un nettoyage. La machine à remonter le temps en Git s’appelle le rebase interactif On choisit le commit à partir duquel on veut opérer des changements. On note l’id du commit précédent et on demande à notre machine à remonter le temps de nous conduire à ce commit :

git rebase -i d5ea32

Un écran s’ouvre alors vous permettant d’éditer, supprimer, déplacer ou rejouer tel quel un commit. Si on demande à éditer le commit, il faudra généralement le défaire git reset HEAD^, procéder aux modifications puis relancer le processus avec un git rebase --continue`

Voir la doc pour plus de détails sur rebase.