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 branchesgit branch new-branch: Créer une nouvelle branchegit 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 branchegit checkout file.txt: Restaurer les fichiers dans la zone de travailgit 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éegit 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 conflitsgit mergetool --tool=<tool-name>: Spécifier l'outil de fusion |
git log |
Afficher l'historique des commits. | git log: Afficher l'historique des commitsgit 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 actuellesgit stash pop: Restaurer les modifications enregistrées le plus récemmentgit 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 tagsgit tag v1.0: Créer un nouveau taggit 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éegit worktree remove <path>: Supprimer le répertoire de travail |