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

5e47e75af9d584936f6b4be3520c75d7?s=128

Bob Maerten

March 04, 2015
Tweet

Transcript

  1. Introduction à git Bob Maerten DSIL3 — Université de Lille

    - Mars 2015 https://gitlab.com/bobmaerten/presentation-git 1 / 235
  2. Objectif 2 / 235

  3. Défricher collectivement les arcanes de l'outil pour vous préparer à

    suivre correctement des tutoriels en ligne 3 / 235
  4. Précisions importantes 4 / 235

  5. Cette présentation : n'a pas pas la prétention d'être une

    formation à git ! 5 / 235
  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
  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
  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
  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
  10. Git en une phrase 10 / 235

  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
  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
  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
  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
  15. 2 aspects de Git le frontend (commandes porcelain) le backend

    (commandes plumbing) 15 / 235
  16. La plupart des formations et tutoriaux se concentrent quasi-exclusivement sur

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

    maîtrisez le frontend 17 / 235
  18. Alors explorons le fonctionnement interne de git 18 / 235

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

    235
  20. Git gère des snapshots snapshots Contrairement à SVN qui fonctionne

    en mode delta 20 / 235
  21. 21 / 235

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

  23. Révélation : git est une BDD clé-valeur Put -> hash-object

    $ echo "titi toto tutu" | git hash-object -w --stdin 1b7c47f647a48cf4aa80def219d62110aaff6364 23 / 235
  24. 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
  25. Identification par clé SHA-1 Implémentation simple et efficace Unicité 25

    / 235
  26. 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
  27. 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
  28. 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
  29. 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
  30. Tout est SHA-1 Types d'objets Commits $ git log --oneline

    d31e80f Import travail initial 68ba2f1 Initial empty commit 30 / 235
  31. 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 <bob.maerten@gmail.com> 1424796124 +0100 committer Bob Maerten <bob.maerten@gmail.com> 1424796900 +0100 Import travail initial 31 / 235
  32. 32 / 235

  33. 33 / 235

  34. 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
  35. Aparté Découverte des quelques commandes de base (porcelaine) 35 /

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

    /tmp/mon-premier-depo-git/.git/ 36 / 235
  37. 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
  38. 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
  39. Ajouter du contenu (faire un commit) 39 / 235

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

    / 235
  41. Ajouter du contenu (faire un commit) 2 étapes : Sélectionner

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

    le contenu (index ou staging area) Enregistrer un snapshot (commit) 42 / 235
  43. Ajouter à l'index (staging) git-add 43 / 235

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

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

    $ git status -s ?? file.txt 45 / 235
  46. 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
  47. 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
  48. Modifier l'index (staging) git-reset $ git reset $ git status

    -s ?? file.txt $ rm -f file.txt $ git status -s 48 / 235
  49. 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
  50. Amender l'index (staging) changement d'avis $ echo 'plop' > otherfile

    $ git add otherfile $ git status -s A otherfile ?? file.txt 50 / 235
  51. 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
  52. 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
  53. 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
  54. 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
  55. 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
  56. Enregistrer le snapshot (commit) git-commit 56 / 235

  57. 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
  58. 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
  59. 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
  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 f664ea4 tree ac9486aa02cdd63b67d5b0c0ab863f0b77f5a2af author Bob Maerten <bob.maerten@gmail.com> 1425551185 +0100 committer Bob Maerten <bob.maerten@gmail.com> 1425551185 +0100 Ajout de contenu 60 / 235
  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 .git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 *.git/objects/ac/9486aa02cdd63b67d5b0c0ab863f0b77f $ git cat-file -p f664ea4 *tree ac9486aa02cdd63b67d5b0c0ab863f0b77f5a2af author Bob Maerten <bob.maerten@gmail.com> 1425551185 +0100 committer Bob Maerten <bob.maerten@gmail.com> 1425551185 +0100 *$ git cat-file -p ac948 100644 blob 28d0af969b32e69a389087d7a267a2ecc05f1350 otherfile 61 / 235
  62. É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 <bob.maerten@gmail.com> 1425551185 +0100 committer Bob Maerten <bob.maerten@gmail.com> 1425551185 +0100 $ git cat-file -p ac948 100644 blob 28d0af969b32e69a389087d7a267a2ecc05f1350 otherfile *$ git cat-file -p 28d0a coucou 62 / 235
  63. É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
  64. É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
  65. 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 <bob.maerten@gmail.com> Date: Wed Feb 25 15:26:18 2015 +0100 Ajout de contenu 65 / 235
  66. Historique des commits git-log $ git log commit 6f63737 Author:

    Bob Maerten <bob.maerten@gmail.com> 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 <bob.maerten@gmail.com> Date: Tue Feb 24 08:25:48 2015 +0100 Bumped to latest phusion/baseimage commit 379ff91 66 / 235
  67. 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
  68. Historique des commits Avec d'autres options c'est encore mieux !

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

  70. Historique des commits (outils spécialisés) SourceTree (windows et autres) :

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

    / 235
  72. Résumé des commandes 72 / 235

  73. 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
  74. Questions/Réponses 74 / 235

  75. 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
  76. Concept 2 La relation entre les commits est un graphe

    acyclique orienté (DAG) 76 / 235
  77. Graphe acyclique orienté = Graphe sans boucle boucle 77 /

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

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

  80. Ajouter du contenu dans git = Modifier le graphe 80

    / 235
  81. Modifier le graphe 81 / 235

  82. Modifier le graphe Se placer sur un noeud X 82

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

    le contenu du noeud Y 83 / 235
  84. 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
  85. 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
  86. Les différentes opérations - commit - merge - rebase -

    squash - cherrypick - revert 86 / 235
  87. Opérations par l'exemple 87 / 235

  88. Continuer le graphe Commit 88 / 235

  89. Continuer le graphe Commit Le contenu de l'index représente le

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

    noeud récupéré dans l'opération 90 / 235
  91. Modéliser la fusion Merge 91 / 235

  92. Simplifier le graphe Rebase 92 / 235

  93. Nettoyer le graphe Squash 93 / 235

  94. Copie sans historique Cherrypick 94 / 235

  95. Cherrypick 95 / 235

  96. Cherrypick 96 / 235

  97. Cherrypick 97 / 235

  98. Cherrypick 98 / 235

  99. Annuler un commit revert 99 / 235

  100. Annuler un commit revert Les contenus des des working dirs

    de C0 et du dernier commit sont identiques 100 / 235
  101. 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
  102. 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
  103. À 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
  104. 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
  105. Questions/Réponses 105 / 235

  106. 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
  107. Concept 3 Le contenu est accessible sous forme de référence

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

  109. e83c5163316f89bfbde7d9ab23ca2e25604af290 109 / 235

  110. e83c516 110 / 235

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

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

    112 / 235
  113. 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 <torvalds@ppc970.osdl.org> Date: Thu Apr 7 15:13:13 2005 -0700 Initial revision of "git", the information manager from hell 113 / 235
  114. Revenons aux références 114 / 235

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

  116. 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
  117. 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
  118. 2 types de références 118 / 235

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

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

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

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

  123. Exemple de déplacement automatique la référence master master est déplacée

    par git à chaque commit 123 / 235
  124. 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
  125. Une branche est une référence (déplacée par Git) 125 /

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

    enfants 126 / 235
  127. 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
  128. 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
  129. Alors, faites des branches. Les branches, c'est le bien !

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

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

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

    Les tags sont souvent fixes 132 / 235
  133. Git gère les références avec des espaces de nom espaces

    de nom (namespaces) 133 / 235
  134. Exemples bob/experiment feature/using-cache-before-fetch-db fix/auth/ldap-server 134 / 235

  135. Conventions 135 / 235

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

  137. Conventions master master = branche principale (init) origin origin =

    dépot distant (clone) 137 / 235
  138. 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
  139. 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
  140. Questions/Réponses 140 / 235

  141. Collaboration 141 / 235

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

  143. 2 manières de collaborer 143 / 235

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

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

    235
  146. Je peux récupérer du code quand je veux Je dois

    annoncer que des modifications sont disponibles 146 / 235
  147. 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
  148. 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
  149. La méthode « 1 pour tous, tous pour 1 »

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

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

    clone /tmp/sharedrepo.git 151 / 235
  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 152 / 235
  153. 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
  154. 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
  155. 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
  156. Différence entre dépôt "classique" et "bare" 156 / 235

  157. Différence entre dépôt "classique" et "bare" bare : pas de

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

    working dir bare : .git à la fin (convention) 158 / 235
  159. 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
  160. 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 git@gitlab.univ-lille3.fr: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
  161. La notion de "remote" 161 / 235

  162. 162 / 235

  163. 163 / 235

  164. 164 / 235

  165. 165 / 235

  166. 166 / 235

  167. 167 / 235

  168. 168 / 235

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

    235
  170. Révélation Les remotes sont aussi aussi des branches Donc des

    références (si vous avez suivi) 170 / 235
  171. 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
  172. 172 / 235

  173. 173 / 235

  174. 174 / 235

  175. 175 / 235

  176. 176 / 235

  177. 177 / 235

  178. 178 / 235

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

  180. Configurer une branche "distante" git-remote $ git remote add gespinfo3

    git@gitlab.univ-lille3.fr:ent/gespinfo3.git 180 / 235
  181. Configurer une branche "distante" git-remote $ git remote add gespinfo3

    git@gitlab.univ-lille3.fr:ent/gespinfo3.git $ tail -3 .git/config [remote "gespinfo3"] url = git@gitlab.univ-lille3.fr:ent/gespinfo3.git fetch = +refs/heads/*:refs/remotes/gespinfo3/* 181 / 235
  182. Configurer une branche "distante" git-remote $ git remote add gespinfo3

    git@gitlab.univ-lille3.fr:ent/gespinfo3.git $ tail -3 .git/config [remote "gespinfo3"] url = git@gitlab.univ-lille3.fr:ent/gespinfo3.git fetch = +refs/heads/*:refs/remotes/gespinfo3/* $ git clone git@gitlab.univ-lille3.fr:rmaerten/presentation-git.git $ cd presentation-git $ git remote -v origin git@gitlab.univ-lille3.fr:rmaerten/presentation-git.git (fetch) origin git@gitlab.univ-lille3.fr:rmaerten/presentation-git.git (push) 182 / 235
  183. Tout ce qui provient de origin est préfixé avec un

    espace de nom origin. master -> origin/master test -> origin/test 183 / 235
  184. La branche distante master est liée avec ma ma branche

    master. master <-> origin/master 184 / 235
  185. Récupérér le contenu de la base .git distante git-fetch 185

    / 235
  186. 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
  187. Pousser du contenu git-push 187 / 235

  188. 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 git@gitlab.univ-lille3.fr:ent/gespinfo3.git e3252af..141af1c master -> master 188 / 235
  189. 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 git@gitlab.univ-lille3.fr: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
  190. Attention avec la commande pull pull 190 / 235

  191. Attention avec la commande pull pull pull = fetch +

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

    merge Pas toujours l'opération que l'on souhaite effectuer sur le graphe ! 192 / 235
  193. Attention à historique 193 / 235

  194. Attention à historique Tout ce qui a été pushé ne

    doit plus être modifié localement 194 / 235
  195. 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
  196. 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
  197. Deux ou trois petites choses pour terminer a.k.a. « one

    more thing... » dans une société à la pomme 197 / 235
  198. Ou plutôt pour bien commencer 198 / 235

  199. git-config 199 / 235

  200. git-config Obligatoire pour commiter $ git config --global user.name "Your

    name" $ git config --global user.email "your@email.com" 200 / 235
  201. git-config Obligatoire pour commiter $ git config --global user.name "Your

    name" $ git config --global user.email "your@email.com" Changer l'éditeur par défaut $ git config --global core.editor vim 201 / 235
  202. git-config Obligatoire pour commiter $ git config --global user.name "Your

    name" $ git config --global user.email "your@email.com" Changer l'éditeur par défaut $ git config --global core.editor vim ~/.gitconfig $ git config --list $ cat ~/.gitconfig 202 / 235
  203. Format de messages de commit $ git status -s A

    file.txt $ git commit 203 / 235
  204. 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
  205. 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
  206. 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
  207. 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
  208. Ignorer des fichiers .gitignore 208 / 235

  209. Ignorer des fichiers .gitignore Ignorer des fichiers à ne pas

    versionner ou sensibles (mots de passe) 209 / 235
  210. 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
  211. 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
  212. 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
  213. 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
  214. 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
  215. Formatage de fichiers 215 / 235

  216. Formatage de fichiers core.autocrlf Git va convertir les fins de

    lignes en fonction de la valeur 216 / 235
  217. 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
  218. 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
  219. 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
  220. 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
  221. 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
  222. Gestion des espaces blancs 222 / 235

  223. Gestion des espaces blancs core.whitespace Git va détecter et corriger

    les problèmes éventuels d'espaces blancs 223 / 235
  224. 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
  225. 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
  226. 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
  227. 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
  228. Les Tabs c'est nul de toute manière ! 228 /

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

    229 / 235
  230. Conclusion 230 / 235

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

  232. Il est juste « au niveau » de ce qu'on

    peut attendre d'un système de gestion de version de nos jours 232 / 235
  233. Toujours de nouvelles choses à voir et à comprendre 233

    / 235
  234. Je m'en sers tous les jours depuis plus de 4

    ans et j'apprends encore tous les jours ! 234 / 235
  235. Alors, vous vous y mettez quand ? 235 / 235