Aller au contenu

Branches : Travailler en Parallèle

Git offre la possibilité de travailler simultanément sur différentes fonctionnalités grâce aux branches. Chaque branche est une version distincte du code, créée à partir d'un point précis de l'historique du projet. Cette approche permet de développer de nouvelles fonctionnalités ou de corriger des bugs sans affecter le code principal.

Pour gérer ces branches, Git utilise des pointeurs. Le pointeur HEAD indique la branche active sur laquelle vous travaillez, tandis que chaque branche possède son propre pointeur qui suit l'évolution de ses commits.

1. Créer une nouvelle branche

La branche principale (main ou master) contient généralement le code de production. Pour développer de nouvelles fonctionnalités, il est recommandé de créer une branche dédiée à partir de la branche principale. Une fois le développement terminé, cette branche peut être fusionnée avec la branche principale.

  1. Créez une nouvelle branche dev à partir de la branche principale main :

    git branch dev
    git checkout dev
    
    Switched to branch 'dev'
    

    La commande checkout

    La commande checkout permet de se déplacer entre les branches. Dans cet exemple, elle permet de se déplacer sur la nouvelle branche dev. Elle permet aussi de créer une nouvelle branche si elle n'existe pas déjà et de s'y déplacer en une seule commande avec l'option -b :

    git checkout -b dev
    
  2. Vérifiez que vous êtes sur la nouvelle branche :

    git branch
    
    * dev
      main
    

2. Fusionner des branches

Une fois que vous avez terminé de travailler sur une branche, vous pouvez fusionner son contenu avec une autre branche. Par exemple, pour fusionner la branche dev avec la branche principale main, vous pouvez suivre ces étapes :

  1. Ajoutez une modification à la branche dev :

    Dans votre projet, créez le fichier MainActivity.java sous le répertoire src. Ajoutez le code nécessaire à ce fichier, puis enregistrez les modifications dans votre dépôt local.

    1
    2
    3
    4
    mkdir src
    echo "public class MainActivity{ }" > src/MainActivity.java
    git add src
    git commit -m "Ajout de MainActivity"
    
    1
    2
    3
    [dev 7adc5d1] Ajout de MainActivity
     1 file changed, 1 insertion(+)
     create mode 100644 src/MainActivity.java
    
    Facultatif

    Vous pouvez pousser la branche dev sur GitHub pour sauvegarder votre travail :

    git push -u origin dev
    
    Enumerating objects: 5, done.
    Counting objects: 100% (5/5), done.
    Delta compression using up to 4 threads
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (4/4), 1.00 KiB | 1.00 MiB/s, done.
    Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
    remote: 
    remote: Create a pull request for 'dev' on GitHub by visiting:
    remote:      https://github.com/khammami/mon-premier-projet/pull/new/dev
    remote: 
    To github.com:khammami/mon-premier-projet.git
    * [new branch]      dev -> dev
    branch 'dev' set up to track 'origin/dev'.
    
    Quelle est la structure de votre projet à cet instant ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    mon-premier-projet/
    ├── .git
       ├── ...
       ├── ...
       ...
    ├── README.md
    └── src
        └── MainActivity.java
    
  2. Consultez l'historique des commits pour vérifier que la branche dev contient bien la modification :

    git log --oneline
    
    1
    2
    3
    0344f53 (HEAD -> dev, origin/dev) Ajout de MainActivity
    7adc5d1 (origin/main, origin/HEAD, main) Update README.md
    f04dbf0 Description claire de vos modifications
    

    Les options de la commande log

    • --oneline affiche chaque commit sur une seule ligne.
  3. Pour fusionner la branche dev avec la branche principale main, vous devez d'abord vous déplacer sur la branche main :

    git checkout main
    
    Switched to branch 'main'
    Your branch is up to date with 'origin/main'.
    
  4. Ensuite, fusionnez la branche dev avec la branche main :

    git merge dev
    
    1
    2
    3
    4
    5
    Updating 7adc5d1..0344f53
    Fast-forward
     src/MainActivity.java | 1 +
     1 file changed, 1 insertion(+)
     create mode 100644 src/MainActivity.java
    

    La commande merge

    Cette commande fusionne le contenu de la branche spécifiée (dev) avec la branche active (main).Voir Aide-Mémoire Git pour plus d'informations sur la fusion.

  5. Enfin, vérifiez que la fusion a été effectuée avec succès :

    git log --graph --all
    
    * commit 0344f53... (HEAD -> main, origin/dev, dev)
    | Author: Khalil Hammami <adr@mail.domain>
    | Date:   Tue Feb 11 10:52:00 2025 +0100
    | 
    |     Ajout de MainActivity
    | 
    * commit 7adc5d1... (origin/main, origin/HEAD)
    | Author: Khalil Hammami <adr@mail.domain>
    | Date:   Tue Feb 11 10:40:21 2025 +0100
    | 
    |     Update README.md
    | 
    * commit f04dbf0...
        Author: Khalil Hammami <adr@mail.domain>
        Date:   Fri Feb 7 12:11:00 2025 +0100
    
            Description claire de vos modifications
    

    Les options de la commande log

    • --graph affiche le graphe des branches.
    • --all affiche tous les commits, même ceux qui ne sont pas sur la branche active.

    Les modifications de la branche dev ont été fusionnées avec succès dans la branche principale main.

Conflits de fusion

Si des conflits surviennent lors de la fusion des branches, Git vous informera des fichiers concernés. Vous devrez alors résoudre ces conflits manuellement avant de finaliser la fusion.

Exemple de conflit

Si vous modifiez le fichier README.md à la fois sur la branche dev et sur la branche main, Git ne pourra pas fusionner automatiquement ces modifications. Vous devrez résoudre le conflit manuellement en choisissant les parties à conserver.

Dans ce cas, Git ajoutera des marqueurs de conflit (<<<<<<<, =======, >>>>>>>) pour vous aider à identifier les parties conflictuelles.

  • <<<<<<< représente le début du conflit
  • ======= sépare les deux versions en conflit
  • >>>>>>> marque la fin du conflit.

3. Supprimer une branche

Une fois que vous avez terminé de travailler sur une branche et que vous avez fusionné son contenu avec une autre branche, vous pouvez supprimer la branche inutile. Par exemple, pour supprimer la branche dev après l'avoir fusionnée avec la branche main, vous pouvez suivre ces étapes :

  1. Supprimez la branche dev :

    git branch -d dev
    
    Deleted branch dev (was 0344f53).
    

    La commande branch -d

    Cette commande supprime la branche spécifiée (dev) après avoir vérifié que son contenu a été fusionné avec la branche active. Si vous souhaitez supprimer une branche sans vérification, utilisez l'option -D :

    git branch -D dev
    
  2. Vérifiez que la branche a bien été supprimée :

    git branch
    
    * main
    

    La branche dev a été supprimée et vous êtes de retour sur la branche principale main.