Listing des différentes manières de comparer des branches dans Git.

TLDR;

Toute la magie réside dans l'utilisation des plages de révision et la syntaxe BRANCH_1..BRANCH_2

Connaitre les différences entre 2 branches

git diff [BRANCH_1]..[BRANCH_2]

retourne les différences de code entre 2 branches.

diff --git a/readme.txt b/readme.txt
index ac28f91..ae362e4 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1 @@
-Coucou
+Coucou2

On constate ici que dans le fichier readme.txt de a branche b, le mot Coucou a été remplacé par Coucou2.

Comparer les commits de 2 branches

Avec l'utilisation de diff, nous n'avons cependant pas la vision sur les commits qui ont créé le delta.

Pour ce type de comparaison, il est possible d'utiliser git log.

git log [BRANCH_1]..[BRANCH_2]

retourne uniquement les commits de branch_2 non présents dans branch_1

commit fc372ddecf5d98a8ba0d000a3c1ccf77a4f1237b (b)
Author: Jean-Yves Gastaud <[email protected]>
Date:   Thu Jan 10 16:53:07 2019 +0100

    third commit

Pour avoir plus de détails sur le contenu du changement, il est possible d'utiliser toutes la panoplie d'options de la commande log.

L'utilisation des options --graph et --stat est particulièrement utile dans ce cas.

$ git log --oneline --decorate --graph --stat [BRANCH_1]..[BRANCH_2]

retourne

* fc372dd (b) 3eme commit
   readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)

Admettons maintenant que branch_1 est été rebase par rapport à master mais pas la branch_2, est-ce que mon delta de commit sera toujours cohérent ?

Prenons l'exemple suivant :

master contient

* 81faeea 2019-01-18 | a commit in master (master) [Jean-Yves Gastaud]
* 3be0b31 2019-01-10 | 1er commit [Jean-Yves Gastaud]

branch_1 a été rebase avec les données de master et contient 2 commits de plus.

* 5b3a95a 2019-01-18 | a commit (BRANCH_1) [Jean-Yves Gastaud]
* 19b7763 2019-01-10 | 2nd commit [Jean-Yves Gastaud]
* 81faeea 2019-01-18 | a commit in master (master) [Jean-Yves Gastaud]
* 3be0b31 2019-01-10 | 1er commit [Jean-Yves Gastaud]

branch_2 quant à elle n'est pas rebase et par toujours du 1er commit sur master.

* fc372dd 2019-01-10 | 3eme commit (BRANCH_2) [Jean-Yves Gastaud]
* 3be0b31 2019-01-10 | 1er commit [Jean-Yves Gastaud]

Retestons notre
git log --oneline --decorate --graph --stat [BRANCH_1]..[BRANCH_2]

* fc372dd (BRANCH_2) 3eme commit
   readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)

Super, nous voyons toujours notre commit non présent dans la branch_1 !

Si besoin de savoir quelles sont les commits de la branch_1 non présents dans branch_2, il est bien entendu possible d'inverser les arguments.

Ainsi git log --oneline --decorate --graph --stat [BRANCH_2]..[BRANCH_1] nous renverra

* 5b3a95a (BRANCH_1) a commit
|  readme.txt | 3 +--
| 1 file changed, 1 insertion(+), 2 deletions(-)
* 19b7763 2nd commit
|  readme.txt | 3 ++-
| 1 file changed, 2 insertions(+), 1 deletion(-)
* 81faeea (master) a commit in master
   readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)

Enfin, si notre branch_1 a été mergée dans master, nous pouvons toujours avoir les mêmes résultats.

Un git log --oneline --decorate --graph --stat [BRANCH_2]..master renverra bien l'ensemble de l'arbre de commits absents.

*   9eb6957 (HEAD -> master) Merge branch 'a'
|\
| * 5b3a95a (a) a commit
| |  readme.txt | 3 +--
| | 1 file changed, 1 insertion(+), 2 deletions(-)
| * 19b7763 2nd commit
|/
|    readme.txt | 3 ++-
| 1 file changed, 2 insertions(+), 1 deletion(-)
* 81faeea a commit in master
   readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)