section manipuler les branches

master
Yves Dubromelle 5 years ago
parent d24ba94fdb
commit e8378bce01

@ -1,6 +1,191 @@
== Travailler avec les branches == Travailler avec les branches
=== Créer une branche === !
[.step] On veut relire notre rapport, création d'une branche `relecture` :
* On veut relire no
[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* !

Loading…
Cancel
Save