Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Guide de survie du contributeur git - Devoxx Fr...

Guide de survie du contributeur git - Devoxx France 2025 - Tools-in-Action

Dans l'univers parfois impitoyable de git, il est facile de... perdre la tête, surtout face à un detached HEAD. Et quand tout semble perdu, la tentation de basculer du côté obscure de la force et faire un push --force devient trop forte. Ce "Guide de survie" vous apprendra à éviter ces pièges en vous guidant à travers les commits, merges et remotes. Avec des astuces concrètes pour gérer les conflits et récupérer votre travail, préparez-vous à maîtriser git, même dans les situations critiques. Que la force soit avec vous, mais attention au force push !

Sébastien LECACHEUR

April 17, 2025
Tweet

More Decks by Sébastien LECACHEUR

Other Decks in Programming

Transcript

  1. @slecache .bsky.social #DevoxxFR #git #BackToBasics Guide de survie du contributeur

    git Sébastien Lecacheur 🏢 Odigo 📅 17/04/25 ⌚ 17h50 📍 Devoxx France 🚪 Salle Neuilly 252AB
  2. @slecache .bsky.social #DevoxxFR #git #BackToBasics Agenda • introduction • commits

    • branches • .git/ • merging • remotes • les catastrophes
  3. @slecache .bsky.social #DevoxxFR #git #BackToBasics Agenda > introduction • introduction

    • commits • branches • .git • merging • remotes • les catastrophes
  4. @slecache .bsky.social #DevoxxFR #git #BackToBasics git a 20 ans commit

    e83c5163316f89bfbde7d9ab23ca2e25604af290 Author: Linus Torvalds <[email protected]> Date: Thu Apr 7 15:13:13 2005 -0700 Initial revision of "git", the information manager from hell https://github.com/git/git/commit/e83c5163316f89bfbde7d9ab23ca2e25604af290
  5. @slecache .bsky.social #DevoxxFR #git #BackToBasics Un outil universel 87% des

    développeurs utilisent git pour le contrôle des versions — Gitnux report 2024 https://gitnux.org/open-source-software-statistics/
  6. @slecache .bsky.social #DevoxxFR #git #BackToBasics Une multitude de commandes $

    git --version git version 2.49.0 $ git help -a | grep "^ " | wc -l 179 Minutes to learn, a lifetime to master
  7. @slecache .bsky.social #DevoxxFR #git #BackToBasics Pourquoi moi ? • Nombreux

    workflows ◦ branches per version ◦ BPF ◦ gitflow ◦ trunk-based • Trucs & astuces ◦ https://blog.lecacheur.com/2014/10/07/git-le-b-a-ba/ ◦ https://slecache.com/posts/git-weekly-0-here-we-go-again!/ • Conférence sur le fonctionnement interne de git ◦ https://www.youtube.com/watch?v=uA2WZCQP4EI
  8. @slecache .bsky.social #DevoxxFR #git #BackToBasics Agenda > commits • introduction

    • commits • branches • .git/ • merging • remotes • les catastrophes
  9. @slecache .bsky.social #DevoxxFR #git #BackToBasics Qu’est-ce qu’un commit ? Hash

    sha1 de • tous les fichiers • commit(s) parent(s) • auteur • date et heure • message Actions • git checkout • git show • git merge • git log
  10. @slecache .bsky.social #DevoxxFR #git #BackToBasics L’algo de diff # afficher

    le diff git show $COMMIT_ID # déplacer un fichier git mv old.md new.md # choisir l'algo git diff --histogram 💡 git config --global diff.algorithm histogram
  11. @slecache .bsky.social #DevoxxFR #git #BackToBasics La “staging area” # changements

    "unstaged" git diff # changements "unstaged" & "staged" git diff HEAD # changements "staged" git diff --cached ⚠ git commit -a n’ajoute pas les “untracked files” 💡 git add -p permet de choisir les changements à appliquer
  12. @slecache .bsky.social #DevoxxFR #git #BackToBasics Agenda > branches • introduction

    • commits • branches • .git/ • merging • remotes • les catastrophes
  13. @slecache .bsky.social #DevoxxFR #git #BackToBasics Qu’est qu’une branche ? •

    un simple nom • pointeur sur le dernier commit • la branche main est quelconque $ cat .git/refs/heads/main da39a3ee5e6b4b0d3255bfef95601890afd80709 • seul moyen facile de trouver un commit • le ramasse-miettes peut effacer les commits non accessibles via une branche (ou tag) • le reflog pour lister les changements
  14. @slecache .bsky.social #DevoxxFR #git #BackToBasics Savoir se positionner dans l’arbre

    3 cas possibles • sur une branche • dans l’état “detached HEAD ” • au milieu d’une opération à étapes (rebase, merge, bisect…) Actions • git status • git-prompt.sh
  15. @slecache .bsky.social #DevoxxFR #git #BackToBasics L’état “detached HEAD” • 3

    cas possible pour echo .git/HEAD ◦ main ◦ feat-12 ◦ 39d0a1f7ee4bdc36a96db425e75614606ea633f8 • Pourquoi ? ◦ Tag : git checkout tags/v1.0.0 ◦ Branche distante : git checkout origin/main ◦ Un commit : git checkout 39d0a1f7 • Problème ◦ Tout nouveau commit n’appartient pas à une branche • Action ◦ Nouvelle branche : git checkout -b wip
  16. @slecache .bsky.social #DevoxxFR #git #BackToBasics Les références Messages d’erreur git

    avec reference ou refs : • HEAD: .git/HEAD 🥈 • branches: .git/refs/heads/$BRANCH_NAME 🥇 • tags: .git/refs/tags/$TAG_NAME 🥈 • branches distantes: .git/refs/remotes/$REMOTE/$BRANCH_NAME 🥇 • stash: .git/refs/stash 🥉 Utilisé aussi par le ramasse-miettes !
  17. @slecache .bsky.social #DevoxxFR #git #BackToBasics Les commits perdus • Quand

    ? ◦ git commit --amend ◦ git rebase ◦ git branch -d (si non mergée) ◦ git stash drop • Conséquences ◦ Ennuyeux : plus accessibles dans l’historique mais accessible via git reflog ◦ Cauchemardesque : il faut les rechercher avec git fsck ◦ Désastreux : supprimés et impossible à récupérer
  18. @slecache .bsky.social #DevoxxFR #git #BackToBasics Agenda > .git/ • introduction

    • commits • branches • .git/ • merging • remotes • les catastrophes
  19. @slecache .bsky.social #DevoxxFR #git #BackToBasics .git/ - références & objets

    $ cat .git/HEAD ref: refs/heads/main $ cat .git/refs/heads/main 39d0a1f7 $ git cat-file -p 39d0a1f7 tree 5b3a99d6 parent 4bb0615b author me <[email protected]> 1744671913 committer me <[email protected]> 1744671913 message de commit $ git cat-file -p 5b3a99d6 100644 blob f8e74ffd README.md 100755 blob de68090e hello.sh 040000 tree 36ea095c docs $ git cat-file de68090e echo "Hello world" $ tree .git/objects $ cat .git/refs/remotes/origin/main 39d0a1f7 https:-/www.youtube.com/watch?v=uA2WZCQP4EI
  20. @slecache .bsky.social #DevoxxFR #git #BackToBasics .git/ - configuration & scripts

    $ echo .git/config [remote "origin"] url = [email protected]:mycompany/myproject fetch = +refs/heads-*:refs/remotes/origin-* [branch "main"] remote = origin merge = refs/heads/main $ cat .git/hooks/pre-commit -!/bin/bash npm run lint -& npm test
  21. @slecache .bsky.social #DevoxxFR #git #BackToBasics Agenda > merging • introduction

    • commits • branches • .git/ • merging • remotes • les catastrophes
  22. @slecache .bsky.social #DevoxxFR #git #BackToBasics Qu’est-ce qu’un merge ? •

    2 façons de fusionner 2 branches ◦ git merge ◦ git rebase • un conflit survient lors de ◦ git merge ◦ git rebase ◦ git cherry-pick ◦ git revert ◦ git stash pop • les commits de merge sont créés seulement par git merge • 3 situations ◦ pas de divergence -> fast-forward ◦ divergence sur du code différent -> pas de conflit ◦ divergence sur un même code -> conflit(s) • git pull fait aussi un merge ! choisir entre : ◦ git pull --rebase ◦ git pull --no-rebase
  23. @slecache .bsky.social #DevoxxFR #git #BackToBasics Conflits de merge • Quand

    ? ◦ 2 branches modifient les mêmes lignes de code • Actions ◦ Editer le fichier ◦ Utiliser un outil dédié (via git mergetool) ◦ Si sur un fichier auto-généré, le supprimer et le regénérer ◦ Abandonner le merge (git merge --abort) et réécrire son code…
  24. @slecache .bsky.social #DevoxxFR #git #BackToBasics Résoudre un conflit Le code

    de la branche de départ est : • en haut lors d’un merge • en bas lors d’un rebase 💡 git config --global merge.conflictstyle diff3 <<<<<<< HEAD echo "Hello world!" ||||||| ed382966 echo "Hello world" ======= echo "Hello world-!" >>>>>>> 0a51efb8
  25. @slecache .bsky.social #DevoxxFR #git #BackToBasics Marquer comme résolu • Vérifications

    ◦ git status Que dois-je faire ? ◦ git diff main Quels sont les changements ? ◦ git diff --check Quels sont les conflits non-résolus ? • Actions ◦ git commit lors d’un git merge ◦ git rebase --continue lors d’un git rebase ◦ git cherry-pick --continue lors d’un git cherry-pick ◦ git revert --continue lors d’un git revert
  26. @slecache .bsky.social #DevoxxFR #git #BackToBasics Commit de merge ⚠ merge

    branch1 into branch2 -= merge branch2 into branch1 => HEAD^ suit le premier parent 💡 Utiliser git show --remerge-diff --dd $COMMIT_ID à la place de git show $COMMIT_ID
  27. @slecache .bsky.social #DevoxxFR #git #BackToBasics Agenda > remotes • introduction

    • commits • branches • .git/ • merging • remotes • les catastrophes
  28. @slecache .bsky.social #DevoxxFR #git #BackToBasics Qu’est-ce qu’un dépôt distant ?

    • Attributs ◦ Nom libre ◦ Localisation ▪ Serveur (SaaS ou auto-hébergé) ▪ Autre répertoire sur sa machine ◦ Protocole : https:-/ (pull seul), ssh:-/ (push) ou file:-/ (tests ?) • Interactions ◦ pull/push ◦ Syntaxe ▪ git [pull|push] $REMOTE_NAME $REMOTE_BRANCH ▪ Exemple : git push origin main • Plusieurs distants possibles (cf Github fork, push to prod…) 💡 git config --global push.autoSetupRemote true 🗒 Nom par défaut : origin ⚠ Nom de la branche locale peut être différent de la distante.
  29. @slecache .bsky.social #DevoxxFR #git #BackToBasics Mise à jour de la

    branche locale $ git pull origin main 1) git fetch origin main 2) git merge origin/main
  30. @slecache .bsky.social #DevoxxFR #git #BackToBasics Branches distantes qui divergent $

    git fetch -& git status Your branch and 'origin/main' have diverged, and have 1 and 1 different commits each, respectively. (use "git pull" to merge the remote branch into yours)
  31. @slecache .bsky.social #DevoxxFR #git #BackToBasics Corriger les dépôts distants qui

    divergent 4 approches : • combiner les 2 branches 1) rebase : git pull --rebase -& git push 2) merge : git pull --no-rebase -& git push • mettre de côté jeter le code de la branche 3) locale : git switch -c newbranch -& git switch main -& git reset --hard origin/main 4) distante : git push --force 💡 git config --global pull.rebase true 💡 git push --force-with-lease ⚠ mais attention au git fetch !
  32. @slecache .bsky.social #DevoxxFR #git #BackToBasics Cache des dépôts distants $

    git status Your branch is up to date with origin/main Rappel : git fonctionne en mode déconnecté • mybranch branche locale -> git commit/merge/rebase • origin/mybranch cache de la branche distante -> git pull/push/fetch • origin mybranch branche distante -> git push
  33. @slecache .bsky.social #DevoxxFR #git #BackToBasics Agenda > les catastrophes •

    introduction • commits • branches • .git/ • merging • remotes • les catastrophes
  34. @slecache .bsky.social #DevoxxFR #git #BackToBasics git reset • Permet d’annuler

    des commits en revenant en arrière • Revenir à l’avant-dernier commit : git reset HEAD^ 3 cas d’usage : • git reset --soft $COMMIT_ID conserve les fichiers dans “staging area” • git reset $COMMIT_ID conserve les fichiers dans l’espace de travail • git reset --hard $COMMIT_ID annule tous les changements non-commités 💡 pratique pour modifier le dernier commit ⚠ pratique pour revenir à un état souhaité mais dangereux !
  35. @slecache .bsky.social #DevoxxFR #git #BackToBasics Le reflog Retrouver un commit

    perdu ? • git reflog • git show $COMMIT_ID ou git log $COMMIT_ID • git branch $NAME $COMMIT_ID ou git reset --hard $COMMIT_ID A savoir • reflog n’est pas partagé entre les dépôts • 90 jours de délai de rétention • permet de voir l’état avant un rebase • attaché à une branche (plus de reflog si branche supprimée !)
  36. @slecache .bsky.social #DevoxxFR #git #BackToBasics Mission impossible Retrouver un commit

    introuvable ? • git fsck • Rechercher dans l’historique du terminal • Rechercher sur les autres dépôts
  37. @slecache .bsky.social #DevoxxFR #git #BackToBasics Aller plus loin • Thèmes

    non abordés 📝 ◦ Les workflows ◦ Les alias git ◦ Rebase interactif • Outils 🧰 ◦ oh my zsh! > plugins > git-prompt • Ressources (bibliographiques) ◦ Documentation 📕 ▪ https://git-scm.com/doc ◦ Sites 🌐 ▪ https://ohshitgit.com/fr
  38. @slecache .bsky.social #DevoxxFR #git #BackToBasics Ressources • Google font :

    Architects Daughter • Flaticons: black hand drawn