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(-)