diff --git a/src/5-branches.adoc b/src/5-branches.adoc index 7b902da..c919e13 100644 --- a/src/5-branches.adoc +++ b/src/5-branches.adoc @@ -1,6 +1,191 @@ == Travailler avec les branches -=== Créer une branche +=== ! -[.step] -* On veut relire no \ No newline at end of file +On veut relire notre rapport, création d'une branche `relecture` : + +[source,shell] +---- +$ git checkout -b relecture +---- + +On corrige notre rapport : + +[source,shell] +---- +$ echo "Salut tout le monde !" > rapport.md +$ git add rapport.md +$ git commit -m "plus d'enthousiasme" +---- + +=== ! + +Entre temps, le travail continue sur `master` : + +[source,shell] +---- +$ echo "Projet ayant pour but de tester Git" > readme.md +$ git add readme.md +$ git commit -m "ajout readme" +---- + +L'état du projet : + +[source,shell] +---- +$ git log --graph --decorate --oneline --all +* 0428e9b (HEAD -> master) ajout readme +| * 188be3e (relecture) plus d'enthousiasme +|/ +* 8b3e823 greeetings +* b4c8004 commit initial +---- + +=== Apparté : les alias + +La commande précédente est longue à taper, mais néanmoins très utile. +On va utiliser un alias git pour se simplifier la vie : + +[source,shell] +---- +$ git config --global alias.lola "log --graph --decorate --oneline --all" +---- + +On a plus besoin que de taper `git lola` pour obtenir le même résultat ! + +== Réintégrer le travail de relecture + +Il y a deux façons principales de réintégrer le travail de notre branche `relecture` dans `master` : + +* Un merge d'une branche dans l'autre +* Un rebase d'une branche par-dessus l'autre + +=== Merge + +On repart du graphe précédent : + +[graphviz,merge-before,svg] +---- +digraph g { + rankdir = LR + node[group=master]; + 1 -> 2 -> 3 -> 4 -> 7 + node[group=branch]; + 2 -> 5 -> 6 + node[group=refs shape=note style=filled fillcolor=yellow]; + edge[arrowhead = none style=dotted] + 7 -> master + 6 -> relecture + master -> HEAD +} +---- + +Faire un merge de `relecture` dans `master`, c'est deux étapes : + +=== ! + +1 : Créer un commit ayant pour parents les derniers commits de chaque branche, donc 6 et 7 + +[graphviz,merge-1,svg] +---- +digraph g { + rankdir = LR + node[group=master]; + 1 -> 2 -> 3 -> 4 -> 7 -> 8 + 6 -> 8 + node[group=branch]; + 2 -> 5 -> 6 + node[group=refs shape=note style=filled fillcolor=yellow]; + edge[arrowhead = none style=dotted] + 7 -> master + 6 -> relecture + master -> HEAD +} +---- + +=== ! + +2 : Déplacer la référence de la branche *dans laquelle* on merge, ici `master`, sur le nouveau commit + +[graphviz,merge-2,svg] +---- +digraph g { + rankdir = LR + node[group=master]; + 1 -> 2 -> 3 -> 4 -> 7 -> 8 + 6 -> 8 + node[group=branch]; + 2 -> 5 -> 6 + node[group=refs shape=note style=filled fillcolor=yellow]; + edge[arrowhead = none style=dotted] + 8 -> master + 6 -> relecture + master -> HEAD +} +---- + +=== Rebase + +Toujours le même graphe de départ : + +[graphviz,rebase-before,svg] +---- +digraph g { + rankdir = LR + node[group=master]; + 1 -> 2 -> 3 -> 4 -> 7 + node[group=branch]; + 2 -> 5 -> 6 + node[group=refs shape=note style=filled fillcolor=yellow]; + edge[arrowhead = none style=dotted] + 7 -> master + 6 -> relecture + master -> HEAD +} +---- + +Faire un rebase de `relecture` par-dessus `master`, c'est deux étapes : + +=== ! + +1 : Trouver le commit à partir duquel les branches ont divergé, ici 5 + +[graphviz,rebase-1,svg] +---- +digraph g { + rankdir = LR + node[group=master]; + 1 -> 2 -> 3 -> 4 -> 7 + node[group=branch]; + 5 [style=filled] + 2 -> 5 -> 6 + node[group=refs shape=note style=filled fillcolor=yellow]; + edge[arrowhead = none style=dotted] + 7 -> master + 6 -> relecture + relecture -> HEAD +} +---- + +=== ! + +2 : Rejouer les commits entre le 5 et celui pointé par `relecture`, ici 6, par-dessus de `master` + +[graphviz,rebase-2,svg] +---- +digraph g { + rankdir = LR + node[group=master]; + 1 -> 2 -> 3 -> 4 -> 7 + node[group=branch]; + 5 [style=filled] + 7 -> 5 -> 6 + node[group=refs shape=note style=filled fillcolor=yellow]; + edge[arrowhead = none style=dotted] + 7 -> master + 6 -> relecture + relecture -> HEAD +} +---- + +À noter : les commits ayant changé de parents, ils n'ont plus les mêmes hash, ce sont des commits *différents* !