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
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.