Git - Gestion des branches

L'opération de branche permet de créer une autre ligne de développement. Nous pouvons utiliser cette opération pour bifurquer le processus de développement dans deux directions différentes. Par exemple, nous avons publié un produit pour la version 6.0 et nous pourrions vouloir créer une branche afin que le développement des fonctionnalités 7.0 puisse être séparé des corrections de bogues 6.0.

Créer une branche

Tom crée une nouvelle branche à l'aide de la commande git branch <nom de la branche>. Nous pouvons créer une nouvelle branche à partir d'une branche existante. Nous pouvons utiliser un commit ou une balise spécifique comme point de départ. Si aucun ID de validation spécifique n'est fourni, la branche sera créée avec HEAD comme point de départ.

[[email protected] src]$ git branch new_branch

[[email protected] src]$ git branch
* master
new_branch

Une nouvelle branche est créée; Tom a utilisé la commande git branch pour lister les branches disponibles. Git montre un astérisque avant la branche actuellement extraite.

La représentation graphique de l'opération de création de branche est illustrée ci-dessous -

Basculer entre les branches

Jerry utilise la commande git checkout pour basculer entre les branches.

[[email protected] src]$ git checkout new_branch
Switched to branch 'new_branch'
[[email protected] src]$ git branch
master
* new_branch

Raccourci pour créer et changer de branche

Dans l'exemple ci-dessus, nous avons utilisé deux commandes pour créer et changer de branche, respectivement. Git fournit–boption avec la commande checkout; cette opération crée une nouvelle branche et bascule immédiatement vers la nouvelle branche.

[[email protected] src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'

[[email protected] src]$ git branch
master
new_branch
* test_branch

Supprimer une branche

Une branche peut être supprimée en fournissant l'option –D avec la commande git branch. Mais avant de supprimer la branche existante, passez à l'autre branche.

Jerry est actuellement sur test_branchet il veut supprimer cette branche. Il change donc de branche et supprime la branche comme indiqué ci-dessous.

[[email protected] src]$ git branch
master
new_branch
* test_branch

[[email protected] src]$ git checkout master
Switched to branch 'master'

[[email protected] src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).

Maintenant, Git n'affichera que deux branches.

[[email protected] src]$ git branch
* master
new_branch

Renommer une branche

Jerry décide d'ajouter la prise en charge des caractères larges dans son projet d'opérations de chaîne. Il a déjà créé une nouvelle branche, mais le nom de la branche n'est pas approprié. Il change donc le nom de la branche en utilisant–m option suivie de la old branch name et le new branch name.

[[email protected] src]$ git branch
* master
new_branch

[[email protected] src]$ git branch -m new_branch wchar_support

Maintenant, la commande git branch affichera le nouveau nom de la branche.

[[email protected] src]$ git branch
* master
wchar_support

Fusionner deux branches

Jerry implémente une fonction pour renvoyer la longueur de la chaîne de caractères large. Nouveau le code apparaîtra comme suit -

[[email protected] src]$ git branch
master
* wchar_support

[[email protected] src]$ pwd
/home/jerry/jerry_repo/project/src

[[email protected] src]$ git diff

La commande ci-dessus produit le résultat suivant -

t a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..8fb4b00 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,4 +1,14 @@
#include <stdio.h>
+#include <wchar.h>
+
+size_t w_strlen(const wchar_t *s)
+
{
   +
   const wchar_t *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p - s);
   +
}

Après le test, il s'engage et pousse ses modifications dans la nouvelle branche.

[[email protected] src]$ git status -s
M string_operations.c
?? string_operations

[[email protected] src]$ git add string_operations.c

[[email protected] src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
string'

[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
1 files changed, 10 insertions(+), 0 deletions(-)

Notez que Jerry pousse ces changements vers la nouvelle branche, c'est pourquoi il a utilisé le nom de la branche wchar_support au lieu de master branche.

[[email protected] src]$ git push origin wchar_support  <−−− Observer branch_name

La commande ci-dessus produira le résultat suivant.

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
wchar_support -> wchar_support

Après avoir validé les modifications, la nouvelle branche apparaîtra comme suit -

Tom est curieux de savoir ce que fait Jerry dans sa succursale privée et il vérifie le journal du wchar_support branche.

[[email protected] src]$ pwd
/home/tom/top_repo/project/src

[[email protected] src]$ git log origin/wchar_support -2

La commande ci-dessus produira le résultat suivant.

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string


commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

En visualisant les messages de validation, Tom se rend compte que Jerry a implémenté la fonction strlen pour les caractères larges et il veut la même fonctionnalité dans la branche principale. Au lieu de ré-implémenter, il décide de prendre le code de Jerry en fusionnant sa branche avec la branche master.

[[email protected] project]$ git branch
* master

[[email protected] project]$ pwd
/home/tom/top_repo/project

[[email protected] project]$ git merge origin/wchar_support
Updating 5776472..64192f9
Fast-forward
src/string_operations.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

Après l'opération de fusion, la branche principale apparaîtra comme suit -

Maintenant, la branche wchar_supporta été fusionné avec la branche principale. Nous pouvons le vérifier en visualisant le message de validation ou en visualisant les modifications effectuées dans le fichier string_operation.c.

[[email protected] project]$ cd src/

[[email protected] src]$ git log -1

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse 
      
        Date: Wed Sep 11 16:10:06 2013 +0530 Added w_strlen function to return string lenght of wchar_t string [[email protected] src]$ head -12 string_operations.c 
      

La commande ci-dessus produira le résultat suivant.

#include <stdio.h>
#include <wchar.h>
size_t w_strlen(const wchar_t *s)
{
   const wchar_t *p = s;

   while (*p)
      ++p;

   return (p - s);
}

Après les tests, il transmet ses modifications de code à la branche principale.

[[email protected] src]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
5776472..64192f9 master −> master

Rebase Branches

La commande Git rebase est une commande de fusion de branche, mais la différence est qu'elle modifie l'ordre des validations.

La commande Git merge tente de placer les commits d'autres branches au-dessus de la HEAD de la branche locale actuelle. Par exemple, votre branche locale a des commits A−> B−> C−> D et la branche merge a des commits A−> B−> X−> Y, alors git merge convertira la branche locale actuelle en quelque chose comme A−> B−> C−> D−> X−> Y

La commande Git rebase essaie de trouver l'ancêtre commun entre la branche locale actuelle et la branche de fusion. Il pousse ensuite les commits vers la branche locale en modifiant l'ordre des commits dans la branche locale actuelle. Par exemple, si votre branche locale a des commits A−> B−> C−> D et que la branche de fusion a des commits A−> B−> X−> Y, alors Git rebase convertira la branche locale actuelle en quelque chose comme A− > B−> X−> Y−> C−> D.

Lorsque plusieurs développeurs travaillent sur un même référentiel distant, vous ne pouvez pas modifier l'ordre des validations dans le référentiel distant. Dans ce cas, vous pouvez utiliser l'opération de rebase pour placer vos validations locales au-dessus des validations du référentiel distant et vous pouvez appliquer ces modifications.