Aller au contenu

MaĂźtriser Git đŸ§© : versioning & branches simples

Mise Ă  jour :

logo git

Git est l’outil de gestion de versions de code le plus populaire et largement utilisĂ© dans le dĂ©veloppement des infrastructures informatiques. Le but de cette documentation est de vous donner les bases pour vous dĂ©brouiller dans votre travail de tous les jours.

L’histoire de Git

Git est un systĂšme de contrĂŽle de version distribuĂ© open source. Il est disponible sur presque tous les systĂšmes d’exploitation.

En 2005, Linus Torvalds a créé git en tant que systĂšme de contrĂŽle de version distribuĂ© alors parce qu’il ne pouvait plus utiliser BitKeeper gratuitement.

Désormais, git est le systÚme le plus utilisé par les développeurs. Sa nature distribuée facilite le développement, le suivi et la bonne collaboration avec les modifications de code.

Git dans le domaine du DevOps ?

Un consultant DevOps devra développer du code et de ce fait le stocker. Il se doit donc maßtriser Git pour stocker ses codes sources :

Les Concepts Clés de Git

Dans cette section, nous allons aborder tous les concepts et mots clés qui vous aideront à progresser.

SystÚme de contrÎle de version distribué

Chaque dĂ©veloppeur possĂšde une copie complĂšte de l’historique du projet, ce qui permet de travailler localement.

DépÎts (Repositories)

Les dĂ©pĂŽts, souvent appelĂ©s “repos” en abrĂ©gĂ©, est essentiellement une base de donnĂ©es qui stocke toutes les versions de votre projet, ainsi que l’historique complet des modifications. Il existe deux types principaux de dĂ©pĂŽts Git.

DépÎt distant

Un dĂ©pĂŽt distant est une copie du projet qui est hĂ©bergĂ©e sur un serveur distant. Les dĂ©pĂŽts distants facilitent la collaboration entre plusieurs dĂ©veloppeurs. Le dĂ©pĂŽt distant peut ĂȘtre accessible en lecture et en Ă©criture par plusieurs personnes, ce qui permet de partager le code, de travailler ensemble et de synchroniser les modifications. Des services tels que GitHub, GitLab et Bitbucket offrent des options d’hĂ©bergement de dĂ©pĂŽts Git.

DépÎt local

Un dĂ©pĂŽt local est une copie de votre projet stockĂ©e sur votre propre machine. Chaque dĂ©veloppeur travaillant sur le projet aura son propre dĂ©pĂŽt local. Cela permet Ă  chacun de travailler indĂ©pendamment, d’effectuer des modifications, d’enregistrer des commits et d’explorer l’historique sans avoir besoin d’une connexion Internet.

Historique enregistré

Git enregistre l’historique complet des modifications apportĂ©es au code source, ce qui permet de suivre chaque modification, quel que soit le moment oĂč elle a Ă©tĂ© effectuĂ©e.

Collaboration

Git facilite la collaboration entre plusieurs dĂ©veloppeurs. Plusieurs personnes peuvent travailler sur le mĂȘme projet simultanĂ©ment en utilisant des branches distinctes.

Branches

Les branches est un concept central de Git. Elles permettent de travailler sur des fonctionnalitĂ©s ou des correctifs de maniĂšre isolĂ©e sans affecter la branche principale (gĂ©nĂ©ralement appelĂ©e “master” ou “main”).

Commit

Les commits sont la pierre angulaire de Git et sont utilisĂ©s pour enregistrer l’historique des modifications d’un projet. Un commit est un instantanĂ© (snapshot) de l’état d’un projet Ă  un moment donnĂ©. Plus prĂ©cisĂ©ment, un commit reprĂ©sente une sĂ©rie de modifications apportĂ©es aux fichiers d’un projet Ă  un moment prĂ©cis, accompagnĂ©e d’un message descriptif qui les explique.

Grùce aux commits, il est possible de revenir en arriÚre et de restaurer le projet à un état antérieur en sélectionnant un commit précédent. Cela permet de résoudre les problÚmes, de revenir à une version stable ou de réappliquer des modifications précédemment supprimées.

Les différentes URL git

Dans Git, il existe principalement deux types d’URLs utilisĂ©s pour accĂ©der et interagir avec des dĂ©pĂŽts distants : les URLs HTTPS et les URLs SSH. Chacun a ses propres caractĂ©ristiques et exigences en matiĂšre de configuration et d’utilisation.

URLs HTTPS

  1. Format : Les URLs HTTPS ressemblent Ă  des URLs web classiques et commencent par https://. Par exemple :

    https://github.com/username/repository.git
  2. Utilisation : Les URLs HTTPS sont utilisĂ©es pour cloner, pousser et tirer des modifications depuis des dĂ©pĂŽts distants via le protocole HTTPS. Elles sont souvent prĂ©fĂ©rĂ©es dans les configurations oĂč la simplicitĂ© est privilĂ©giĂ©e.

  3. Authentification : L’authentification avec les URLs HTTPS se fait gĂ©nĂ©ralement via un nom d’utilisateur et un mot de passe. Cependant, de nombreux services comme GitHub exigent dĂ©sormais l’utilisation de jetons d’accĂšs personnel (Personal Access Tokens) au lieu de mots de passe pour une sĂ©curitĂ© accrue.

  4. Avantages :

    • FacilitĂ© d’utilisation et configuration minimale.
    • Pas besoin de gĂ©rer des clĂ©s SSH.
    • Plus adaptĂ© aux environnements oĂč les connexions SSH sont bloquĂ©es.
  5. Inconvénients :

    • La nĂ©cessitĂ© de saisir des identifiants de maniĂšre rĂ©pĂ©tĂ©e, sauf si un gestionnaire de mots de passe ou des jetons d’accĂšs sont utilisĂ©s.
    • Moins sĂ©curisĂ© que SSH pour les opĂ©rations de transfert de donnĂ©es.

URLs SSH

  1. Format : Les URLs SSH sont formatĂ©es diffĂ©remment et commencent par ssh:// ou simplement par un identifiant d’utilisateur suivi d’un @ et de l’adresse du serveur. Par exemple :

    git@github.com:username/repository.git
  2. Utilisation : Les URLs SSH sont utilisées pour des opérations similaires aux URLs HTTPS (clone, push, pull), mais via le protocole SSH.

  3. Authentification : L’authentification SSH repose sur un Ă©change de clĂ©s. Vous devez gĂ©nĂ©rer une paire de clĂ©s SSH (publique et privĂ©e) sur votre machine et enregistrer la clĂ© publique sur le serveur Git distant (comme GitHub ou GitLab).

  4. Avantages :

    • Plus sĂ©curisĂ©, car l’authentification est basĂ©e sur des clĂ©s et non sur des mots de passe.
    • Pas besoin d’entrer des identifiants Ă  chaque opĂ©ration une fois la clĂ© SSH configurĂ©e.
    • PrĂ©fĂ©rable pour des opĂ©rations automatisĂ©es, comme les scripts ou les intĂ©grations continues.
  5. Inconvénients :

    • NĂ©cessite une configuration initiale de la clĂ© SSH.
    • Peut ĂȘtre bloquĂ© par certains pare-feux ou rĂ©seaux d’entreprise.

Installation de Git

Pour commencer Ă  utiliser Git, vous devez d’abord l’installer sur votre systĂšme. Heureusement, Git est compatible avec diffĂ©rentes plates-formes, notamment Windows, macOS et Linux. Voici comment vous pouvez l’installer :

Installation de Git sous Windows

Je vous conseille de tĂ©lĂ©charger le package d’installation pour Windows Ă  partir du site officiel de Git (<https://git-scm.com/download/win\> ↗) et de suivre les instructions d’installation.

Installation de Git sous macOS

Sur macOS, Git est habituellement prĂ©installĂ©. Vous pouvez vĂ©rifier s’il est dĂ©jĂ  installĂ© en ouvrant le Terminal puis en exĂ©cutant la commande git —version. Si ce n’est pas le cas, vous pouvez installer Git via un gestionnaire de paquets tel que Homebrew.

Installation de Git Sous Linux

Sur la plupart des distributions Linux, vous pouvez installer Git à l’aide du gestionnaire de paquets.

Par exemple, sur un poste Ubuntu :

Terminal window
sudo -i
add-apt-repository ppa:git-core/ppa
apt update
apt install git

Les principales commandes git

Configuration de Git

La configuration de git pour l’utilisateur se trouve dans le dossier ~/.gitconfig ou ~/.config/git/config. Pour Ă©viter de vĂ©roler ce fichier de config, on fait appel Ă  la commande git config. Par exemple pour dĂ©finir la branche par dĂ©faut :

Terminal window
git config --global init.defaultBranch main

Pour retrouver les valeurs des configs actuelles :

Terminal window
git config --list
file:/home/bob/.gitconfig user.name=Stéphane ROBERT
file:/home/bob/.gitconfig user.email=stephane.robert.28@gmail.com
file:/home/bob/.gitconfig core.editor=code --wait
file:/home/bob/.gitconfig init.defaultbranch=main
file:.git/config core.repositoryformatversion=0
file:.git/config core.filemode=true
file:.git/config core.bare=false
file:.git/config core.logallrefupdates=true

Plus d’infos ici ↗

PremiĂšre configuration aprĂšs installation

Une fois Git installĂ©, vous devez le configurer. Les premiers paramĂštres Ă  dĂ©finir sont votre nom d’utilisateur et votre adresse e-mail, car ces informations seront associĂ©es Ă  chaque commit que vous ferez. Vous pouvez configurer Git en utilisant les commandes suivantes dans le terminal :

Terminal window
git config --global user.name "Votre Nom"
git config --global user.email "votre@email.com"

TĂ©lĂ©chargement d’un projet git

La commande permettant de télécharger localement un projet avec la commande git clone :

Terminal window
git clone [OPTION] [dossier]

Si vous renseignez un dossier, la commande n’utilise pas le nom du projet pour le nom du dossier, mais celui indiquĂ©.

Les principales options de la commande git clone :

  • --recurse-submodules : TĂ©lĂ©charge Ă©galement tous les sous-modules. Un concept que nous verrons dans une autre documentation.

Exemple :

Terminal window
git clone https://github.com/git/git.git /tmp/git
git clone https://github.com/git/git.git /tmp/git
Clonage dans '/tmp/git'...
remote: Enumerating objects: 356178, done.
remote: Counting objects: 100% (458/458), done.
remote: Compressing objects: 100% (218/218), done.
Réception d'objets: 23% (81921/356178), 37.52 Mio | 4.29 Mio/s
...
Résolution des deltas: 100% (267808/267808), fait.

Initialisation d’un projet git

Nous verrons dans cette section comment initialiser votre premier projet Git localement. Pour cela, on fait appel Ă  la commande git init :

Terminal window
git init [OPTION] [dossier]
  • Si vous renseignez un dossier, la commande est exĂ©cutĂ©e Ă  l’intĂ©rieur de celui-ci. Si ce dossier n’existe pas, il sera créé.
  • Si vous ne renseignez pas de dossier alors la commande est exĂ©cutĂ©e dans le rĂ©pertoire actuel.

Les principales options de la commande git init :

  • --initial-branch=name :

Exemple :

Terminal window
git init --initial-branch=main /tmp/toto
DépÎt Git vide initialisé dans /tmp/toto/.git/

Comme vous le remarquez la commande git init créé un dossier .git dans lequel on trouve :

Terminal window
drwxrwxr-x 7 bob bob 4096 nov. 2 13:58 .
drwxrwxr-x 3 bob bob 4096 nov. 2 13:58 ..
drwxrwxr-x 2 bob bob 4096 nov. 2 13:58 branches
-rw-rw-r-- 1 bob bob 92 nov. 2 13:58 config
-rw-rw-r-- 1 bob bob 73 nov. 2 13:58 description
-rw-rw-r-- 1 bob bob 21 nov. 2 13:58 HEAD
drwxrwxr-x 2 bob bob 4096 nov. 2 13:58 hooks
drwxrwxr-x 2 bob bob 4096 nov. 2 13:58 info
drwxrwxr-x 4 bob bob 4096 nov. 2 13:58 objects
drwxrwxr-x 4 bob bob 4096 nov. 2 13:58 refs
  • la configuration du fonctionnement du projet dans le fichier config.
  • des dossiers qui permettent de gĂ©rer tout l’historique du projet. Plus d’infos ici ↗
  • 


Gestion des branches dans git

La gestion des branches est fondamental de Git, offrant une flexibilité immense pour le développement parallÚle et la collaboration. En DevOps, savoir manipuler les branches efficacement est important pour maintenir un flux de travail continu et organisé.

CrĂ©ation d’une Nouvelle Branche

Pour créer une nouvelle branche, la commande git branch <nom_de_la_branche> est utilisée. Cette opération est rapide car Git crée simplement un nouveau pointeur vers le commit actuel. Par exemple, git branch feature-nouvelle crée une branche nommée feature-nouvelle.

Terminal window
git branch feature-nouvelle

Basculer entre les Branches

Une fois la branche créée, il faut y basculer pour y apporter des modifications. La commande git checkout <nom_de_la_branche> permet de changer de branche. Ainsi, git checkout feature-nouvelle vous positionne sur la branche feature-nouvelle.

Terminal window
git checkout feature-nouvelle
Basculement sur la branche 'feature-nouvelle'

Lister les Branches

Pour lister les branches dans un dépÎt Git, vous pouvez utiliser la commande git branch. Cette commande offre différentes options pour afficher les branches selon vos besoins. Voici quelques exemples courants :

  1. Lister les branches locales : Pour voir toutes les branches locales dans votre dépÎt, utilisez simplement :

    Terminal window
    git branch
    * dev
    feature-nouvelle
    main

    Cette commande affichera la liste des branches locales, en mettant en évidence la branche sur laquelle vous vous trouvez actuellement.

  2. Lister toutes les branches, y compris les branches distantes : Si vous souhaitez voir à la fois les branches locales et les branches distantes (c’est-à-dire celles sur le serveur), utilisez :

    Terminal window
    git branch -a
    * dev
    feature-nouvelle
    main
    remotes/origin/HEAD -> origin/main
    remotes/origin/dev
    remotes/origin/main

    Les branches distantes seront listées sous un préfixe remotes/.

  3. Lister uniquement les branches distantes : Pour ne voir que les branches qui existent sur le serveur distant (par exemple, sur GitHub ou GitLab), vous pouvez utiliser :

    Terminal window
    git branch -r
    origin/HEAD -> origin/main
    origin/dev
    origin/main
  4. Afficher les branches avec les derniers commits : Pour obtenir une vue plus dĂ©taillĂ©e, y compris le dernier commit sur chaque branche, utilisez l’option -v :

    Terminal window
    git branch -v
    * dev 2790a91 correction
    feature-nouvelle 2790a91 correction
    main 4e05890 add README
  5. Rechercher des branches par un motif : Si vous cherchez des branches avec un nom spécifique ou suivant un motif, vous pouvez utiliser :

    Terminal window
    git branch --list "*de*"
    * dev

Supprimer une Branche

Pour supprimer une branche dans Git, vous pouvez utiliser la commande git branch avec différentes options, en fonction de si vous souhaitez supprimer une branche localement ou sur un dépÎt distant. Voici comment procéder :

Supprimer une Branche Locale

Pour supprimer une branche locale, la commande est la suivante :

Terminal window
git branch -d <nom_de_la_branche>
  • -d est l’option pour “delete” (supprimer).
  • Remplacez <nom_de_la_branche> par le nom de la branche que vous voulez supprimer.

Par exemple, pour supprimer une branche nommée feature-obsolete :

Terminal window
git branch -d feature-obsolete
Supprimer une Branche sur un DépÎt Distant

Pour supprimer une branche sur un dépÎt distant (comme GitHub ou GitLab), utilisez la commande suivante :

Terminal window
git push <remote> --delete <nom_de_la_branche>
  • <remote> est le nom du dĂ©pĂŽt distant (souvent origin).
  • Remplacez <nom_de_la_branche> par le nom de la branche distante que vous souhaitez supprimer.

Par exemple, pour supprimer la branche feature-obsolete du dépÎt distant nommé origin :

Terminal window
git push origin --delete feature-obsolete

Ajouter des fichiers à l’index

Pour ajouter des fichiers Ă  l’index dans Git, ce qui signifie les prĂ©parer pour un commit, vous utilisez la commande git add. Voici les diffĂ©rentes maniĂšres de l’utiliser :

Ajouter un Fichier Spécifique

Pour ajouter un fichier spĂ©cifique Ă  l’index, utilisez :

Terminal window
git add <nom_du_fichier>

Par exemple, pour ajouter un fichier nommé exemple.txt, tapez :

Terminal window
git add exemple.txt

Ajouter Plusieurs Fichiers

Si vous souhaitez ajouter plusieurs fichiers spĂ©cifiques, vous pouvez les lister tous dans la mĂȘme commande :

Terminal window
git add <fichier1> <fichier2> <fichier3>

Par exemple :

Terminal window
git add exemple1.txt exemple2.txt exemple3.txt

Ajouter Tous les Fichiers Modifiés

Pour ajouter tous les fichiers modifiés (nouveaux fichiers, fichiers modifiés, fichiers supprimés) dans le répertoire courant et ses sous-répertoires, utilisez :

Terminal window
git add .

Ou :

Terminal window
git add -A

Ces commandes ajoutent tous les changements dans votre rĂ©pertoire de travail Ă  l’index.

Ajouter des Parties de Fichiers (Staging Interactif)

Si vous souhaitez ajouter seulement certaines parties d’un fichier modifiĂ© (et pas d’autres modifications dans le mĂȘme fichier), utilisez :

Terminal window
git add -p <nom_du_fichier>

Cette commande lance un mode interactif vous permettant de choisir quelles modifications ajouter au commit. C’est utile pour diviser vos modifications en commits logiques et clairs.

Ajouter des Fichiers par Motif

Enfin, vous pouvez ajouter des fichiers selon un motif spécifique. Par exemple, pour ajouter tous les fichiers .txt :

Terminal window
git add *.txt

L’utilisation de git add est une Ă©tape essentielle dans le workflow Git, car elle permet de sĂ©lectionner prĂ©cisĂ©ment les modifications que vous souhaitez inclure dans votre prochain commit. Cela facilite la crĂ©ation de commits propres et bien organisĂ©s.

Retirer des fichiers à l’index

Pour retirer des fichiers de l’index dans Git, c’est-Ă -dire annuler leur ajout (staging) en vue d’un futur commit, vous pouvez utiliser la commande git rm. Cette commande sert Ă  la fois Ă  supprimer des fichiers de votre rĂ©pertoire de travail et Ă  retirer ces modifications de l’index. Voici comment l’utiliser :

Supprimer et Retirer des Fichiers

Pour supprimer un fichier de votre rĂ©pertoire de travail et retirer ce fichier de l’index, utilisez :

Terminal window
git rm <fichier>

Par exemple, pour supprimer et retirer exemple.txt :

Terminal window
git rm exemple.txt

Cette action supprime le fichier de votre systĂšme de fichiers et met Ă  jour l’index pour reflĂ©ter cette suppression.

Retirer des Fichiers de l’Index Sans les Supprimer

Si vous voulez simplement retirer un fichier de l’index sans le supprimer de votre rĂ©pertoire de travail, utilisez l’option --cached :

Terminal window
git rm --cached <fichier>

Par exemple, pour retirer exemple.txt de l’index tout en le conservant dans votre rĂ©pertoire :

Terminal window
git rm --cached exemple.txt

Cela est particuliĂšrement utile si vous avez accidentellement ajoutĂ© un fichier Ă  l’index que vous ne voulez pas inclure dans votre prochain commit.

Supprimer et Retirer Plusieurs Fichiers

Vous pouvez Ă©galement appliquer git rm Ă  plusieurs fichiers en mĂȘme temps :

Terminal window
git rm <fichier1> <fichier2> ...

Utiliser des Motifs pour Supprimer des Fichiers

Pour supprimer tous les fichiers correspondant Ă  un certain motif, par exemple tous les fichiers .log, utilisez :

Terminal window
git rm '*.log'

Enregistrer des modifications (commit)

Pour enregistrer des modifications dans l’historique de votre dĂ©pĂŽt Git, vous utilisez la commande git commit. AprĂšs avoir ajoutĂ© vos modifications Ă  l’index avec git add, vous pouvez crĂ©er un commit pour capturer l’état actuel de ces fichiers dans votre dĂ©pĂŽt. Voici comment procĂ©der :

Créer un Commit Simple

Pour créer un commit avec un message, utilisez :

Terminal window
git commit -m "Votre message de commit ici"

Remplacez "Votre message de commit ici" par une description concise de vos modifications. Par exemple :

Terminal window
git commit -m "Ajout de la fonctionnalité de connexion utilisateur"

Ajouter et Commiter en une seule commande

Si vous avez des modifications qui sont dĂ©jĂ  suivies par Git (c’est-Ă -dire des fichiers qui ont Ă©tĂ© ajoutĂ©s Ă  l’index lors de commits prĂ©cĂ©dents), vous pouvez les ajouter Ă  l’index et les commiter en une seule commande :

Terminal window
git commit -am "Votre message de commit ici"

Modifier le Dernier Commit

Si vous avez oubliĂ© d’ajouter des changements Ă  votre dernier commit ou si vous voulez changer le message de commit, vous pouvez le modifier avec :

Terminal window
git commit --amend

Cela ouvrira un Ă©diteur pour vous permettre de modifier le message de commit. Si vous avez de nouvelles modifications Ă  ajouter au mĂȘme commit, ajoutez-les d’abord avec git add, puis utilisez git commit --amend.

Créer un Commit Vide

Dans certains cas, vous pourriez vouloir créer un commit sans aucun changement (pour déclencher un processus CI/CD, par exemple). Utilisez pour cela :

Terminal window
git commit --allow-empty -m "Votre message de commit ici"

VĂ©rifier l’État des Commits

AprĂšs avoir committĂ©, vous pouvez vĂ©rifier l’état de vos commits par rapport au dĂ©pĂŽt distant avec :

Terminal window
git status

Et pour voir l’historique des commits :

Terminal window
git log

Chaque commit dans Git représente un ensemble de modifications et est identifié par un identifiant unique (SHA-1). Le message de commit est important pour comprendre le contexte des modifications apportées. Assurez-vous donc que vos messages de commit sont clairs et descriptifs.

Envoyer et tirer des modifications

L’envoi (push) et la rĂ©ception (pull) de modifications sont des opĂ©rations importantes dans l’utilisation de Git, surtout lorsqu’on travaille Ă  plusieurs sur un projet. Ces commandes permettent de synchroniser les changements entre votre dĂ©pĂŽt local et le dĂ©pĂŽt distant (comme GitHub ou GitLab).

Tirer des Modifications (Git Pull)

Pour récupérer et fusionner les modifications depuis le dépÎt distant vers votre dépÎt local, utilisez git pull. Voici comment :

  1. Tirer les modifications : La commande de base pour tirer les modifications est :

    Terminal window
    git pull <remote> <branche>

    Par exemple :

    Terminal window
    git pull origin main

    Cela récupÚre les modifications de la branche main du dépÎt distant origin et les fusionne avec votre branche locale main.

  2. RĂ©soudre les conflits : Si des modifications ont Ă©tĂ© faites Ă  la fois dans votre dĂ©pĂŽt local et dans le dĂ©pĂŽt distant sur les mĂȘmes lignes de code, des conflits peuvent survenir. Git vous demandera de rĂ©soudre ces conflits avant de pouvoir complĂ©ter l’opĂ©ration de pull.

Envoyer des Modifications (Git Push)

AprĂšs avoir commitĂ© vos modifications, vous pouvez les envoyer (push) vers un dĂ©pĂŽt distant pour les partager avec d’autres. Voici comment faire :

  1. Vérifier le dépÎt distant : Avant de pousser vos changements, assurez-vous de connaßtre le dépÎt distant avec lequel vous travaillez. Utilisez :

    Terminal window
    git remote -v

    Cela vous montrera les URLs des dépÎts distants associés à votre dépÎt local.

  2. Envoyer les modifications : Pour pousser vos commits sur la branche courante vers le dépÎt distant, utilisez :

    Terminal window
    git push <remote> <branche>

    OĂč <remote> est le nom du dĂ©pĂŽt distant (souvent origin) et <branche> est le nom de votre branche. Par exemple :

    Terminal window
    git push origin main

    Envoie les modifications de la branche locale main vers la branche main du dépÎt distant origin.

Remiser des modifications (stash)

git stash est une fonctionnalitĂ© de Git qui permet de mettre de cĂŽtĂ© temporairement (ou “stash”) les modifications en cours dans votre rĂ©pertoire de travail, sans avoir Ă  effectuer un commit. Cette fonction est utile dans plusieurs scĂ©narios, tels que le besoin de basculer rapidement entre les branches sans vouloir commiter le travail en cours. Voici comment git stash fonctionne et comment l’utiliser :

  1. Mettre de CĂŽtĂ© des Modifications : Quand vous utilisez git stash, Git prend les modifications en cours dans votre rĂ©pertoire de travail (modifications indexĂ©es et non indexĂ©es) et les sauvegarde dans une zone temporaire. Votre rĂ©pertoire de travail revient alors Ă  l’état du dernier commit.

  2. Liste de Stash : Vous pouvez avoir plusieurs stashes enregistrĂ©s en mĂȘme temps. Git les stocke dans une pile (stack), oĂč le dernier stash est en haut de la pile.

Utilisation de Base

  1. Créer un Stash : Pour mettre de cÎté vos modifications actuelles, utilisez :

    Terminal window
    git stash

    Vous pouvez aussi lui donner un nom avec :

    Terminal window
    git stash save "nom_du_stash"
  2. Lister les Stashes : Pour voir tous les stashes que vous avez créés, utilisez :

    Terminal window
    git stash list
  3. Appliquer le Dernier Stash : Pour réappliquer les modifications du dernier stash (et le supprimer de la pile), utilisez :

    Terminal window
    git stash pop

    Si vous voulez réappliquer les modifications sans supprimer le stash, utilisez git stash apply.

  4. Supprimer un Stash : Pour supprimer le dernier stash de la pile, utilisez :

    Terminal window
    git stash drop

    Pour supprimer un stash spĂ©cifique, utilisez git stash drop stash@{numĂ©ro} oĂč {numĂ©ro} est l’index du stash dans la liste.

ScĂ©narios d’Utilisation

  • Basculer entre les Branches : Si vous ĂȘtes en train de travailler sur une branche et devez rapidement passer Ă  une autre pour une tĂąche urgente, vous pouvez utiliser git stash pour mettre de cĂŽtĂ© vos modifications actuelles, changer de branche, puis les rĂ©appliquer plus tard.
  • Nettoyer le RĂ©pertoire de Travail : Si vous voulez revenir Ă  un Ă©tat de rĂ©pertoire propre, sans perdre les modifications en cours, git stash est une bonne solution.

Fusion de branches

Le merge (fusion) de branches dans Git est un processus clĂ© pour intĂ©grer les modifications d’une branche dans une autre. Cette opĂ©ration est couramment utilisĂ©e pour combiner les modifications de dĂ©veloppement dans une branche principale ou de fonctionnalitĂ©s. Voici comment cela fonctionne et comment l’effectuer :

Fonctionnement du Merge

  1. Objectif : Le merge permet de prendre les commits d’une branche et de les intĂ©grer dans une autre. Cela crĂ©e un nouveau commit dans la branche cible qui contient les modifications des deux branches.

  2. Fast-Forward Merge : Si la branche cible n’a pas de commits divergents depuis la crĂ©ation de la branche source, Git effectuera un “fast-forward merge”. Cela signifie que Git met simplement Ă  jour la tĂȘte de la branche cible pour pointer vers le dernier commit de la branche source.

  3. Three-Way Merge : Si des modifications ont Ă©tĂ© apportĂ©es sur les deux branches depuis leur divergence, Git effectue un “three-way merge”. Git crĂ©e un nouveau commit qui combine les changements des deux branches. Ce commit a deux parents : le dernier commit de chaque branche.

Effectuer un Merge

  1. Se Positionner sur la Branche Cible : Avant de faire un merge, assurez-vous d’ĂȘtre sur la branche dans laquelle vous voulez intĂ©grer les changements. Par exemple, si vous voulez fusionner une branche de fonctionnalitĂ© dans main, vous devriez d’abord vous positionner sur main :

    Terminal window
    git checkout main
  2. Fusionner la Branche Source : Ensuite, fusionnez la branche source dans la branche actuelle (cible) en utilisant :

    Terminal window
    git merge <nom_de_la_branche_source>

    Par exemple, pour fusionner une branche appelée feature dans main, utilisez :

    Terminal window
    git merge feature

Résolutions de conflits

La rĂ©solution de conflits dans Git est un aspect important lorsqu’il s’agit de collaborer sur des projets de code. Les conflits surviennent gĂ©nĂ©ralement lorsqu’il y a des modifications contradictoires dans une mĂȘme partie d’un fichier sur diffĂ©rentes branches ou lorsqu’une personne a modifiĂ© un fichier qui a Ă©tĂ© simultanĂ©ment modifiĂ© par quelqu’un d’autre sur le dĂ©pĂŽt distant. Voici les Ă©tapes pour gĂ©rer et rĂ©soudre ces conflits :

Identifier les Conflits

AprĂšs une tentative de fusion (git merge) ou de rĂ©cupĂ©ration (git pull), Git vous informe s’il y a des conflits. Les conflits doivent ĂȘtre rĂ©solus manuellement.

Comprendre les Marqueurs de Conflit

Dans les fichiers concernés, Git insÚre des marqueurs de conflit qui aident à visualiser la portion de code en conflit. Ces marqueurs se présentent comme suit :

  • <<<<<<< HEAD marque le dĂ©but des modifications de votre branche.
  • ======= sĂ©pare vos modifications de celles provenant de la branche avec laquelle vous fusionnez.
  • >>>>>>> <nom de la branche> marque la fin des modifications de l’autre branche.

Par exemple :

<<<<<<< HEAD
// Votre code ici
=======
// Code de l'autre branche
>>>>>>> feature-branch
Résoudre les Conflits

Ouvrez les fichiers en conflit dans votre Ă©diteur de texte ou IDE et dĂ©cidez manuellement de garder, modifier ou fusionner les parties en conflit. Vous pouvez choisir de garder les modifications de votre branche, celles de la branche distante, ou les combiner d’une maniĂšre qui a du sens pour votre projet.

Marquer les Conflits Comme Résolus

Une fois que vous avez modifié le fichier et résolu les conflits, vous devez marquer ces conflits comme résolus. Pour ce faire, utilisez la commande :

Terminal window
git add <nom_du_fichier>

Cela n’effectue pas de commit mais signale Ă  Git que les conflits dans <nom_du_fichier> ont Ă©tĂ© rĂ©solus.

Finaliser la Fusion

AprĂšs avoir rĂ©solu tous les conflits et les avoir ajoutĂ©s Ă  l’index, vous pouvez finaliser la fusion avec un commit. Utilisez :

Terminal window
git commit

Git ouvrira un éditeur de texte pour que vous puissiez saisir un message de commit pour la fusion. Habituellement, un message par défaut est déjà préparé pour indiquer une fusion.

Tester les Modifications

Avant de considérer la fusion comme complÚte, testez votre code pour vous assurer que les modifications fusionnées fonctionnent comme prévu.

Conseils
  • Utilisez des outils de rĂ©solution de conflits : Certains IDEs et outils GUI pour Git offrent des interfaces visuelles pour aider Ă  la rĂ©solution des conflits, ce qui peut ĂȘtre plus intuitif que de le faire directement via la ligne de commande.
  • Communiquez avec votre Ă©quipe : Si le conflit est complexe ou implique des choix stratĂ©giques, discutez-en avec les membres de l’équipe impliquĂ©s pour dĂ©cider de la meilleure façon de procĂ©der.
  • Pratiquez des commits rĂ©guliers et des mises Ă  jour frĂ©quentes : Cela minimise le risque de conflits importants, rendant leur rĂ©solution plus gĂ©rable.

La résolution de conflits peut sembler intimidante au début, mais avec de la pratique, elle devient une partie naturelle du travail avec Git dans un environnement collaboratif.

Résumé

Voici résumé le fonctionnement des commandes git. (Merci L.Destailleur)

workflow git

Notions sur HEAD

Dans Git, HEAD est une rĂ©fĂ©rence symbolique au dernier commit sur la branche courante dans votre dĂ©pĂŽt local. En d’autres termes, c’est le commit sur lequel vous travaillez actuellement.

HEAD change dynamiquement lorsque vous changez de branche ou lorsque vous faites un nouveau commit. Il pointe toujours vers le dernier commit de la branche courante.

En utilisant la commande git log, vous pouvez voir oĂč HEAD est actuellement pointĂ©. Le commit sur lequel HEAD pointe est gĂ©nĂ©ralement marquĂ© en haut de la liste des commits.

Terminal window
git log
commit 2790a912332c139e5f916ed8833eb82dbdd34724 (HEAD -> dev, origin/dev, feature-nouvelle)
Author: Stéphane ROBERT <robert.stephane.28@gmail.com>
Date: Tue Dec 12 15:31:18 2023 +0100
correction

HEAD peut ĂȘtre utilisĂ© pour naviguer dans l’historique de votre dĂ©pĂŽt. Par exemple, HEAD~1 rĂ©fĂšre au commit prĂ©cĂ©dent celui sur lequel HEAD est actuellement pointĂ©.

La commande git reset utilise souvent HEAD. Par exemple, git reset --hard HEAD réinitialise votre espace de travail au dernier commit, supprimant toutes les modifications non commitées.

Un Ă©tat de “HEAD dĂ©tachĂ©â€ se produit lorsque HEAD pointe directement sur un commit spĂ©cifique et non sur le dernier commit d’une branche. Cela peut arriver lorsque vous checkout un commit spĂ©cifique ou un tag. En Ă©tat de HEAD dĂ©tachĂ©, les commits que vous crĂ©ez ne sont rattachĂ©s Ă  aucune branche. Si vous changez de branche sans crĂ©er une nouvelle branche Ă  partir de ce point, ces commits peuvent devenir “orphelins” et difficiles Ă  retrouver.Pour sortir de cet Ă©tat, vous pouvez checkout une branche existante ou en crĂ©er une nouvelle Ă  partir du commit sur lequel le HEAD dĂ©tachĂ© pointe.

Bonnes Pratiques

  • VĂ©rifiez l’état de votre dĂ©pĂŽt : Utilisez git status rĂ©guliĂšrement pour vĂ©rifier l’état de votre dĂ©pĂŽt local et voir si des modifications nĂ©cessitent un commit ou un push.
  • Commits frĂ©quents, Pushs rĂ©flĂ©chis : Faites des commits petits et frĂ©quents pour un meilleur suivi des modifications, mais poussez les changements vers le dĂ©pĂŽt distant aprĂšs avoir vĂ©rifiĂ© et testĂ© vos modifications localement.

Ces commandes constituent la base de la collaboration et de la gestion de versions dans Git, permettant une synchronisation efficace entre les diffĂ©rents contributeurs d’un projet.

Plus d’infos

Je ne vais pas tout documenter, donc si vous voulez plus d’informations voici un quelques liens.

Liens

Livres gratuits

Vidéos