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.
[jerry@CentOS src]$ git branch new_branch
[jerry@CentOS 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.
[jerry@CentOS src]$ git checkout new_branch
Switched to branch 'new_branch'
[jerry@CentOS 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.
[jerry@CentOS src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'
[jerry@CentOS 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.
[jerry@CentOS src]$ git branch
master
new_branch
* test_branch
[jerry@CentOS src]$ git checkout master
Switched to branch 'master'
[jerry@CentOS src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).
Maintenant, Git n'affichera que deux branches.
[jerry@CentOS 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.
[jerry@CentOS src]$ git branch
* master
new_branch
[jerry@CentOS src]$ git branch -m new_branch wchar_support
Maintenant, la commande git branch affichera le nouveau nom de la branche.
[jerry@CentOS 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 -
[jerry@CentOS src]$ git branch
master
* wchar_support
[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src
[jerry@CentOS 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.
[jerry@CentOS src]$ git status -s
M string_operations.c
?? string_operations
[jerry@CentOS src]$ git add string_operations.c
[jerry@CentOS 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.
[jerry@CentOS 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.
[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src
[tom@CentOS 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.
[tom@CentOS project]$ git branch
* master
[tom@CentOS project]$ pwd
/home/tom/top_repo/project
[tom@CentOS 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.
[tom@CentOS project]$ cd src/
[tom@CentOS 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 [tom@CentOS 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.
[tom@CentOS 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.