Retour au cours

git avancé : stash, cherry-pick, tags et hooks

Objectifs

  • Mettre de côté des modifications en cours sans les commiter avec git stash.
  • Appliquer un commit spécifique d’une branche à une autre avec git cherry-pick.
  • Marquer des points importants de l’historique (comme les versions logicielles) avec git tag.
  • Comprendre le principe des git hooks pour l’automatisation locale.

Cette leçon présente quelques outils puissants de Git qui vous aideront à gérer des scénarios plus complexes.

git stash : Mettre de côté son travail

Imaginez ce scénario : vous êtes au milieu d’une modification complexe, mais un bug urgent est signalé en production. Vous devez changer de branche immédiatement, mais votre travail n’est pas prêt à être commité. git stash est la solution.

  • git stash ou git stash push -m "mon message" : Prend toutes vos modifications (suivies et non-commitées) et les met de côté dans une “pile”, restaurant votre répertoire de travail à l’état du dernier commit (HEAD). Votre répertoire est maintenant propre et vous pouvez changer de branche.
  • git stash list : Affiche la liste de vos “stashes”.
  • git stash pop : Récupère le dernier stash et l’applique à votre répertoire de travail.
  • git stash apply stash@{1} : Applique un stash spécifique sans le supprimer de la pile.

git cherry-pick : Cueillir un commit

Parfois, vous n’avez pas besoin de fusionner une branche entière, mais seulement de récupérer un seul commit spécifique (par exemple, un correctif de sécurité critique) et de l’appliquer sur votre branche courante. C’est le rôle de git cherry-pick.

  1. Trouvez le hash du commit que vous voulez appliquer (avec git log).
  2. Placez-vous sur la branche qui doit recevoir le correctif.
  3. Exécutez git cherry-pick <hash-du-commit>.

Git va alors créer un nouveau commit sur votre branche qui contient les mêmes changements que le commit “cueilli”.

git tag : Marquer les versions

Un tag est un marqueur qui pointe vers un commit spécifique. On l’utilise principalement pour marquer les versions d’un logiciel (v1.0, v2.1.3).

  • git tag : Liste tous les tags.
  • git tag -a v1.0 -m "Version 1.0" : Crée un tag annoté. C’est la bonne pratique : il contient des métadonnées (auteur, date, message) et peut être signé.
  • git push origin v1.0 : git push n’envoie pas les tags par défaut. Il faut les pousser explicitement.

git hooks : Automatiser des actions locales

Les “hooks” sont des scripts que Git peut exécuter automatiquement à certains moments clés (avant un commit, avant un push, etc.). Ils se trouvent dans le dossier .git/hooks/ de votre dépôt.

  • pre-commit : Le plus courant. Permet de lancer un linter ou un formateur de code avant que le commit ne soit créé. Si le script échoue, le commit est avorté.
  • pre-push : Permet de lancer des tests avant que le code ne soit envoyé au dépôt distant.

C’est un outil d’automatisation puissant mais local (non partagé via git clone).

Bonnes pratiques

  • Utilisez git stash pour des changements temporaires. Pour un travail de plus longue haleine, préférez un commit “WIP” (Work In Progress) sur une branche dédiée.
  • Utilisez git cherry-pick avec parcimonie. Si vous devez l’utiliser souvent, c’est peut-être le signe que votre stratégie de branches peut être améliorée.
  • Utilisez toujours des tags annotés (-a) pour marquer vos releases.

Exercices

  1. Le Stash Rapide :

    • Modifiez un fichier dans votre projet, mais ne faites ni add ni commit.
    • Exécutez git stash. Observez que votre modification a disparu.
    • Exécutez git stash list pour voir votre stash.
    • Exécutez git stash pop pour récupérer votre modification.
  2. Le Correctif Chirurgical :

    • Créez une branche feature/A et faites-y un commit avec un message clair. Notez son hash.
    • Créez une autre branche feature/B à partir de main.
    • Sur feature/B, utilisez git cherry-pick <hash> pour appliquer le commit de la branche A.
  3. Votre première release :

    • Sur votre branche main, créez un tag annoté v0.1.0-alpha.
    • Vérifiez qu’il a bien été créé avec git tag.
    • Affichez ses détails avec git show v0.1.0-alpha.