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

Introduction à git

Introduction à git

Défricher collectivement les arcanes de l'outil pour vous préparer à suivre correctement des tutoriels en ligne

Bob Maerten

March 04, 2015
Tweet

More Decks by Bob Maerten

Other Decks in Technology

Transcript

  1. Introduction à git
    Bob Maerten
    DSIL3 — Université de Lille - Mars 2015
    https://gitlab.com/bobmaerten/presentation-git
    1 / 235

    View full-size slide

  2. Objectif
    2 / 235

    View full-size slide

  3. Défricher collectivement les arcanes de l'outil pour vous
    préparer à suivre correctement des tutoriels en ligne
    3 / 235

    View full-size slide

  4. Précisions importantes
    4 / 235

    View full-size slide

  5. Cette présentation :
    n'a pas
    pas la prétention d'être une formation à git !
    5 / 235

    View full-size slide

  6. Cette présentation :
    n'a pas
    pas la prétention d'être une formation à git !
    ne couvre qu'une infime partie des usages de l'outil
    6 / 235

    View full-size slide

  7. Cette présentation :
    n'a pas
    pas la prétention d'être une formation à git !
    ne couvre qu'une infime partie des usages de l'outil
    est chiante à mourir car il y a beaucoup de concepts à appréhender
    7 / 235

    View full-size slide

  8. Cette présentation :
    n'a pas
    pas la prétention d'être une formation à git !
    ne couvre qu'une infime partie des usages de l'outil
    est chiante à mourir car il y a beaucoup de concepts à appréhender
    risque de décevoir les gens qui veulent de l'opérationnel rapide
    8 / 235

    View full-size slide

  9. Cette présentation :
    n'a pas
    pas la prétention d'être une formation à git !
    ne couvre qu'une infime partie des usages de l'outil
    est chiante à mourir car il y a beaucoup de concepts à appréhender
    risque de décevoir les gens qui veulent de l'opérationnel rapide
    http://git-scm.com/book/fr/v2 pour la référence
    9 / 235

    View full-size slide

  10. Git en une phrase
    10 / 235

    View full-size slide

  11. Git est un gestionnaire de contenu stockant des objets sous
    la forme d'un graphe acyclique orienté accessibles avec des
    références.
    11 / 235

    View full-size slide

  12. Git est un gestionnaire de contenu stockant des objets sous
    la forme d'un graphe acyclique orienté accessibles avec des
    références.
    12 / 235

    View full-size slide

  13. Git est un gestionnaire de contenu stockant des objets sous
    la forme d'un graphe acyclique orienté accessibles avec des
    références.
    13 / 235

    View full-size slide

  14. Git est un gestionnaire de contenu stockant des objets sous
    la forme d'un graphe acyclique orienté accessibles avec des
    références.
    14 / 235

    View full-size slide

  15. 2 aspects de Git
    le frontend (commandes porcelain)
    le backend (commandes plumbing)
    15 / 235

    View full-size slide

  16. La plupart des formations et tutoriaux se
    concentrent quasi-exclusivement sur le frontend
    16 / 235

    View full-size slide

  17. Or, plus vous comprenez
    comprenez le backend, mieux vous
    maîtrisez
    maîtrisez le frontend
    17 / 235

    View full-size slide

  18. Alors explorons le fonctionnement interne de git
    18 / 235

    View full-size slide

  19. Concept 1
    Git est un gestionnaire de contenu
    19 / 235

    View full-size slide

  20. Git gère des snapshots
    snapshots
    Contrairement à SVN qui fonctionne en mode delta
    20 / 235

    View full-size slide

  21. Révélation : git est une BDD clé-valeur
    22 / 235

    View full-size slide

  22. Révélation : git est une BDD clé-valeur
    Put -> hash-object
    $ echo "titi toto tutu" | git hash-object -w --stdin
    1b7c47f647a48cf4aa80def219d62110aaff6364
    23 / 235

    View full-size slide

  23. Révélation : git est une BDD clé-valeur
    Put -> hash-object
    $ echo "titi toto tutu" | git hash-object -w --stdin
    1b7c47f647a48cf4aa80def219d62110aaff6364
    Get -> cat-file
    $ git cat-file -p 1b7c47f647a48cf4aa80def219d62110aaff6364
    titi toto tutu
    24 / 235

    View full-size slide

  24. Identification par clé SHA-1
    Implémentation simple et efficace
    Unicité
    25 / 235

    View full-size slide

  25. Identification par clé SHA-1
    Implémentation simple et efficace
    Unicité
    git permet de n'utiliser que la partie suffisante des SHA-1
    $ git cat-file -p 1b7c47f647a48cf4aa80def219d62110aaff6364
    titi toto tutu
    $ git cat-file -p 1b7c47f
    titi toto tutu
    $ git cat-file -p 1b7c
    titi toto tutu
    26 / 235

    View full-size slide

  26. Tout est SHA-1
    $ find .git/objects -type f
    .git/objects/ab/39aecb298318035feaba12c651761dc88488f7
    .git/objects/4d/13a74e9497e944228eb0c88d6aad864125fa83
    .git/objects/e9/b3c7ecb8421da993be0b803ecb015c44028612
    .git/objects/68/ba2f1b68200091b8d85de12d85dbedf48a3755
    .git/objects/90/cdfffe540c8440456c354061ad2aabc9c0985f
    .git/objects/8a/61779d2710a37d20e8881ebba5d471a760b355
    .git/objects/8a/a2047614f35dfc0c59f374c8e81696fc18275e
    .git/objects/cc/4f2165af266e947adee4be663e193bcf247091
    .git/objects/eb/33c80bd2dd7f7ba938f25fa65f6455d70efed6
    .git/objects/cf/5aa6a792cd0d01b62254fa28ba2dcbe59e9d03
    .git/objects/86/575ff73c1746f32cce43303783b2d68c13c72d
    .git/objects/2c/7afa29e39fd32fbb1f33563ee70f79c1c191e7
    [...]
    .git/objects/a1/23a9fa912276c7aa77700b6ef7dfc5022707b4
    .git/objects/d3/1e80fa8b3c6522fd2d370c10875e0593cd8283
    .git/objects/4c/a8f004274ca5494bd1492320ddfbc8caa45466
    .git/objects/1e/418d7b23b94c8108ae627c7f5bb3fdf96bf013
    27 / 235

    View full-size slide

  27. Tout est SHA-1
    Types d'objets
    Blobs
    100644 blob 4d13a74e9497e944228eb0c88d6aad864125fa83 LICENSE
    100644 blob 772bb233156315bea0ee958d94beb143220a3e84 README.md
    040000 tree 4ca8f004274ca5494bd1492320ddfbc8caa45466 font
    100644 blob 911a2be129829d31b7b08303ec8db2690793ed0f index.html
    100644 blob 0a3b5622619f7b55bd43fb743cda90a379cdfb92 remark.min.js
    100644 blob 7d5caef4b148a868b1f598e5fb4755a0b0710368 theme.css
    28 / 235

    View full-size slide

  28. Tout est SHA-1
    Types d'objets
    Trees
    100644 blob 4d13a74e9497e944228eb0c88d6aad864125fa83 LICENSE
    100644 blob 772bb233156315bea0ee958d94beb143220a3e84 README.md
    *040000 tree 4ca8f004274ca5494bd1492320ddfbc8caa45466 font
    100644 blob 911a2be129829d31b7b08303ec8db2690793ed0f index.html
    100644 blob 0a3b5622619f7b55bd43fb743cda90a379cdfb92 remark.min.js
    100644 blob 7d5caef4b148a868b1f598e5fb4755a0b0710368 theme.css
    *$ git cat-file -p 4ca8f0
    100644 blob 90cdfffe540c8440456c354061ad2aabc9c0985f DroidSerif.ttf
    100644 blob a123a9fa912276c7aa77700b6ef7dfc5022707b4 YanoneKaffeesatz-Regular.otf
    $ ls -1 font
    DroidSerif.ttf
    YanoneKaffeesatz-Regular.otf
    29 / 235

    View full-size slide

  29. Tout est SHA-1
    Types d'objets
    Commits
    $ git log --oneline
    d31e80f Import travail initial
    68ba2f1 Initial empty commit
    30 / 235

    View full-size slide

  30. Tout est SHA-1
    Types d'objets
    Commits
    $ git log --oneline
    *d31e80f Import travail initial
    68ba2f1 Initial empty commit
    *$ git cat-file -p d31e80f
    tree 8a61779d2710a37d20e8881ebba5d471a760b355
    parent 68ba2f1b68200091b8d85de12d85dbedf48a3755
    author Bob Maerten 1424796124 +0100
    committer Bob Maerten 1424796900 +0100
    Import travail initial
    31 / 235

    View full-size slide

  31. Résumé du concept 1
    Orienté contenu et non fichier
    Base de données clé (sha1) / valeur (contenu)
    3 objets : commit, tree, blob
    34 / 235

    View full-size slide

  32. Aparté
    Découverte des quelques
    commandes de base
    (porcelaine)
    35 / 235

    View full-size slide

  33. git-init
    $ git init /tmp/mon-premier-depo-git
    Dépôt Git vide initialisé dans /tmp/mon-premier-depo-git/.git/
    36 / 235

    View full-size slide

  34. git-init
    $ git init /tmp/mon-premier-depo-git
    Dépôt Git vide initialisé dans /tmp/mon-premier-depo-git/.git/
    $ cd $!
    $ ls -l .git/
    total 32
    drwxrwxr-x 2 rmaerten rmaerten 4096 févr. 25 13:37 branches
    -rw-rw-r-- 1 rmaerten rmaerten 92 févr. 25 13:37 config
    -rw-rw-r-- 1 rmaerten rmaerten 73 févr. 25 13:37 description
    -rw-rw-r-- 1 rmaerten rmaerten 23 févr. 25 13:37 HEAD
    drwxrwxr-x 2 rmaerten rmaerten 4096 févr. 25 13:37 hooks
    drwxrwxr-x 2 rmaerten rmaerten 4096 févr. 25 13:37 info
    drwxrwxr-x 4 rmaerten rmaerten 4096 févr. 25 13:37 objects
    drwxrwxr-x 4 rmaerten rmaerten 4096 févr. 25 13:37 refs
    37 / 235

    View full-size slide

  35. git-status
    $ git status
    Sur la branche master
    Validation initiale
    rien à valider (créez/copiez des fichiers et
    utilisez "git add" pour les suivre)
    38 / 235

    View full-size slide

  36. Ajouter du contenu (faire un commit)
    39 / 235

    View full-size slide

  37. Ajouter du contenu (faire un commit)
    2 étapes :
    40 / 235

    View full-size slide

  38. Ajouter du contenu (faire un commit)
    2 étapes :
    Sélectionner le contenu (index ou staging area)
    41 / 235

    View full-size slide

  39. Ajouter du contenu (faire un commit)
    2 étapes :
    Sélectionner le contenu (index ou staging area)
    Enregistrer un snapshot (commit)
    42 / 235

    View full-size slide

  40. Ajouter à l'index (staging)
    git-add
    43 / 235

    View full-size slide

  41. Ajouter à l'index (staging)
    git-add
    $ echo 'toto' > file.txt
    44 / 235

    View full-size slide

  42. Ajouter à l'index (staging)
    git-add
    $ echo 'toto' > file.txt
    $ git status -s
    ?? file.txt
    45 / 235

    View full-size slide

  43. Ajouter à l'index (staging)
    git-add
    $ echo 'toto' > file.txt
    $ git status -s
    ?? file.txt
    $ git add file.txt
    $ git status -s
    A file.txt
    46 / 235

    View full-size slide

  44. Ajouter à l'index (staging)
    git-add
    $ echo 'toto' > file.txt
    $ git status -s
    ?? file.txt
    $ git add file.txt
    $ git status -s
    A file.txt
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
    $ git cat-file -p fbcf12
    toto
    47 / 235

    View full-size slide

  45. Modifier l'index (staging)
    git-reset
    $ git reset
    $ git status -s
    ?? file.txt
    $ rm -f file.txt
    $ git status -s
    48 / 235

    View full-size slide

  46. Modifier l'index (staging)
    git-reset
    $ git reset
    $ git status -s
    ?? file.txt
    $ rm -f file.txt
    $ git status -s
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
    $ git cat-file -p fbcf12 > file.txt
    $ cat file.txt
    toto
    $ git status -s
    ?? file.txt Ajout à l'index -> enregistré dans la base git.
    49 / 235

    View full-size slide

  47. Amender l'index (staging)
    changement d'avis
    $ echo 'plop' > otherfile
    $ git add otherfile
    $ git status -s
    A otherfile
    ?? file.txt
    50 / 235

    View full-size slide

  48. Amender l'index (staging)
    changement d'avis
    $ echo 'plop' > otherfile
    $ git add otherfile
    $ git status -s
    A otherfile
    ?? file.txt
    $ sed -i 's/plop/coucou/' otherfile
    $ git status -s
    AM otherfile
    ?? file.txt
    $ git add otherfile
    $ git status -s
    A otherfile
    ?? file.txt
    51 / 235

    View full-size slide

  49. Amender l'index (staging)
    changement d'avis
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    .git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    .git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee49
    52 / 235

    View full-size slide

  50. Amender l'index (staging)
    changement d'avis
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    .git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    *.git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee49
    $ git cat-file -p e8b7
    *plop
    53 / 235

    View full-size slide

  51. Amender l'index (staging)
    changement d'avis
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    *.git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    .git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee49
    $ git cat-file -p e8b7
    plop
    $ git cat-file -p 28d0
    *coucou
    54 / 235

    View full-size slide

  52. Amender l'index (staging)
    $ git status
    Sur la branche master
    Validation initiale
    Modifications qui seront validées :
    (utilisez "git rm --cached <fichier>..." pour désindexer)
    nouveau fichier : otherfile
    Fichiers non suivis:
    (utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
    file.txt
    Ajout à l'index -> enregistré dans la base git.
    55 / 235

    View full-size slide

  53. Enregistrer le snapshot (commit)
    git-commit
    56 / 235

    View full-size slide

  54. Enregistrer le snapshot (commit)
    git-commit
    $ git commit -m "Ajout de contenu"
    [master (commit racine) f664ea4] Ajout de contenu
    1 file changed, 1 insertion(+)
    create mode 100644 otherfile
    57 / 235

    View full-size slide

  55. Enregistrer le snapshot (commit)
    git-commit
    $ git commit -m "Ajout de contenu"
    [master (commit racine) f664ea4] Ajout de contenu
    1 file changed, 1 insertion(+)
    create mode 100644 otherfile
    $ git status -s
    ?? file.txt
    58 / 235

    View full-size slide

  56. Enregistrer le snapshot (commit)
    git-commit
    $ git commit -m "Ajout de contenu"
    *[master (commit racine) f664ea4] Ajout de contenu
    1 file changed, 1 insertion(+)
    create mode 100644 otherfile
    $ git status -s
    ?? file.txt
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    *.git/objects/f6/64ea455b2551122b8f703010d04d71ad4feac2
    .git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    .git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
    .git/objects/ac/9486aa02cdd63b67d5b0c0ab863f0b77f
    59 / 235

    View full-size slide

  57. État après le commit
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    *.git/objects/f6/64ea455b2551122b8f703010d04d71ad4feac2
    .git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    .git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
    .git/objects/ac/9486aa02cdd63b67d5b0c0ab863f0b77f
    *$ git cat-file -p f664ea4
    tree ac9486aa02cdd63b67d5b0c0ab863f0b77f5a2af
    author Bob Maerten 1425551185 +0100
    committer Bob Maerten 1425551185 +0100
    Ajout de contenu
    60 / 235

    View full-size slide

  58. État après le commit
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    .git/objects/f6/64ea455b2551122b8f703010d04d71ad4feac2
    .git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    .git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
    *.git/objects/ac/9486aa02cdd63b67d5b0c0ab863f0b77f
    $ git cat-file -p f664ea4
    *tree ac9486aa02cdd63b67d5b0c0ab863f0b77f5a2af
    author Bob Maerten 1425551185 +0100
    committer Bob Maerten 1425551185 +0100
    *$ git cat-file -p ac948
    100644 blob 28d0af969b32e69a389087d7a267a2ecc05f1350 otherfile
    61 / 235

    View full-size slide

  59. État après le commit
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    .git/objects/f6/64ea455b2551122b8f703010d04d71ad4feac2
    *.git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    .git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
    .git/objects/ac/9486aa02cdd63b67d5b0c0ab863f0b77f
    $ git cat-file -p f664ea4
    tree ac9486aa02cdd63b67d5b0c0ab863f0b77f5a2af
    author Bob Maerten 1425551185 +0100
    committer Bob Maerten 1425551185 +0100
    $ git cat-file -p ac948
    100644 blob 28d0af969b32e69a389087d7a267a2ecc05f1350 otherfile
    *$ git cat-file -p 28d0a
    coucou
    62 / 235

    View full-size slide

  60. État après le commit
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    .git/objects/f6/64ea455b2551122b8f703010d04d71ad4feac2
    .git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    *.git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
    .git/objects/ac/9486aa02cdd63b67d5b0c0ab863f0b77f
    *$ git cat-file -p e8b7
    coucou
    63 / 235

    View full-size slide

  61. État après le commit
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    .git/objects/f6/64ea455b2551122b8f703010d04d71ad4feac2
    .git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    *.git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774 --> non utilisé !
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
    .git/objects/ac/9486aa02cdd63b67d5b0c0ab863f0b77f
    *$ git cat-file -p e8b7
    coucou
    On ne perd jamais rien dans git ! (enfin, presque...)
    allez dire ça au garbage collector...
    64 / 235

    View full-size slide

  62. Historique des commits
    $ find .git/objects -type f
    .git/objects/fb/cf12d50552354fc878706bacea89fbb3f9f999
    *.git/objects/f6/64ea455b2551122b8f703010d04d71ad4feac2
    .git/objects/28/d0af969b32e69a389087d7a267a2ecc05f1350
    .git/objects/e8/b7c915cf81135b25e2662a72356339ae5cb774
    .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904
    .git/objects/ac/9486aa02cdd63b67d5b0c0ab863f0b77f
    git-log
    $ git log
    *commit f664ea4
    Author: Bob Maerten
    Date: Wed Feb 25 15:26:18 2015 +0100
    Ajout de contenu
    65 / 235

    View full-size slide

  63. Historique des commits
    git-log
    $ git log
    commit 6f63737
    Author: Bob Maerten
    Date: Tue Feb 24 08:26:16 2015 +0100
    Removed SSH host key generation on image
    Prevents using hub version of SSH keys to intercept communication with
    the docker container. Thx @gabeos on this one!
    Fixes #6
    commit c5cf179
    Author: Bob Maerten
    Date: Tue Feb 24 08:25:48 2015 +0100
    Bumped to latest phusion/baseimage
    commit 379ff91 66 / 235

    View full-size slide

  64. Historique des commits
    Avec quelques options c'est mieux !
    * $ git log --oneline --graph | head -18
    * 6f63737 Removed SSH host key generation on image
    * c5cf179 Bumped to latest phusion/baseimage
    * 379ff91 Bumped to 1.9 release
    * 4459939 Updated to 1.8.1
    * 719cb17 Merge pull request #5 from nicosomb/patch-1
    |\
    | * 1658e08 upgrade to wallabag 1.8.0
    |/
    * 50d80ef Upgraded to latest phusion/baseimage
    * b10651d Bumped version 1.7.2
    * 252be69 Set permission on unix socket for php-fpm
    * 36b0374 Upped wallabag version from release 1.7.1
    * 903b94d Use of --format option from docker binary
    * dcf98ea Merge pull request #2 from amtrack/bump-version
    |\
    | * 56acfc8 make wallabag version configurable and bump to 1.7.0
    |/ 67 / 235

    View full-size slide

  65. Historique des commits
    Avec d'autres options c'est encore mieux !
    68 / 235

    View full-size slide

  66. Historique des commits (outils spécialisés)
    tig (terminal)
    69 / 235

    View full-size slide

  67. Historique des commits (outils spécialisés)
    SourceTree (windows et autres) : http://www.sourcetreeapp.com/
    70 / 235

    View full-size slide

  68. Historique des commits (outils spécialisés)
    webui (navigateur) : https://github.com/alberthier/git-webui
    71 / 235

    View full-size slide

  69. Résumé des commandes
    72 / 235

    View full-size slide

  70. Résumé des commandes
    add
    add : ajouter du contenu à l'index
    reset
    reset : vider le contenu de l'index
    status
    status : connaitre l'état (working tree / index)
    commit
    commit : enregistrer l'index
    log
    log : consulter l'historique des commits
    73 / 235

    View full-size slide

  71. Questions/Réponses
    74 / 235

    View full-size slide

  72. Git est un
    gestionnaire de contenu
    stockant des objets sous la forme d'un graphe acyclique orienté
    stockant des objets sous la forme d'un graphe acyclique orienté
    accessibles avec des références
    75 / 235

    View full-size slide

  73. Concept 2
    La relation entre les commits est un graphe acyclique orienté
    (DAG)
    76 / 235

    View full-size slide

  74. Graphe acyclique orienté
    =
    Graphe sans boucle
    boucle
    77 / 235

    View full-size slide

  75. Un noeud peut avoir
    0, 1, 2 ou N parents
    78 / 235

    View full-size slide

  76. Représentation courante
    Parent ← Enfant
    79 / 235

    View full-size slide

  77. Ajouter du contenu dans git
    =
    Modifier le graphe
    80 / 235

    View full-size slide

  78. Modifier le graphe
    81 / 235

    View full-size slide

  79. Modifier le graphe
    Se placer sur un noeud X
    82 / 235

    View full-size slide

  80. Modifier le graphe
    Se placer sur un noeud X
    Récupérer le contenu du noeud Y
    83 / 235

    View full-size slide

  81. Modifier le graphe
    Se placer sur un noeud X
    Récupérer le contenu du noeud Y
    Appliquer une opération (X & Y)
    84 / 235

    View full-size slide

  82. Modifier le graphe
    Se placer sur un noeud X
    Récupérer le contenu du noeud Y
    Appliquer une opération (X & Y)
    Exemple
    Se placer sur le noeud 4
    Récupérer le contenu du noeud 5
    Appliquer une opération : 4 & 5 = 6 (ici merge)
    85 / 235

    View full-size slide

  83. Les différentes opérations
    - commit
    - merge
    - rebase
    - squash
    - cherrypick
    - revert
    86 / 235

    View full-size slide

  84. Opérations par l'exemple
    87 / 235

    View full-size slide

  85. Continuer le graphe
    Commit
    88 / 235

    View full-size slide

  86. Continuer le graphe
    Commit
    Le contenu de l'index représente le noeud récupéré dans l'opération
    89 / 235

    View full-size slide

  87. Continuer le graphe
    Commit
    Le contenu de l'index représente le noeud récupéré dans l'opération
    90 / 235

    View full-size slide

  88. Modéliser la fusion
    Merge
    91 / 235

    View full-size slide

  89. Simplifier le graphe
    Rebase
    92 / 235

    View full-size slide

  90. Nettoyer le graphe
    Squash
    93 / 235

    View full-size slide

  91. Copie sans historique
    Cherrypick
    94 / 235

    View full-size slide

  92. Cherrypick
    95 / 235

    View full-size slide

  93. Cherrypick
    96 / 235

    View full-size slide

  94. Cherrypick
    97 / 235

    View full-size slide

  95. Cherrypick
    98 / 235

    View full-size slide

  96. Annuler un commit
    revert
    99 / 235

    View full-size slide

  97. Annuler un commit
    revert
    Les contenus des des working dirs de C0 et du dernier commit sont identiques
    100 / 235

    View full-size slide

  98. Annuler un commit
    revert
    Les contenus des des working dirs de C0 et du dernier commit sont identiques
    Attention, ne pas confondre git revert
    git revert et...
    101 / 235

    View full-size slide

  99. Annuler un commit
    revert
    Les contenus des des working dirs de C0 et du dernier commit sont identiques
    Attention, ne pas confondre git revert
    git revert et...
    Ok, je sors...
    102 / 235

    View full-size slide

  100. À retenir
    La vision chronologique dans git n'a guère de sens. Même si
    les dates sont stockées dans les commits, la seule vision
    correcte est topologique.
    103 / 235

    View full-size slide

  101. Résumé du concept 2
    Les commits sont reliés dans un graphe
    Manipulable à loisir puisque complètement local
    Les objets sont immutables
    104 / 235

    View full-size slide

  102. Questions/Réponses
    105 / 235

    View full-size slide

  103. Git est un
    gestionnaire de contenu
    stockant des objets sous la forme d'un graphe acyclique orienté
    accessibles avec des références
    accessibles avec des références
    106 / 235

    View full-size slide

  104. Concept 3
    Le contenu est accessible sous forme de référence
    107 / 235

    View full-size slide

  105. Pouvez vous mémoriser un SHA1 ?
    108 / 235

    View full-size slide

  106. e83c5163316f89bfbde7d9ab23ca2e25604af290
    109 / 235

    View full-size slide

  107. e83c516
    110 / 235

    View full-size slide

  108. Quel est le SHA1 ? :)
    111 / 235

    View full-size slide

  109. Bon ok, c'était facile car
    e83c5163316f89bfbde7d9ab23ca2e25604af290 est un
    SHA-1 "mythique"
    112 / 235

    View full-size slide

  110. Bon ok, c'était facile car
    e83c5163316f89bfbde7d9ab23ca2e25604af290 est un
    SHA-1 "mythique"
    c'est celui du 1er commit de git !
    $ cd /usr/local/src/git
    $ git show -s $(git log --oneline | tail -1 | awk '{ print $1 }')
    commit e83c516
    Author: Linus Torvalds
    Date: Thu Apr 7 15:13:13 2005 -0700
    Initial revision of "git", the information manager from hell
    113 / 235

    View full-size slide

  111. Revenons aux références
    114 / 235

    View full-size slide

  112. Revenons aux références
    Comparable au DNS
    115 / 235

    View full-size slide

  113. Revenons aux références
    Comparable au DNS
    $ host -t aaaa google.com
    google.com has IPv6 address 2a00:1450:4007:805::1006
    116 / 235

    View full-size slide

  114. Revenons aux références
    Comparable au DNS
    $ host -t aaaa google.com
    google.com has IPv6 address 2a00:1450:4007:805::1006
    Une référence pointe sur un commit
    $ cat .git/refs/master
    a9b573777c6847cf5144e598aef899b2360c5ed6
    117 / 235

    View full-size slide

  115. 2 types de références
    118 / 235

    View full-size slide

  116. 2 types de références
    déplacées par Git
    119 / 235

    View full-size slide

  117. 2 types de références
    déplacées par Git
    déplacées par l'utilisateur
    120 / 235

    View full-size slide

  118. Exemple de déplacement automatique
    avant un commit
    121 / 235

    View full-size slide

  119. Exemple de déplacement automatique
    après un commit
    122 / 235

    View full-size slide

  120. Exemple de déplacement automatique
    la référence master
    master est déplacée par git à chaque commit
    123 / 235

    View full-size slide

  121. Exemple de déplacement automatique
    la référence master
    master est déplacée par git à chaque commit
    sans cela, il faudrait à chaque fois se souvenir du SHA-1 du dernier commit
    124 / 235

    View full-size slide

  122. Une branche est une référence
    (déplacée par Git)
    125 / 235

    View full-size slide

  123. git-branch
    La référence est déplacée par git sur les commits enfants
    126 / 235

    View full-size slide

  124. git-branch
    La référence est déplacée par git sur les commits enfants
    Par extention on parle de branche pour l'ensemble des commits parents
    127 / 235

    View full-size slide

  125. git-branch
    La référence est déplacée par git sur les commits enfants
    Par extention on parle de branche pour l'ensemble des commits parents
    Ne "coûte" absolument rien en CPU et en stockage
    $ git branch newbranch
    0,00s user 0,01s system 89% cpu 0,007 total
    $ ls -l .git/refs/heads/newbranch
    -rw-rw-r-- 1 rmaerten rmaerten 41 mars 4 13:37 .git/refs/heads/newbranch
    128 / 235

    View full-size slide

  126. Alors, faites des branches. Les branches, c'est le
    bien !
    129 / 235

    View full-size slide

  127. un tag est une référence
    (déplacée par l'utilisateur)
    130 / 235

    View full-size slide

  128. git-tag
    $ git tag v0.0.1 e83c516
    $ cat .git/refs/tags/v0.0.1
    e83c5163316f89bfbde7d9ab23ca2e25604af290
    131 / 235

    View full-size slide

  129. git-tag
    $ git tag v0.0.1 e83c516
    $ cat .git/refs/tags/v0.0.1
    e83c5163316f89bfbde7d9ab23ca2e25604af290
    Les tags sont souvent fixes
    132 / 235

    View full-size slide

  130. Git gère les références avec des
    espaces de nom
    espaces de nom (namespaces)
    133 / 235

    View full-size slide

  131. Exemples
    bob/experiment
    feature/using-cache-before-fetch-db
    fix/auth/ldap-server
    134 / 235

    View full-size slide

  132. Conventions
    135 / 235

    View full-size slide

  133. Conventions
    master
    master = branche principale (init)
    136 / 235

    View full-size slide

  134. Conventions
    master
    master = branche principale (init)
    origin
    origin = dépot distant (clone)
    137 / 235

    View full-size slide

  135. Résumé du concept 3
    Une référence est un pointeur (comme un post-it)
    Utilisable avec des espaces de nom
    Utile pour l'utilisateur (frontend)
    138 / 235

    View full-size slide

  136. L'ensemble peut se voir en couche
    Contenu (objet blob)
    Système de fichier (objet tree)
    Historisé (objet commit)
    Facilement mémorisable (référence)
    139 / 235

    View full-size slide

  137. Questions/Réponses
    140 / 235

    View full-size slide

  138. Collaboration
    141 / 235

    View full-size slide

  139. Git est une base d'objets synchronisable
    synchronisable
    142 / 235

    View full-size slide

  140. 2 manières de collaborer
    143 / 235

    View full-size slide

  141. La méthode
    « chacun chez soi »
    (mode par défaut)
    144 / 235

    View full-size slide

  142. Je peux récupérer du code quand je veux
    145 / 235

    View full-size slide

  143. Je peux récupérer du code quand je veux
    Je dois annoncer que des modifications sont
    disponibles
    146 / 235

    View full-size slide

  144. Je peux récupérer du code quand je veux
    Je dois annoncer que des modifications sont
    disponibles
    Votre dépôt est personnel
    personnel
    147 / 235

    View full-size slide

  145. Je peux récupérer du code quand je veux
    Je dois annoncer que des modifications sont
    disponibles
    Votre dépôt est personnel
    personnel
    on pull depuis les autres
    on ne
    ne push pas
    pas vers les autres
    148 / 235

    View full-size slide

  146. La méthode
    « 1 pour tous, tous pour 1 »
    149 / 235

    View full-size slide

  147. Dépôt partagé (bare)
    $ git init --bare /tmp/sharedrepo.git
    150 / 235

    View full-size slide

  148. Dépôt partagé (bare)
    $ git init --bare /tmp/sharedrepo.git
    $ git clone /tmp/sharedrepo.git
    151 / 235

    View full-size slide

  149. Dépôt partagé (bare)
    $ git init --bare /tmp/sharedrepo.git
    $ git clone /tmp/sharedrepo.git
    On s'accorde collectivement sur le fait que ce dépôt devient
    un référentiel
    152 / 235

    View full-size slide

  150. Dépôt partagé (bare)
    $ git init --bare /tmp/sharedrepo.git
    $ git clone /tmp/sharedrepo.git
    On s'accorde collectivement sur le fait que ce dépôt devient
    un référentiel
    les usagers pushent et pullent sur le référentiel
    153 / 235

    View full-size slide

  151. Dépôt partagé (bare)
    $ git init --bare /tmp/sharedrepo.git
    $ git clone /tmp/sharedrepo.git
    On s'accorde collectivement sur le fait que ce dépôt devient
    un référentiel
    les usagers pushent et pullent sur le référentiel
    nécessité de synchroniser régulièrement
    154 / 235

    View full-size slide

  152. Dépôt partagé (bare)
    $ git init --bare /tmp/sharedrepo.git
    $ git clone /tmp/sharedrepo.git
    On s'accorde collectivement sur le fait que ce dépôt devient
    un référentiel
    les usagers pushent et pullent sur le référentiel
    nécessité de synchroniser régulièrement
    avec un prompt aware c'est mieux
    155 / 235

    View full-size slide

  153. Différence entre dépôt "classique" et "bare"
    156 / 235

    View full-size slide

  154. Différence entre dépôt "classique" et "bare"
    bare : pas de working dir
    157 / 235

    View full-size slide

  155. Différence entre dépôt "classique" et "bare"
    bare : pas de working dir
    bare : .git à la fin (convention)
    158 / 235

    View full-size slide

  156. Différence entre dépôt "classique" et "bare" :
    bare : pas de working dir
    bare : .git à la fin (convention)
    Gitlab est un dépôt bare (avec des ACLs)
    159 / 235

    View full-size slide

  157. Différence entre dépôt "classique" et "bare" :
    bare : pas de working dir
    bare : .git à la fin (convention)
    Gitlab est un dépôt bare (avec des ACLs)
    $ git clone [email protected]:rmaerten/presentation-git.git
    Clonage dans 'presentation-git'...
    remote: Counting objects: 107, done.
    remote: Compressing objects: 100% (105/105), done.
    remote: Total 107 (delta 26), reused 0 (delta 0)
    Réception d'objets: 100% (107/107), 6.72 MiB | 540.00 KiB/s, fait. 160 / 235

    View full-size slide

  158. La notion de "remote"
    161 / 235

    View full-size slide

  159. Révélation
    Les remotes sont aussi
    aussi des branches
    169 / 235

    View full-size slide

  160. Révélation
    Les remotes sont aussi
    aussi des branches
    Donc des références (si vous avez suivi)
    170 / 235

    View full-size slide

  161. Révélation
    Les remotes sont aussi
    aussi des branches
    Donc des références (si vous avez suivi)
    Manipulable à loisir en local une fois synchronisées
    171 / 235

    View full-size slide

  162. Configurer une branche "distante"
    git-remote
    179 / 235

    View full-size slide

  163. Configurer une branche "distante"
    git-remote
    $ git remote add gespinfo3 [email protected]:ent/gespinfo3.git
    180 / 235

    View full-size slide

  164. Configurer une branche "distante"
    git-remote
    $ git remote add gespinfo3 [email protected]:ent/gespinfo3.git
    $ tail -3 .git/config
    [remote "gespinfo3"]
    url = [email protected]:ent/gespinfo3.git
    fetch = +refs/heads/*:refs/remotes/gespinfo3/*
    181 / 235

    View full-size slide

  165. Configurer une branche "distante"
    git-remote
    $ git remote add gespinfo3 [email protected]:ent/gespinfo3.git
    $ tail -3 .git/config
    [remote "gespinfo3"]
    url = [email protected]:ent/gespinfo3.git
    fetch = +refs/heads/*:refs/remotes/gespinfo3/*
    $ git clone [email protected]:rmaerten/presentation-git.git
    $ cd presentation-git
    $ git remote -v
    origin [email protected]:rmaerten/presentation-git.git (fetch)
    origin [email protected]:rmaerten/presentation-git.git (push)
    182 / 235

    View full-size slide

  166. Tout ce qui provient de origin est préfixé avec un espace de
    nom origin.
    master -> origin/master
    test -> origin/test
    183 / 235

    View full-size slide

  167. La branche distante master est liée avec ma
    ma branche master.
    master <-> origin/master
    184 / 235

    View full-size slide

  168. Récupérér le contenu de la base .git distante
    git-fetch
    185 / 235

    View full-size slide

  169. Récupérér le contenu de la base .git distante
    git-fetch
    $ git fetch
    Récupération de origin
    remote: Counting objects: 42, done.
    remote: Compressing objects: 100% (14/14), done.
    remote: Total 42 (delta 15), reused 6 (delta 6), pack-reused 22
    Unpacking objects: 100% (42/42), done.
    Depuis gitlab.univ-lille3.fr:ent/gespinfo3.git
    677acc3..e55c715 master -> origin/master
    186 / 235

    View full-size slide

  170. Pousser du contenu
    git-push
    187 / 235

    View full-size slide

  171. Pousser du contenu
    git-push
    Envoie le contenu de la base .git
    $ git push upstream master
    Counting objects: 4, done.
    Writing objects: 100% (3/3), 278 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To [email protected]:ent/gespinfo3.git
    e3252af..141af1c master -> master
    188 / 235

    View full-size slide

  172. Pousser du contenu
    git-push
    Envoie le contenu de la base .git
    $ git push upstream master
    Counting objects: 4, done.
    Writing objects: 100% (3/3), 278 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To [email protected]:ent/gespinfo3.git
    e3252af..141af1c master -> master
    ⾠ Met à jour aussi les références distantes (d'ou l'intérêt des ACLs)
    189 / 235

    View full-size slide

  173. Attention avec la commande pull
    pull
    190 / 235

    View full-size slide

  174. Attention avec la commande pull
    pull
    pull = fetch + merge
    191 / 235

    View full-size slide

  175. Attention avec la commande pull
    pull
    pull = fetch + merge
    Pas toujours l'opération que l'on souhaite effectuer sur le graphe !
    192 / 235

    View full-size slide

  176. Attention à historique
    193 / 235

    View full-size slide

  177. Attention à historique
    Tout ce qui a été pushé ne doit plus être modifié localement
    194 / 235

    View full-size slide

  178. Attention à historique
    Tout ce qui a été pushé ne doit plus être modifié localement
    exception permise pour les branches identifiées comme purement personnelles
    personnelles (git
    push --force)
    195 / 235

    View full-size slide

  179. Attention à historique
    Tout ce qui a été pushé ne doit plus être modifié localement
    exception permise pour les branches identifiées comme purement personnelles
    personnelles (git
    push --force)
    Allégorie de git push --force
    196 / 235

    View full-size slide

  180. Deux ou trois petites choses pour terminer
    a.k.a. « one more thing... » dans une société à la pomme
    197 / 235

    View full-size slide

  181. Ou plutôt pour bien commencer
    198 / 235

    View full-size slide

  182. git-config
    199 / 235

    View full-size slide

  183. git-config
    Obligatoire pour commiter
    $ git config --global user.name "Your name"
    $ git config --global user.email "[email protected]"
    200 / 235

    View full-size slide

  184. git-config
    Obligatoire pour commiter
    $ git config --global user.name "Your name"
    $ git config --global user.email "[email protected]"
    Changer l'éditeur par défaut
    $ git config --global core.editor vim
    201 / 235

    View full-size slide

  185. git-config
    Obligatoire pour commiter
    $ git config --global user.name "Your name"
    $ git config --global user.email "[email protected]"
    Changer l'éditeur par défaut
    $ git config --global core.editor vim
    ~/.gitconfig
    $ git config --list
    $ cat ~/.gitconfig
    202 / 235

    View full-size slide

  186. Format de messages de commit
    $ git status -s
    A file.txt
    $ git commit
    203 / 235

    View full-size slide

  187. Format de messages de commit
    $ git status -s
    A file.txt
    $ git commit
    Sujet du commit
    Que s'est-il passé ?
    Le pourquoi du commit, son contexte.
    Parce que le comment, c'est ce qu'il y a dans le code...
    [Ticket en rapport]
    # Veuillez saisir le message de validation pour vos modifications.
    # Les lignes commençant par '#' seront ignorées, et un message vide
    # abandonne la validation.
    # Sur la branche master
    #
    # Validation initiale
    #
    # Modifications qui seront validées :
    # nouveau fichier: plop
    #
    204 / 235

    View full-size slide

  188. Format de messages de commit
    $ git status -s
    A file.txt
    $ git commit
    *Sujet du commit
    Que s'est-il passé ?
    Le pourquoi du commit, son contexte.
    Parce que le comment, c'est ce qu'il y a dans le code...
    [Ticket en rapport]
    # Veuillez saisir le message de validation pour vos modifications.
    # Les lignes commençant par '#' seront ignorées, et un message vide
    # abandonne la validation.
    # Sur la branche master
    #
    # Validation initiale
    #
    # Modifications qui seront validées :
    # nouveau fichier: plop
    #
    205 / 235

    View full-size slide

  189. Format de messages de commit
    $ git status -s
    A file.txt
    $ git commit
    Sujet du commit
    *Que s'est-il passé ?
    *Le pourquoi du commit, son contexte.
    *Parce que le comment, c'est ce qu'il y a dans le code...
    [Ticket en rapport]
    # Veuillez saisir le message de validation pour vos modifications.
    # Les lignes commençant par '#' seront ignorées, et un message vide
    # abandonne la validation.
    # Sur la branche master
    #
    # Validation initiale
    #
    # Modifications qui seront validées :
    # nouveau fichier: plop
    #
    206 / 235

    View full-size slide

  190. Format de messages de commit
    $ git status -s
    A file.txt
    $ git commit
    Sujet du commit
    Que s'est-il passé ?
    Le pourquoi du commit, son contexte.
    Parce que le comment, c'est ce qu'il y a dans le code...
    *[Ticket en rapport]
    # Veuillez saisir le message de validation pour vos modifications.
    # Les lignes commençant par '#' seront ignorées, et un message vide
    # abandonne la validation.
    # Sur la branche master
    #
    # Validation initiale
    #
    # Modifications qui seront validées :
    # nouveau fichier: plop
    #
    207 / 235

    View full-size slide

  191. Ignorer des fichiers
    .gitignore
    208 / 235

    View full-size slide

  192. Ignorer des fichiers
    .gitignore
    Ignorer des fichiers à ne pas versionner ou sensibles (mots de passe)
    209 / 235

    View full-size slide

  193. Ignorer des fichiers
    .gitignore
    Ignorer des fichiers à ne pas versionner ou sensibles (mots de passe)
    local au dépôt et partageable (on peut le versionner)
    210 / 235

    View full-size slide

  194. Ignorer des fichiers
    .gitignore
    Ignorer des fichiers à ne pas versionner ou sensibles (mots de passe)
    local au dépôt et partageable (on peut le versionner)
    $ git config --global core.excludesfile ~/.gitignore_global
    *$ cat ~/.gitignore_global
    **~
    **.bak
    *.DS_Store
    211 / 235

    View full-size slide

  195. Ignorer des fichiers
    .gitignore
    Ignorer des fichiers à ne pas versionner ou sensibles (mots de passe)
    local au dépôt et partageable (on peut le versionner)
    $ git config --global core.excludesfile ~/.gitignore_global
    *$ cat ~/.gitignore_global
    **~
    **.bak
    *.DS_Store
    .git/info/exclude
    212 / 235

    View full-size slide

  196. Ignorer des fichiers
    .gitignore
    Ignorer des fichiers à ne pas versionner ou sensibles (mots de passe)
    local au dépôt et partageable (on peut le versionner)
    $ git config --global core.excludesfile ~/.gitignore_global
    *$ cat ~/.gitignore_global
    **~
    **.bak
    *.DS_Store
    .git/info/exclude
    Ignorer des fichiers du dépôt
    213 / 235

    View full-size slide

  197. Ignorer des fichiers
    .gitignore
    Ignorer des fichiers à ne pas versionner ou sensibles (mots de passe)
    local au dépôt et partageable (on peut le versionner)
    $ git config --global core.excludesfile ~/.gitignore_global
    *$ cat ~/.gitignore_global
    **~
    **.bak
    *.DS_Store
    .git/info/exclude
    Ignorer des fichiers du dépôt
    Purement local au dépôt (non partagé, non versionnable) 214 / 235

    View full-size slide

  198. Formatage de fichiers
    215 / 235

    View full-size slide

  199. Formatage de fichiers
    core.autocrlf
    Git va convertir les fins de lignes en fonction de la valeur
    216 / 235

    View full-size slide

  200. Formatage de fichiers
    core.autocrlf
    Git va convertir les fins de lignes en fonction de la valeur
    true
    true = CRLF <-> LF entre le WT et l'index
    217 / 235

    View full-size slide

  201. Formatage de fichiers
    core.autocrlf
    Git va convertir les fins de lignes en fonction de la valeur
    true
    true = CRLF <-> LF entre le WT et l'index
    pour les windowsiens responsables
    218 / 235

    View full-size slide

  202. Formatage de fichiers
    core.autocrlf
    Git va convertir les fins de lignes en fonction de la valeur
    true
    true = CRLF <-> LF entre le WT et l'index
    pour les windowsiens responsables
    input
    input = CRLF -> LF vers le WT mais pas l'inverse
    219 / 235

    View full-size slide

  203. Formatage de fichiers
    core.autocrlf
    Git va convertir les fins de lignes en fonction de la valeur
    true
    true = CRLF <-> LF entre le WT et l'index
    pour les windowsiens responsables
    input
    input = CRLF -> LF vers le WT mais pas l'inverse
    pour les Macqueux/Linuxiens qui bossent avec des Windowsiens pas
    responsables
    220 / 235

    View full-size slide

  204. Formatage de fichiers
    core.autocrlf
    Git va convertir les fins de lignes en fonction de la valeur
    true
    true = CRLF <-> LF entre le WT et l'index
    pour les windowsiens responsables
    input
    input = CRLF -> LF vers le WT mais pas l'inverse
    pour les Macqueux/Linuxiens qui bossent avec des Windowsiens pas
    responsables
    false
    false si environnement windows exclusif
    rarement le cas
    221 / 235

    View full-size slide

  205. Gestion des espaces blancs
    222 / 235

    View full-size slide

  206. Gestion des espaces blancs
    core.whitespace
    Git va détecter et corriger les problèmes éventuels d'espaces blancs
    223 / 235

    View full-size slide

  207. Gestion des espaces blancs
    core.whitespace
    Git va détecter et corriger les problèmes éventuels d'espaces blancs
    Par défaut
    blank-at-eol
    blank-at-eof
    trailing-space regroupe les 2 précédents
    space-before-tab
    224 / 235

    View full-size slide

  208. Gestion des espaces blancs
    core.whitespace
    Git va détecter et corriger les problèmes éventuels d'espaces blancs
    Par défaut
    blank-at-eol
    blank-at-eof
    trailing-space regroupe les 2 précédents
    space-before-tab
    Off
    indent-with-non-tab : cherche les lignes qui commencent par des espaces
    tabwidth=8 par défaut dans ce cas
    tab-in-indent : vérfie l'indentation avec des Tabs
    cr-at-eol : git ne corrigera pas les CR en fin de ligne
    225 / 235

    View full-size slide

  209. Gestion des espaces blancs
    core.whitespace
    Git va détecter et corriger les problèmes éventuels d'espaces blancs
    Par défaut
    blank-at-eol
    blank-at-eof
    trailing-space regroupe les 2 précédents
    space-before-tab
    Off
    indent-with-non-tab : cherche les lignes qui commencent par des espaces
    tabwidth=8 par défaut dans ce cas
    tab-in-indent : vérfie l'indentation avec des Tabs
    cr-at-eol : git ne corrigera pas les CR en fin de ligne
    $ git config --global core.whitespace \
    trailing-space,space-before-tab,indent-with-non-tab
    226 / 235

    View full-size slide

  210. Gestion des espaces blancs
    core.whitespace
    Git va détecter et corriger les problèmes éventuels d'espaces blancs
    Par défaut
    blank-at-eol
    blank-at-eof
    trailing-space regroupe les 2 précédents
    space-before-tab
    Off
    indent-with-non-tab : cherche les lignes qui commencent par des espaces
    tabwidth=8 par défaut dans ce cas
    tab-in-indent : vérfie l'indentation avec des Tabs
    cr-at-eol : git ne corrigera pas les CR en fin de ligne
    $ git config --global core.whitespace \
    trailing-space,space-before-tab,indent-with-non-tab
    man git-config est ton ami
    227 / 235

    View full-size slide

  211. Les Tabs c'est nul de toute manière !
    228 / 235

    View full-size slide

  212. Les Tabs c'est nul de toute manière !
    Space FTW!
    229 / 235

    View full-size slide

  213. Conclusion
    230 / 235

    View full-size slide

  214. Git n'est pas un outil magique
    231 / 235

    View full-size slide

  215. Il est juste « au niveau » de ce qu'on peut attendre d'un système de gestion de
    version de nos jours
    232 / 235

    View full-size slide

  216. Toujours de nouvelles choses à voir et à comprendre
    233 / 235

    View full-size slide

  217. Je m'en sers tous les jours depuis plus de 4 ans et j'apprends encore tous les
    jours !
    234 / 235

    View full-size slide

  218. Alors, vous vous y mettez quand ?
    235 / 235

    View full-size slide