Gestion des branches Git

La gestion des branches Git est l'une des fonctionnalités puissantes de Git qui permet aux développeurs de travailler en parallèle, de développer de nouvelles fonctionnalités, de corriger des problèmes ou de mener des expériences sans affecter la base de code principale.

Presque tous les systèmes de contrôle de version prennent en charge les branches sous une forme ou une autre ; une branche représente une ligne de développement indépendante.

Utiliser des branches signifie que vous pouvez vous séparer de la ligne de développement principale et continuer à travailler sans affecter la ligne principale.

Les branches Git sont des pointeurs vers des instantanés de modifications.

Certains appellent le modèle de branchement de Gitune fonctionnalité spéciale, et c'est précisément pour cela queGitse distingue de la famille des systèmes de contrôle de version.

Créer une branche

Créer une nouvelle branche et basculer dessus :

git checkout -b <branchname>

Par exemple :

git checkout -b feature-xyz

Commande de changement de branche :

git checkout (branchname)

Par exemple :

git checkout main

Lorsque vous changez de branche, Git remplace le contenu de votre répertoire de travail par l'instantané du dernier commit de cette branche, de sorte que plusieurs branches ne nécessitent pas plusieurs répertoires.

Afficher les branches

Afficher toutes les branches :

git branch

Afficher les branches distantes :

git branch -r

Afficher toutes les branches locales et distantes :

git branch -a

Fusionner une branche

Fusionner d'autres branches dans la branche actuelle :

git merge <branchname>

Par exemple, basculez sur la branche main et fusionnez la branche feature-xyz :

git checkout main
git merge feature-xyz

Résoudre les conflits de fusion

Lorsqu'un conflit se produit pendant une fusion, Git marque les fichiers en conflit, et vous devez résoudre le conflit manuellement.

Ouvrez le fichier en conflit et résolvez le conflit selon les marqueurs.

Marquez la résolution du conflit comme terminée :

git add <conflict-file>

Validez le résultat de la fusion :

git commit

Supprimer la branche

Supprimer la branche locale :

git branch -d <branchname>

Supprimer de force une branche non fusionnée :

git branch -D <branchname>

Supprimer la branche distante :

git push origin --delete <branchname>

Exemple

Avant de commencer, créons un répertoire de test :

$ mkdir gitdemo
$ cd gitdemo/
$ git init
Initialized empty Git repository...
$ touch README
$ git add README
$ git commit -m '第一次版本提交'
[master (root-commit) 3b58100] 第一次版本提交
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README

Gestion des branches Git

Lister les branches

Commandes de base pour lister les branches :

git branch

Sans arguments,git branchCela affichera les branches de votre dépôt local.

$ git branch
* master

Cet exemple signifie que nous avons une branche appeléemaster, et que cette branche est la branche actuelle.

Lorsque vous exécutezgit init, par défaut, Git créera pour vous la branchemaster.

Si nous voulons créer manuellement une branche, exécutezgit branch (branchname)C'est tout.

$ git branch testing
$ git branch
* master
  testing

Maintenant, nous pouvons voir qu'il y a une nouvelle branchetesting。

Lorsque vous créez une nouvelle branche de cette façon après le dernier commit, s'il y a des commits ultérieurs, puis que vous basculez vers la branchetesting, Git restaurera votre répertoire de travail à ce qu'il était lorsque vous avez créé la branche.

Ensuite, nous allons montrer comment changer de branche. Nous utilisons git checkout (branch) pour basculer vers la branche que nous voulons modifier.

$ ls
README
$ echo 'example.com' > test.txt
$ git add .
$ git commit -m 'add test.txt'
[master 3e92c19] add test.txt
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
$ ls
README        test.txt
$ git checkout testing
Switched to branch 'testing'
$ ls
README

Lorsque nous basculons vers la branchetesting, le nouveau fichier test.txt que nous avons ajouté a été supprimé. Revenez àmasterLorsque vous changez de branche, ils réapparaissent.

$ git checkout master
Switched to branch 'master'
$ ls
README        test.txt

Nous pouvons également utiliser la commande git checkout -b (branchname) pour créer une nouvelle branche et basculer immédiatement vers celle-ci, ce qui nous permet de travailler dans cette branche.

$ git checkout -b newtest
Switched to a new branch 'newtest'
$ git rm test.txt 
rm 'test.txt'
$ ls
README
$ touch example.php
$ git add .
$ git commit -am 'removed test.txt、add example.php'
[newtest c1501a2] removed test.txt、add example.php
 2 files changed, 1 deletion(-)
 create mode 100644 example.php
 delete mode 100644 test.txt
$ ls
README        example.php
$ git checkout master
Switched to branch 'master'
$ ls
README        test.txt

Comme vous pouvez le voir, nous avons créé une branche, supprimé le fichier test.txt sur cette branche et ajouté le fichier example.php, puis nous sommes revenus à notre branche principale. Le fichier test.txt supprimé est revenu, et le fichier example.php nouvellement ajouté n'existe pas dans la branche principale.

L'utilisation de branches pour séparer le travail nous permet de travailler dans différents environnements de développement et de faire des allers-retours.

Supprimer la branche

Commande de suppression de branche :

git branch -d (branchname)

Par exemple, si nous voulons supprimer la branche testing :

$ git branch
* master
  testing
$ git branch -d testing
Deleted branch testing (was 85fc7e7).
$ git branch
* master

Fusion de branches

Une fois qu'une branche a du contenu indépendant, vous finirez par vouloir la fusionner dans votre branche principale. Vous pouvez utiliser la commande suivante pour fusionner n'importe quelle branche dans la branche actuelle :

git merge
$ git branch
* master
  newtest
$ ls
README        test.txt
$ git merge newtest
Updating 3e92c19..c1501a2
Fast-forward
 example.php | 0
 test.txt   | 1 -
 2 files changed, 1 deletion(-)
 create mode 100644 example.php
 delete mode 100644 test.txt
$ ls
README        example.php

Dans l'exemple ci-dessus, nous avons fusionné la branche newtest dans la branche principale, et le fichier test.txt a été supprimé.

Après la fusion, vous pouvez supprimer la branche :

$ git branch -d newtest
Deleted branch newtest (was c1501a2).

Après la suppression, seule la branche master reste :

$ git branch
* master

Conflit de fusion

La fusion n'est pas une simple opération d'ajout ou de suppression de fichiers ; Git fusionne aussi les modifications.

$ git branch
* master
$ cat example.php

Remarque :Si example.php n'existe pas, vous devez d'abord créer ce fichier. La commande peut êtretouch example.php。

Tout d'abord, nous créons une branche appelée change_site, nous basculons dessus, et nous modifions le contenu de example.php comme suit :

<?php
echo 'example';
?>

Créez la branche change_site :

$ git checkout -b change_site
Switched to a new branch 'change_site'
$ vim example.php
$ head -3 example.php
<?php
echo 'example';
?>
$ git commit -am 'changed the example.php'
[change_site 7774248] changed the example.php
 1 file changed, 3 insertions(+)
 

Pour les opérations de commande vim, veuillez vous référer à :Linux vi/vim。

Commitez le contenu modifié dans la branche change_site. Maintenant, si nous revenons à la branche master, nous pouvons voir le contenu restauré tel qu'il était avant notre modification (fichier vide, aucun code). Nous modifions à nouveau le fichier example.php.

$ git checkout master
Switched to branch 'master'
$ cat example.php
$ vim example.php    # 修改内容如下
$ cat example.php
<?php
echo 1;
?>
$ git diff
diff --git a/example.php b/example.php
index e69de29..ac60739 100644
--- a/example.php
+++ b/example.php
@@ -0,0 +1,3 @@
+<?php
+echo 1;
+?>
$ git commit -am '修改代码'
[master c68142b] 修改代码
 1 file changed, 3 insertions(+)

Maintenant, ces modifications ont été enregistrées dans ma branche "master". Ensuite, nous allons fusionner la branche "change_site".

$ git merge change_site
Auto-merging example.php
CONFLICT (content): Merge conflict in example.php
Automatic merge failed; fix conflicts and then commit the result.

$ cat example.php     # 打开文件,看到冲突内容
<?php
<<<<<<< HEAD
echo 1;
=======
echo 'example';
>>>>>>> change_site
?>

Lorsque nous avons fusionné la branche précédente dans la branche master, un conflit de fusion est apparu, et nous devons maintenant le modifier manuellement.

$ vim example.php 
$ cat example.php
<?php
echo 1;
echo 'example';
?>
$ git diff
diff --cc example.php
index ac60739,b63d7d7..0000000
--- a/example.php
+++ b/example.php
@@@ -1,3 -1,3 +1,4 @@@
  <?php
 +echo 1;
+ echo 'example';
  ?>

Dans Git, nous pouvons utiliser git add pour indiquer à Git que le conflit de fichier a été résolu

$ git status -s
UU example.php
$ git add example.php
$ git status -s
M  example.php
$ git commit
[master 88afe0e] Merge branch 'change_site'

Maintenant, nous avons réussi à résoudre le conflit de fusion et validé le résultat.


Manuel des commandes

Commande Description Exemple d'utilisation
git branch Lister, créer ou supprimer des branches. Il ne change pas de branche ; il sert uniquement à gérer l'existence des branches. git branch: Lister toutes les branches
git branch new-branch: Créer une nouvelle branche
git branch -d old-branch: Supprimer une branche
git checkout Basculer vers la branche spécifiée ou restaurer des fichiers dans le répertoire de travail. Il peut également être utilisé pour extraire des commits spécifiques. git checkout branch-name: Changer de branche
git checkout file.txt: Restaurer les fichiers dans la zone de travail
git checkout <commit-hash>: Extraire un commit spécifique
git switch Spécifiquement utilisé pour changer de branche, par rapport àgit checkoutIl est plus concis et intuitif, principalement utilisé pour les opérations sur les branches. git switch branch-name: Basculer vers la branche spécifiée
git switch -c new-branch: Créer et basculer vers une nouvelle branche
git merge Fusionner les modifications de la branche spécifiée dans la branche actuelle. git merge branch-name: Fusionner les modifications de la branche spécifiée dans la branche actuelle
git mergetool Lancer l'outil de fusion pour résoudre les conflits de fusion. git mergetool: Utiliser l'outil de fusion par défaut pour résoudre les conflits
git mergetool --tool=<tool-name>: Spécifier l'outil de fusion
git log Afficher l'historique des commits. git log: Afficher l'historique des commits
git log --oneline: Afficher l'historique des commits en mode concis
git stash Enregistrer les modifications non validées dans le répertoire de travail actuel et le restaurer dans un espace de travail propre. git stash: Enregistrer les modifications actuelles
git stash pop: Restaurer les modifications enregistrées le plus récemment
git stash list: Lister toutes les modifications enregistrées
git tag Créer, lister ou supprimer des tags. Les tags servent à marquer des commits spécifiques. git tag: Lister tous les tags
git tag v1.0: Créer un nouveau tag
git tag -d v1.0: Supprimer le tag
git worktree Permet d'extraire plusieurs espaces de travail dans un même dépôt, adapté pour travailler sur plusieurs branches simultanément. git worktree add <path> branch-name: Ajouter un nouvel espace de travail au chemin spécifié et basculer vers la branche spécifiée
git worktree remove <path>: Supprimer le répertoire de travail
autres extensions