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
  2. Défricher collectivement les arcanes de l'outil pour vous préparer à

    suivre correctement des tutoriels en ligne 3 / 235
  3. 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
  4. 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
  5. 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
  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 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. Révélation : git est une BDD clé-valeur Put -> hash-object

    $ echo "titi toto tutu" | git hash-object -w --stdin 1b7c47f647a48cf4aa80def219d62110aaff6364 23 / 235
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. Tout est SHA-1 Types d'objets Commits $ git log --oneline

    d31e80f Import travail initial 68ba2f1 Initial empty commit 30 / 235
  18. 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 <[email protected]> 1424796124 +0100 committer Bob Maerten <[email protected]> 1424796900 +0100 Import travail initial 31 / 235
  19. 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
  20. 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
  21. 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
  22. Ajouter du contenu (faire un commit) 2 étapes : Sélectionner

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

    le contenu (index ou staging area) Enregistrer un snapshot (commit) 42 / 235
  24. 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
  25. 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
  26. Modifier l'index (staging) git-reset $ git reset $ git status

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

    $ git add otherfile $ git status -s A otherfile ?? file.txt 50 / 235
  29. 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
  30. 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
  31. 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
  32. 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
  33. 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
  34. 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
  35. 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
  36. 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
  37. É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 <[email protected]> 1425551185 +0100 committer Bob Maerten <[email protected]> 1425551185 +0100 Ajout de contenu 60 / 235
  38. É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 <[email protected]> 1425551185 +0100 committer Bob Maerten <[email protected]> 1425551185 +0100 *$ git cat-file -p ac948 100644 blob 28d0af969b32e69a389087d7a267a2ecc05f1350 otherfile 61 / 235
  39. É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 <[email protected]> 1425551185 +0100 committer Bob Maerten <[email protected]> 1425551185 +0100 $ git cat-file -p ac948 100644 blob 28d0af969b32e69a389087d7a267a2ecc05f1350 otherfile *$ git cat-file -p 28d0a coucou 62 / 235
  40. É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
  41. É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
  42. 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 <[email protected]> Date: Wed Feb 25 15:26:18 2015 +0100 Ajout de contenu 65 / 235
  43. Historique des commits git-log $ git log commit 6f63737 Author:

    Bob Maerten <[email protected]> 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 <[email protected]> Date: Tue Feb 24 08:25:48 2015 +0100 Bumped to latest phusion/baseimage commit 379ff91 66 / 235
  44. 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
  45. 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
  46. 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
  47. Concept 2 La relation entre les commits est un graphe

    acyclique orienté (DAG) 76 / 235
  48. 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
  49. 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
  50. Les différentes opérations - commit - merge - rebase -

    squash - cherrypick - revert 86 / 235
  51. Continuer le graphe Commit Le contenu de l'index représente le

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

    noeud récupéré dans l'opération 90 / 235
  53. Annuler un commit revert Les contenus des des working dirs

    de C0 et du dernier commit sont identiques 100 / 235
  54. 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
  55. 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
  56. À 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
  57. 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
  58. 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
  59. 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 <[email protected]> Date: Thu Apr 7 15:13:13 2005 -0700 Initial revision of "git", the information manager from hell 113 / 235
  60. 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
  61. 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
  62. 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
  63. 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
  64. 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
  65. 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
  66. 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
  67. Je peux récupérer du code quand je veux Je dois

    annoncer que des modifications sont disponibles 146 / 235
  68. 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
  69. 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
  70. 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
  71. 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
  72. 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
  73. 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
  74. Différence entre dépôt "classique" et "bare" bare : pas de

    working dir bare : .git à la fin (convention) 158 / 235
  75. 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
  76. 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
  77. Révélation Les remotes sont aussi aussi des branches Donc des

    références (si vous avez suivi) 170 / 235
  78. 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
  79. 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
  80. 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
  81. Tout ce qui provient de origin est préfixé avec un

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

    master. master <-> origin/master 184 / 235
  83. 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
  84. 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
  85. 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
  86. Attention avec la commande pull pull pull = fetch +

    merge Pas toujours l'opération que l'on souhaite effectuer sur le graphe ! 192 / 235
  87. Attention à historique Tout ce qui a été pushé ne

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

    more thing... » dans une société à la pomme 197 / 235
  91. 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
  92. 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
  93. Format de messages de commit $ git status -s A

    file.txt $ git commit 203 / 235
  94. 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
  95. 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
  96. 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
  97. 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
  98. Ignorer des fichiers .gitignore Ignorer des fichiers à ne pas

    versionner ou sensibles (mots de passe) 209 / 235
  99. 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
  100. 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
  101. 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
  102. 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
  103. 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
  104. Formatage de fichiers core.autocrlf Git va convertir les fins de

    lignes en fonction de la valeur 216 / 235
  105. 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
  106. 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
  107. 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
  108. 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
  109. 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
  110. Gestion des espaces blancs core.whitespace Git va détecter et corriger

    les problèmes éventuels d'espaces blancs 223 / 235
  111. 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
  112. 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
  113. 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
  114. 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
  115. Il est juste « au niveau » de ce qu'on

    peut attendre d'un système de gestion de version de nos jours 232 / 235
  116. Je m'en sers tous les jours depuis plus de 4

    ans et j'apprends encore tous les jours ! 234 / 235