progit.fr

download progit.fr

of 266

description

git

Transcript of progit.fr

  • Pro Git

    Scott Chacon*

    2011-07-13

    *Ce chier PDF est la traduction franaise du livre Pro Git. Il est publi sous license Creative CommonsAribution-Non Commercial-Share Alike 3.0. Jespre que vous lapprcierez, quil vous permera dapprendre utiliser Git et que vous aiderez Apress en achetant le livre original sur Amazon : http://tinyurl.com/amazonprogit

  • Table des matires

    1 Dmarrage rapide 11.1 propos de la gestion de version . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

    1.1.1 Les systmes de gestion de version locaux . . . . . . . . . . . . . . . . . . . 11.1.2 Les systmes de gestion de version centraliss . . . . . . . . . . . . . . . . . 21.1.3 Les systmes de gestion de version distribus . . . . . . . . . . . . . . . . . 3

    1.2 Une rapide histoire de Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.3 Rudiments de Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    1.3.1 Des instantans, pas des dirences . . . . . . . . . . . . . . . . . . . . . . . 41.3.2 Presque toutes les oprations sont locales . . . . . . . . . . . . . . . . . . . 51.3.3 Git gre lintgrit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.3.4 Gnralement, Git ne fait quajouter des donnes . . . . . . . . . . . . . . . 61.3.5 Les trois tats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

    1.4 Installation de Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.4.1 Installation depuis les sources . . . . . . . . . . . . . . . . . . . . . . . . . . 81.4.2 Installation sur Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.4.3 Installation sur Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.4.4 Installation sur Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    1.5 Paramtrage la premire utilisation de Git . . . . . . . . . . . . . . . . . . . . . . . 91.5.1 Votre identit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.5.2 Votre diteur de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.5.3 Votre outil de dirences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.5.4 Vrier vos paramtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    1.6 Obtenir de laide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.7 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    2 Les bases de Git 132.1 Dmarrer un dpt Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    2.1.1 Initialisation dun dpt Git dans un rpertoire existant . . . . . . . . . . . 132.1.2 Cloner un dpt existant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    2.2 Enregistrer des modications dans le dpt . . . . . . . . . . . . . . . . . . . . . . . 142.2.1 Vrier ltat des chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.2.2 Placer de nouveaux chiers sous suivi de version . . . . . . . . . . . . . . . 162.2.3 Indexer des chiers modis . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.2.4 Ignorer des chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.2.5 Inspecter les modications indexes et non indexes . . . . . . . . . . . . . 192.2.6 Valider vos modications . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    iii

  • 2.2.7 liminer la phase dindexation . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2.8 Eacer des chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.2.9 Dplacer des chiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

    2.3 Visualiser lhistorique des validations . . . . . . . . . . . . . . . . . . . . . . . . . . 252.3.1 Limiter la longueur de lhistorique . . . . . . . . . . . . . . . . . . . . . . . 292.3.2 Utiliser une interface graphique pour visualiser lhistorique . . . . . . . . . 30

    2.4 Annuler des actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.4.1 Modier le dernier commit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.4.2 Dsindexer un chier dj index . . . . . . . . . . . . . . . . . . . . . . . . 322.4.3 Rinitialiser un chier modi . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    2.5 Travailler avec des dpts distants . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342.5.1 Acher les dpts distants . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342.5.2 Ajouter des dpts distants . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.5.3 Rcuprer et tirer depuis des dpts distants . . . . . . . . . . . . . . . . . . 352.5.4 Pousser son travail sur un dpt distant . . . . . . . . . . . . . . . . . . . . 362.5.5 Inspecter un dpt distant . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362.5.6 Retirer et dplacer des branches distantes . . . . . . . . . . . . . . . . . . . 37

    2.6 Balisage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382.6.1 Lister vos balises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382.6.2 Crer des balises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382.6.3 Les balises annotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392.6.4 Les balises signes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392.6.5 Les balises lgres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402.6.6 Vrier des balises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412.6.7 Baliser aprs coup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412.6.8 Partager les balises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    2.7 Trucs et astuces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432.7.1 Auto-Compltion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432.7.2 Les alias Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    2.8 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    3 Les branes avec Git 473.1 Ce quest une branche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.2 Brancher et fusionner : les bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    3.2.1 Le branchement de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523.2.2 Les bases de la fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.2.3 Conits de fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

    3.3 Gestion de branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593.4 Travailler avec les branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    3.4.1 Branches au long cours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613.4.2 Les branches de sujet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    3.5 Les branches distantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633.5.1 Pousser vers un serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653.5.2 Suivre les branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673.5.3 Eacer des branches distantes . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    3.6 Rebaser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    iv

  • 3.6.1 Les bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683.6.2 Rebasages plus intressants . . . . . . . . . . . . . . . . . . . . . . . . . . . 703.6.3 Les dangers de rebaser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

    3.7 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    4 Git sur le serveur 754.1 Protocoles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

    4.1.1 Protocole local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76Avantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76Inconvnients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

    4.1.2 Protocole SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77Avantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77Inconvnients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

    4.1.3 Protocole Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Avantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Inconvnients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

    4.1.4 Protocole HTTP/S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78Avantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79Inconvnients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    4.2 Installation de Git sur un serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804.2.1 Copie du dpt nu sur un serveur . . . . . . . . . . . . . . . . . . . . . . . . 804.2.2 Petites installations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

    Accs SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 814.3 Gnration des clefs publiques SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . 824.4 Mise en place du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 834.5 Accs public . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 854.6 GitWeb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864.7 Gitosis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 884.8 Le daemon Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934.9 Git hberg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

    4.9.1 GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 954.9.2 Cration dun compte utilisateur . . . . . . . . . . . . . . . . . . . . . . . . 954.9.3 Cration dun nouveau dpt . . . . . . . . . . . . . . . . . . . . . . . . . . 964.9.4 Import depuis Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 984.9.5 Ajout des collaborateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 984.9.6 Votre projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 994.9.7 Duplication de projets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1004.9.8 Rsum sur GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

    4.10 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

    5 Git distribu 1035.1 Dveloppements distribus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

    5.1.1 Gestion centralise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1035.1.2 Mode du gestionnaire dintgration . . . . . . . . . . . . . . . . . . . . . . . 1045.1.3 Mode dictateur et ses lieutenants . . . . . . . . . . . . . . . . . . . . . . . . 105

    5.2 Contribution un projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

    v

  • 5.2.1 Guides pour une validation . . . . . . . . . . . . . . . . . . . . . . . . . . . 1065.2.2 Cas dune petite quipe prive . . . . . . . . . . . . . . . . . . . . . . . . . . 1085.2.3 quipe prive importante . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1145.2.4 Petit projet public . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1175.2.5 Grand projet public . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1215.2.6 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    5.3 Maintenance dun projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1245.3.1 Travail dans des branches thmatiques . . . . . . . . . . . . . . . . . . . . . 1245.3.2 Application des patchs partir de-mail . . . . . . . . . . . . . . . . . . . . 125

    Application dun patch avec apply . . . . . . . . . . . . . . . . . . . . . . . 125Application dun patch avec am . . . . . . . . . . . . . . . . . . . . . . . . . 125

    5.3.3 Vrication des branches distantes . . . . . . . . . . . . . . . . . . . . . . . 1285.3.4 Dterminer les modications introduites . . . . . . . . . . . . . . . . . . . . 1295.3.5 Intgration des contributions . . . . . . . . . . . . . . . . . . . . . . . . . . 130

    Modes de fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130Gestions avec nombreuses fusions . . . . . . . . . . . . . . . . . . . . . . . 131Gestion par rebasage et slection de commit . . . . . . . . . . . . . . . . . . 133

    5.3.6 Balisage de vos publications . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355.3.7 Gnration dun nom de rvision . . . . . . . . . . . . . . . . . . . . . . . . 1365.3.8 Prparation dune publication . . . . . . . . . . . . . . . . . . . . . . . . . . 1365.3.9 Shortlog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

    5.4 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

    6 Utilitaires Git 1396.1 Slection des versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

    6.1.1 Rvisions ponctuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396.1.2 Empreinte SHA courte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1396.1.3 QUELQUES MOTS SUR SHA-1 . . . . . . . . . . . . . . . . . . . . . . . . . 1406.1.4 Rfrences de branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1416.1.5 Raccourcis RefLog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1416.1.6 Rfrences passes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1426.1.7 Plages de commits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

    Double point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144Emplacements multiples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145Triple point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

    6.2 Mise en aente interactive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1466.2.1 Mere en aente des chiers . . . . . . . . . . . . . . . . . . . . . . . . . . 1476.2.2 Patches de Staging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

    6.3 La remise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1506.3.1 Remiser votre travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1516.3.2 Crer une branche depuis une remise . . . . . . . . . . . . . . . . . . . . . . 153

    6.4 Rcrire lhistorique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1536.4.1 Modier la dernire consignation . . . . . . . . . . . . . . . . . . . . . . . . 1546.4.2 Modier plusieurs messages de consignation . . . . . . . . . . . . . . . . . . 1546.4.3 Rordonner les commits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1566.4.4 Rassembler des commits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

    vi

  • 6.4.5 Diviser un commit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1586.4.6 Loption nuclaire : lter-branch . . . . . . . . . . . . . . . . . . . . . . . . 159

    Supprimer un chier de chaque commit . . . . . . . . . . . . . . . . . . . . 159Faire dun sous-rpertoire la nouvelle racine . . . . . . . . . . . . . . . . . . 159Modier globalement ladresse mail . . . . . . . . . . . . . . . . . . . . . . . 160

    6.5 Deboguer avec Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1606.5.1 Fichier annot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1606.5.2 La recherche dichotomique . . . . . . . . . . . . . . . . . . . . . . . . . . . 161

    6.6 Sous-modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1636.6.1 Dmarrer un sous-module . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1646.6.2 Cloner un projet avec des sous-modules . . . . . . . . . . . . . . . . . . . . 1666.6.3 Superprojects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1686.6.4 Les problmes avec les sous-modules . . . . . . . . . . . . . . . . . . . . . . 168

    6.7 Fusion de sous-arborescence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1706.8 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

    7 Personnalisation de Git 1737.1 Conguration de Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

    7.1.1 Conguration de base dun client . . . . . . . . . . . . . . . . . . . . . . . . 174core.editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174commit.template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174core.pager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175user.signingkey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175core.excludesle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176help.autocorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

    7.1.2 Couleurs dans Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176color.ui . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176color.* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

    7.1.3 Outils externes de fusion et de dirence . . . . . . . . . . . . . . . . . . . . 1777.1.4 Formatage and espaces blancs . . . . . . . . . . . . . . . . . . . . . . . . . . 180

    core.autocrlf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180core.whitespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

    7.1.5 Conguration du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182receive.fsckObjects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182receive.denyNonFastForwards . . . . . . . . . . . . . . . . . . . . . . . . . . 182receive.denyDeletes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

    7.2 Aributs Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1837.2.1 Fichiers binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

    Identication des chiers binaires . . . . . . . . . . . . . . . . . . . . . . . . 183Comparaison de chiers binaires . . . . . . . . . . . . . . . . . . . . . . . . 184

    7.2.2 Expansion des mots-cls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1867.2.3 Export dun dpt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

    export-ignore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188export-subst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

    7.2.4 Stratgies de fusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1897.3 Crochets Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

    vii

  • 7.3.1 Installation dun crochet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1907.3.2 Crochets ct client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

    Crochets de traitement de validation . . . . . . . . . . . . . . . . . . . . . . 190Crochets de gestion e-mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191Autres crochets ct client . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

    7.3.3 Crochets ct serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192pre-receive et post-receive . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

    7.4 Exemple de politique gre par Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1937.4.1 Crochets ct serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

    Application dune politique de format du message de validation . . . . . . . 193Mise en place dun systme dACL par utilisateur . . . . . . . . . . . . . . . 195Application des pousses en avance rapide . . . . . . . . . . . . . . . . . . . 197

    7.4.2 Crochets ct client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1997.5 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

    8 Git et les autres systmes 2038.1 Git et Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

    8.1.1 git svn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2038.1.2 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2048.1.3 Dmarrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2058.1.4 Valider en retour sur le serveur Subversion . . . . . . . . . . . . . . . . . . 2068.1.5 Tirer des modications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2078.1.6 Le problme avec les branches Git . . . . . . . . . . . . . . . . . . . . . . . 2098.1.7 Les embranchements dans Subversion . . . . . . . . . . . . . . . . . . . . . 210

    Crer une nouvelle branche SVN . . . . . . . . . . . . . . . . . . . . . . . . 2108.1.8 Basculer de branche active . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2108.1.9 Les commandes Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

    Lhistorique dans le style Subversion . . . . . . . . . . . . . . . . . . . . . . 211Les annotations SVN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212Linformation sur la serveur SVN . . . . . . . . . . . . . . . . . . . . . . . . 212Ignorer ce que Subversion ignore . . . . . . . . . . . . . . . . . . . . . . . . 213

    8.1.10 Rsum sur Git-Svn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2138.2 Migrer sur Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214

    8.2.1 Importer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2148.2.2 Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2148.2.3 Perforce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2168.2.4 Un outil dimport personnalis . . . . . . . . . . . . . . . . . . . . . . . . . 218

    8.3 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

    9 Les trippes de Git 2259.1 Plomberie et porcelaine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2259.2 Les objets Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

    9.2.1 Objets Arbre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2289.2.2 Objets Commit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2319.2.3 Stockage des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

    viii

  • 9.3 Rfrences Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2359.3.1 La branche HEAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2369.3.2 tiquees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2379.3.3 Rfrences distantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

    9.4 Fichiers groups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2399.5 Les rfrences spciques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

    9.5.1 Publier une rfrence spcique . . . . . . . . . . . . . . . . . . . . . . . . . 2449.5.2 Supprimer des rfrences . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

    9.6 Protocoles de transfert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2449.6.1 Le protocole stupide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2459.6.2 Le Protocole Intelligent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

    Tlverser des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247Tlcharger des Donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

    9.7 Maintenance et Rcupration de Donnes . . . . . . . . . . . . . . . . . . . . . . . . 2499.7.1 Maintenance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2499.7.2 Rcupration de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2509.7.3 Supprimer des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

    9.8 Rsum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

    ix

  • Chapitre 1

    Dmarrage rapide

    Ce chapitre traite du dmarrage rapide avec Git. Nous commencerons par expliquer les basesde la gestion de version, puis nous parlerons de linstallation de Git sur votre systme et nalementcomment le paramtrer pour commencer lutiliser. la n de ce chapitre vous devriez en savoirassez pour comprendre pourquoi on parle beaucoup de Git, pourquoi vous devriez lutiliser et vousdevriez en avoir une installation prte lemploi.

    1.1 propos de la gestion de versionest-ce que la gestion de version et pourquoi devriez-vous vous en soucier ? Un gestionnaire

    de version est un systme qui enregistre lvolution dun chier ou dun ensemble de chiers aucours du temps de manire ce quon puisse rappeler une version antrieure dun chier toutmoment. Dans les exemples de ce livre, nous utiliserons des chiers sources de logiciel commechiers sous gestion de version, bien quen ralit on puisse lutiliser avec pratiquement tous lestypes de chiers dun ordinateur.

    Si vous tes un dessinateur ou un dveloppeur web, et que vous voulez conserver toutes lesversions dune image ou dune mise en page (ce que vous souhaiteriez assurment), un systme degestion de version (VCS en anglais pour Version Control System) est un outil quil est trs sagedutiliser. Il vous permet de ramener un chier un tat prcdent, ramener le projet complet un tat prcdent, comparer les changements au cours du temps, voir qui a modi quelque chosequi pourrait causer un problme, qui a introduit un problme et quand, et plus encore. Utiliser unVCS signie aussi gnralement que si vous vous trompez ou que vous perdez des chiers, vouspouvez facilement revenir un tat stable. De plus, vous obtenez tous ces avantages avec une faiblesurcharge de travail.

    1.1.1 Les systmes de gestion de version locauxLa mthode commune pour la gestion de version est gnralement de recopier les chiers dans

    un autre rpertoire (peut-tre avec un nom incluant la date dans le meilleur des cas). Cee mthodeest la plus commune parce que cest la plus simple, mais cest aussi la moins able. Il est faciledoublier le rpertoire dans lequel vous tes et dcrire accidentellement dans le mauvais chier oudcraser des chiers que vous vouliez conserver.

    Pour traiter ce problme, les programmeurs ont dvelopp il y a longtemps des VCSs locauxqui utilisaient une base de donnes simple pour conserver les modications dun chier (voir gure

    1

  • Chapitre 1 Dmarrage rapide Sco Chacon Pro Git

    1-1).

    Figure 1.1: Diagramme des systmes de gestion de version locaux.

    Un des systmes les plus populaires tait RCS, qui est encore distribu avec de nombreux sys-tmes dexploitation aujourdhui. Mme le systme dexploitation populaire Mac OS X inclut leprogramme rcs lorsquon installe les outils de dveloppement logiciel. Cet outil fonctionne en con-servant des ensembles de patch (cest--dire la dirence entre les chiers) dune version lautredans un format spcial sur disque ; il peut alors restituer ltat de nimporte quel chier nimportequel instant en ajoutant toutes les dirences.

    1.1.2 Les systmes de gestion de version centralissLe problme majeur que les gens rencontrent est quils ont besoin de collaborer avec des

    dveloppeurs sur dautres ordinateurs. Pour traiter ce problme, les systmes de gestion de ver-sion centraliss (CVCS en anglais pour Centralized Version Control Systems) furent dvelopps. Cessystmes tels que CVS, Subversion, et Perforce, meent en place un serveur central qui contienttous les chiers sous gestion de version, et des clients qui peuvent extraire les chiers de ce dptcentral. Pendant de nombreuses annes, cela a t le standard pour la gestion de version (voir gure1-2).

    Figure 1.2: Diagramme de la gestion de version centralise.

    Ce schma ore de nombreux avantages par rapport la gestion de version locale. Par exemple,

    2

  • Sco Chacon Pro Git Section 1.1 propos de la gestion de version

    chacun sait jusqu un certain point ce que tout les autres sont en train de faire sur le projet. Lesadministrateurs ont un contrle n des permissions et il est beaucoup plus facile dadministrer unCVCS que de grer des bases de donnes locales.

    Cependant ce systme a aussi de nombreux dfauts. Le plus visible est le point unique de panneque le serveur centralis reprsente. Si ce serveur est en panne pendant une heure, alors durantcee heure, aucun client ne peut collaborer ou enregistrer les modications issues de son travail.Si le disque dur du serveur central se corrompt, et sil ny a pas eu de sauvegarde, vous perdezabsolument tout de lhistorique dun projet en dehors des sauvegardes locales que les gens auraientpu raliser sur leur machines locales. Les systmes de gestion de version locaux sourent du mmeproblme - ds quon a tout lhistorique dun projet sauvegard un endroit unique, on prend lerisque de tout perdre.

    1.1.3 Les systmes de gestion de version distribusCest ce moment que les systmes de gestion de version distribus entrent en jeu (DVCSs en

    anglais pour Distributed Version Control Systems). Dans un DVCS (tel que Git, Mercurial, Bazaar orDarcs), les clients nextraient plus seulement la dernire version dun chier, mais ils dupliquentcompltement le dpt. Ainsi, si le serveur disparat, et si les systmes collaboraient via ce serveur,nimporte quel dpt dun des clients peut tre copi sur le serveur pour le restaurer. Chaque ex-traction devient une sauvegarde complte de toutes les donnes (voir gure 1-3).

    Figure 1.3: Diagramme de gestion de version de contrle centralise.

    De plus, un grand nombre de ces systmes gre particulirement bien le fait davoir plusieursdpts avec lesquels travailler, vous permeant de collaborer avec dirents groupes de personnesde manire direntes simultanment dans le mme projet. Cela permet la mise en place de dif-frentes chanes de traitement qui ne sont pas ralisables avec les systmes centraliss, tels que lesmodles hirarchiques.

    3

  • Chapitre 1 Dmarrage rapide Sco Chacon Pro Git

    1.2 Une rapide histoire de GitComme de nombreuses choses extraordinaires de la vie, Git est n avec une dose de destruction

    crative et de controverse houleuse. Le noyau Linux est un projet libre de grande envergure. Pour laplus grande partie de sa vie (1991-2002), les modications taient transmises sous forme de patchs etdarchives de chiers. En 2002, le projet du noyau Linux commena utiliser un DVCS propritaireappel BitKeeper.

    En 2005, les relations entre la communaut dveloppant le noyau linux et la socit en chargedu dveloppement de BitKeeper furent rompues, et le statut de gratuit de loutil fut rvoqu. Celapoussa la communaut du dveloppement de Linux (et plus particulirement Linus Torvalds, le cra-teur de Linux) dvelopper leur propre outil en se basant sur les leons apprises lors de lutilisationde BitKeeper. Certains des objectifs du nouveau systme taient les suivants :

    Vitesse

    Conception simple

    Support pour les dveloppements non linaires (milliers de branches parallles)

    Compltement distribu

    Capacit grer ecacement des projets denvergure tels que le noyau Linux (vitesse et com-pacit des donnes)

    Depuis sa naissance en 2005, Git a volu et mri pour tre facile utiliser tout en conservant sesqualits initiales. Il est incroyablement rapide, il est trs ecace pour de grands projets et il a unincroyable systme de branches pour des dveloppements non linaires (voir chapitre 3).

    1.3 Rudiments de GitDonc, quest-ce que Git en quelques mots ? Il est important de bien comprendre cee section,

    parce que si on comprend ce que Git est et les principes sur lesquels il repose, alors utiliser e-cacement Git devient simple. Au cours de lapprentissage de Git, essayez de librer votre esprit dece que vous pourriez connatre dautres VCS, tels que Subversion et Perforce ; ce faisant, vous vousviterez de petites confusions lutilisation de cet outil. Git enregistre et gre linformation trsdiremment des autres systmes, mme si linterface utilisateur parat similaire ; comprendre cesdirences vous vitera des confusions lutilisation.

    1.3.1 Des instantans, pas des direncesLa dirence majeure entre Git et les autres VCS (Subversion et autres) rside dans la manire

    dont Git considre les donnes. Au niveau conceptuel, la plupart des autres VCS grent linformationcomme une liste de modications de chiers. Ces systmes (CVS, Subversion, Perforce, Bazaar etautres) considrent linformation quil grent comme une liste de chiers et les modications eec-tues sur chaque chier dans le temps, comme illustr en gure 1-4.

    Git ne gre pas et ne stocke pas les informations de cee manire. la place, Git pense sesdonnes plus comme un instantan dun mini systme de chiers. A chaque fois que vous commitezou enregistrez ltat du projet dans Git, il prend eectivement un instantan du contenu de votreespace de travail ce moment et enregistre une rfrence cet instantan. Pour tre ecace, si les

    4

  • Sco Chacon Pro Git Section 1.3 Rudiments de Git

    Figure 1.4: Dautres systmes sauvent linformation comme des modications sur des iers.

    chiers nont pas chang, Git ne stocke pas le chier nouveau, juste une rfrence vers le chieroriginal qui na pas t modi. Git pense ses donnes plus la manire de la gure 1-5.

    Figure 1.5: Git stoe les donnes comme des instantans du projet au cours du temps

    Cest une distinction importante entre Git et quasiment tous les autres VCSs. Git a reconsid-r quasiment tous les aspects de la gestion de version que la plupart des autres systme ont copides gnrations prcdentes. Cela fait quasiment de Git un mini systme de chiers avec des outilsincroyablement puissants construits au-dessus, plutt quun simple VCS. Nous explorerons les bn-ces quil y a penser les donnes de cee manire quand nous aborderons la gestion de branchesau chapitre 3.

    1.3.2 Presque toutes les oprations sont localesLa plupart des oprations de Git ne ncessite que des chiers et ressources locales - gnrale-

    ment aucune information venant dun autre ordinateur du rseau nest ncessaire. Si vous teshabitu un CVCS o toutes les oprations sont ralenties par la latence des changes rseau, cet as-pect de Git vous fera penser que les dieux de la vitesse ont octroy leurs pouvoirs Git. Comme vousdisposez de lhistorique complet du projet localement sur votre disque dur, la plupart des oprationssemblent instantanes.

    Par exemple, pour parcourir lhistorique dun projet, Git na pas besoin daller le cherchersur un serveur pour vous lacher ; il na qu simplement le lire directement dans votre base dedonne locale. Cela signie que vous avez quasi-instantanment accs lhistorique du projet. Sivous souhaitez connatre les modications introduites entre la version actuelle dun chier et sontat un mois auparavant, Git peut rechercher ltat du chier un mois auparavant et raliser lecalcul de dirence, au lieu davoir demander cee dirence un serveur ou devoir rcuprerlancienne version sur le serveur pour calculer la dirence localement.

    Cela signie aussi quil y a trs peu de choses que vous ne puissiez raliser si vous ntespas connect ou hors VPN. Si vous voyagez en train ou en avion et voulez avancer votre travail,vous pouvez continuer grer vos versions sans soucis en aendant de pouvoir de nouveau vous

    5

  • Chapitre 1 Dmarrage rapide Sco Chacon Pro Git

    connecter pour partager votre travail. Si vous tes chez vous et ne pouvez avoir une liaison VPNavec votre entreprise, vous pouvez tout de mme travailler. Pour de nombreux autres systmes, fairede mme est impossible ou au mieux trs contraignant. Avec Perforce par exemple, vous ne pouvezpas faire grandchose tant que vous ntes pas connect au serveur. Avec Subversion ou CVS, vouspouvez diter les chiers, mais vous ne pourrez pas soumere des modications votre base dedonnes (car celle-ci est sur le serveur non accessible). Cela peut sembler peu important priori,mais vous seriez tonn de dcouvrir quelle grande dirence cela peut constituer lusage.

    1.3.3 Git gre lintgritDans Git, tout est vri par une somme de contrle avant dtre stock et par la suite cee

    somme de contrle, signature unique, sert de rfrence. Cela signie quil est impossible de modierle contenu dun chier ou dun rpertoire sans que Git ne sen aperoive. Cee fonctionnalit estancre dans les fondations de Git et fait partie intgrante de sa philosophie. Vous ne pouvez pasperdre des donnes en cours de transfert ou corrompre un chier sans que Git ne puisse le dtecter.

    Le mcanisme que Git utilise pour raliser les sommes de contrle est appel une empreinteSHA-1. Cest une chane de caractres compose de 40 caractres hexadcimaux (de 0 9 et dea ) calcule en fonction du contenu du chier ou de la structure du rpertoire considr. Uneempreinte SHA-1 ressemble ceci :

    24b9da6552252987aa493b52f8696cd6d3b00373

    Vous trouverez ces valeurs peu prs partout dans Git car il les utilise pour tout. En fait, Gitstocke tout non pas avec des noms de chier, mais dans la base de donnes Git indexe par cesvaleurs.

    1.3.4 Gnralement, Git ne fait quajouter des donnesand vous ralisez des actions dans Git, la quasi-totalit dentre elles ne font quajouter des

    donnes dans la base de donnes de Git. Il est trs dicile de faire raliser au systme des actionsqui ne soient pas rversibles ou de lui faire eacer des donnes dune quelconque manire. Parcontre, comme dans la plupart des systmes de gestion de version, vous pouvez perdre ou corrompredes modications qui nont pas encore t entres en base ; mais ds que vous avez commit uninstantan dans Git, il est trs dicile de le perdre, spcialement si en plus vous synchronisez votrebase de donnes locale avec un dpt distant.

    Cela fait de lusage de Git un vrai plaisir, car on peut exprimenter sans danger de casserdnitivement son projet. Pour une information plus approfondie sur la manire dont Git stockeses donnes et comment rcuprer des donnes qui pourraient sembler perdues, rfrez-vous auchapitre 9 Sous le capot .

    1.3.5 Les trois tatsIci, il faut tre aentif. Il est primordial de se souvenir de ce qui suit si vous souhaitez que

    le reste de votre apprentissage seectue sans dicult. Git gre trois tats dans lequel les chierspeuvent rsider : commit, modi et index. Commit signie que les donnes sont stockes enscurit dans votre base de donnes locale. Modi signie que vous avez modi le chier mais

    6

  • Sco Chacon Pro Git Section 1.4 Installation de Git

    quil na pas encore t commit en base. Index signie que vous avez marqu un chier modidans sa version actuelle pour quil fasse partie du prochain instantan du projet.

    Ceci nous mne aux trois sections principales dun projet Git : le rpertoire Git, le rpertoirede travail et la zone dindex.

    Figure 1.6: Rpertoire de travail, zone dindex et rpertoire Git.

    Le rpertoire Git est lendroit o Git stocke les mta-donnes et la base de donnes des objetsde votre projet. Cest la partie la plus importante de Git, et cest ce qui est copi lorsque vous clonezun dpt depuis un autre ordinateur.

    Le rpertoire de travail est une extraction unique dune version du projet. Ces chiers sontextraits depuis la base de donnes compresse dans le rpertoire Git et placs sur le disque pourpouvoir tre utiliss ou modis.

    La zone dindex est un simple chier, gnralement situ dans le rpertoire Git, qui stocke lesinformations concernant ce qui fera partie du prochain instantan.

    Lutilisation standard de Git se passe comme suit :1. Vous modiez des chiers dans votre rpertoire de travail2. Vous indexez les chiers modis, ce qui ajoute des instantans de ces chiers dans la zone

    dindex3. Vous ralisez un commit, ce qui a pour eet de basculer les instantans des chiers de lindex

    dans la base de donne du rpertoire Git.Si une version particulire dun chier est dans le rpertoire Git, il est considr comme commit.Sil est modi mais a t ajout dans la zone dindex, il est index. Sil a t modi depuis le dernierinstantan mais na pas t index, il est modi. Dans le chapitre 2, vous en apprendrez plus surces tats et comment vous pouvez en tirer parti ou compltement les occulter.

    1.4 Installation de GitCommenons donc utiliser Git. La premire chose faire est de linstaller. Vous pouvez

    lobtenir par de nombreuses manires ; les deux principales sont de linstaller partir des sources

    7

  • Chapitre 1 Dmarrage rapide Sco Chacon Pro Git

    ou dinstaller un paquet existant sur votre plate-forme.

    1.4.1 Installation depuis les sourcesSi vous le pouvez, il est gnralement conseill dinstaller Git partir des sources, car vous

    obtiendrez la version la plus rcente. Chaque nouvelle version deGit tend inclure des amliorationsutiles de linterface utilisateur, donc rcuprer la toute dernire version est souvent la meilleureoption si vous savez compiler des logiciels partir des sources. Comme la plupart du temps lesdistributions contiennent des version trs anciennes de logiciels, moins que vous ne travailliezsur une distribution trs rcente ou que vous nutilisiez des backports, une installation partir dessources peut tre le meilleur choix.

    Pour installer Git, vous avez besoin des bibliothques suivantes : curl, zlib, openssl, expat, li-biconv. Par exemple, si vous avez un systme dexploitation qui utilise yum (tel que Fedora) ouapt-get (tel quun systme bas sur Debian), vous pouvez utiliser lune des commandes suivantespour installer les dpendances :

    $ yum install curl-devel expat-devel gettext-devel \

    openssl-devel zlib-devel

    $ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \

    libz-dev libssl-dev

    and vous avez toutes les dpendances ncessaires, vous pouvez poursuivre et tlcharger ladernire version de Git depuis le site :

    http://git-scm.com/download

    Puis, compiler et installer :

    $ tar -zxf git-1.6.0.5.tar.gz

    $ cd git-1.6.0.5

    $ make prefix=/usr/local all

    $ sudo make prefix=/usr/local install

    Aprs ceci, vous pouvez obtenir Git par Git lui-mme pour les mises jour :

    $ git clone git://git.kernel.org/pub/scm/git/git.git

    1.4.2 Installation sur LinuxSi vous souhaitez installer Git sur Linux via un installateur dapplication, vous pouvez gnrale-

    ment le faire via le systme de gestion de paquet de base fourni avec votre distribution. Si vous tessur Fedora, vous pouvez utiliser yum :

    $ yum install git-core

    8

  • Sco Chacon Pro Git Section 1.5 Paramtrage la premire utilisation de Git

    Si vous tes sur un systme bas sur Debian, tel quUbuntu, essayez apt-get :

    $ apt-get install git-core

    1.4.3 Installation sur MacIl y a deux moyens simples dinstaller Git sur Mac. Le plus simple et dutiliser linstallateur

    graphique de Git que vous pouvez tlcharger depuis les pages Google Code (voir gure 1-7) :http://code.google.com/p/git-osx-installer

    Figure 1.7: Installateur OS X de Git.

    Lautre mthode consiste installer Git par les MacPorts (http://www.macports.org).Si vous avez install MacPorts, installez Git par :

    $ sudo port install git-core +svn +doc +bash_completion +gitweb

    Vous navez pas ajouter tous les extras, mais vous souhaiterez srement inclure +svn si voustes amen utiliser Git avec des dpts Subversion (voir chapitre 8).

    1.4.4 Installation sur WindowsInstaller Git surWindows est trs facile. Le projetmsysGit fournit une des procdures dinstallation

    les plus simples. Tlchargez simplement le chier exe dinstallateur depuis la page Google Code,et lancez-le :

    http://code.google.com/p/msysgit

    Aprs son installation, vous avez la fois la version en ligne de commande (avec un client SSHutile pour la suite) ou linterface graphique standard.

    1.5 Paramtrage la premire utilisation de GitMaintenant que vous avez install Git sur votre systme, vous voudrez personnaliser votre en-

    vironnement Git. Vous ne devriez avoir raliser ces rglages quune seule fois ; ils persisteront lors

    9

  • Chapitre 1 Dmarrage rapide Sco Chacon Pro Git

    des mises jour. Vous pouvez aussi les changer tout instant en relanant les mmes commandes.Git contient un outil appel git cong pour vous permere de voir et modier les variables

    de conguration qui contrlent tous les aspects de lapparence et du comportement de Git. Cesvariables peuvent tre stockes dans trois endroits dirents :

    Fichier /etc/gitconfig : Contient les valeurs pour tous les utilisateurs et tous les dptsdu systme. Si vous passez loption --system git config, il lit et crit ce chier sp-ciquement.

    Fichier ~/.gitconfig : Spcique votre utilisateur. Vous pouvez forcer Git lire et crirece chier en passant loption --global.

    Fichierconfig dans le rpertoire Git (cest dire.git/config) du dpt en cours dutilisation :spcique au seul dpt en cours. Chaque niveau surcharge le niveau prcdent, donc lesvaleurs dans .git/config surchargent celles de /etc/gitconfig.

    Sur les systmes Windows, Git recherche le chier .gitconfig dans le rpertoire $HOME (C:\Documents and Settings\$USER la plupart du temps). Il recherche tout de mme /etc/gitconfig, bien quil soit relatif la racine MSys, qui se trouve o vous aurez dcid dinstallerGit sur votre systme Windows.

    1.5.1 Votre identitLa premire chose faire aprs linstallation de Git est de renseigner votre nom et votre adresse

    e-mail. Cest important car tous les commits Git utilisent cee information et elle est indlbile danstous les commits que vous pourrez manipuler :

    $ git config --global user.name "John Doe"

    $ git config --global user.email [email protected]

    Encore une fois, cee tape nest ncessaire quune fois si vous passez loption --global,parce que Git utilisera toujours cee information pour tout ce que votre utilisateur fera sur cesystme. Si vous souhaitez surcharger ces valeurs avec un nom ou une adresse e-mail direntspour un projet spcique, vous pouvez lancer ces commandes sans option --global lorsque voustes dans ce projet.

    1.5.2 Votre diteur de texte prsent que votre identit est renseigne, vous pouvez congurer lditeur de texte qui sera

    utilis quand Git vous demande de saisir un message. Par dfaut, Git utilise lditeur congurau niveau systme, qui est gnralement Vi ou Vim. Si vous souhaitez utiliser un diteur de textedirent, comme Emacs, vous pouvez entrer ce qui suit :

    $ git config --global core.editor emacs

    10

  • Sco Chacon Pro Git Section 1.6 Obtenir de laide

    1.5.3 Votre outil de direncesUne autre option utile est le paramtrage de loutil de dirences utiliser pour la rsolution

    des conits de fusion. Supposons que vous souhaitiez utiliser vimdi :

    $ git config --global merge.tool vimdiff

    Git accepte kdi3, tkdi, meld, xxdi, emerge, vimdi, gvimdi, ecmerge, et opendi commeoutils valides de fusion. Vous pouvez aussi paramtrer un outil personnalis ; rfrez-vous au chapitre7 pour plus dinformation sur cee procdure.

    1.5.4 Vrier vos paramtresSi vous souhaitez vrier vos rglages, vous pouvez utiliser la commande git config --

    list pour lister tous les rglages que Git a pu trouver jusquici :

    $ git config --list

    user.name=Scott Chacon

    [email protected]

    color.status=auto

    color.branch=auto

    color.interactive=auto

    color.diff=auto

    ...

    Vous pourrez voir certains paramtres apparatre plusieurs fois, car Git lit lesmmes paramtresdepuis plusieurs chiers (/etc/gitconfig et ~/.gitconfig, par exemple). Git utilise ladernire valeur pour chaque paramtre.

    Vous pouvez aussi vrier la valeur eective dun paramtre particulier en tapant git con-fig :

    $ git config user.name

    Scott Chacon

    1.6 Obtenir de laideSi vous avez besoin daide pour utiliser Git, il y a trois moyens dobtenir les pages de manuel

    pour toutes les commandes de Git :

    $ git help

    $ git --help

    $ man git-

    Par exemple, vous pouvez obtenir la page de manuel pour la commande cong en lanant :

    11

  • Chapitre 1 Dmarrage rapide Sco Chacon Pro Git

    $ git help config

    Ces commandes sont vraiment sympathiques car vous pouvez y accder depuis partout, y com-pris hors connexion. Si les pages de manuel et ce livre ne sont pas susants, vous pouvez essayerles canaux #git ou #github sur le serveur IRC Freenode (irc.freenode.net). Ces canaux sontrgulirement peupls de centaines de personnes qui ont une bonne connaissance de Git et sontsouvent prtes aider.

    1.7 RsumVous devriez avoir prsent une comprhension initiale de ce que Git est et en quoi il est dif-

    frent des CVCS que vous pourriez dj avoir utiliss. Vous devriez aussi avoir une version de Git entat de fonctionnement sur votre systme, paramtre avec votre identit. Il est temps dapprendreles bases dutilisation de Git.

    12

  • Chapitre 2

    Les bases de Git

    Si vous ne deviez lire quun chapitre avant de commencer utiliser Git, cest celui-ci. Cechapitre couvre les commandes de base ncessaires pour raliser la vaste majorit des activitsavec Git. la n de ce chapitre, vous devriez tre capable de congurer et initialiser un dpt, com-mencer et arrter le suivi de version de chiers, dindexer et valider des modications. Nous vousmontrerons aussi comment paramtrer Git pour quil ignore certains chiers ou patrons de chiers,comment revenir sur les erreurs rapidement et facilement, comment parcourir lhistorique de votreprojet et voir les modications entre deux validations, et comment pousser et tirer les modicationsavec des dpts distants.

    2.1 Dmarrer un dpt GitVous pouvez principalement dmarrer un dpt Git de deux manires. La premire consiste

    prendre un projet ou un rpertoire existant et limporter dans Git. La seconde consiste cloner undpt Git existant sur un autre serveur.

    2.1.1 Initialisation dun dpt Git dans un rpertoire existantSi vous commencer suivre un projet existant dans Git, vous navez qu vous positionner dans

    le rpertoire du projet et saisir

    $ git init

    Cela cre un nouveau sous-rpertoire nomm .git qui contient tous les chiers ncessaire audpt un squelee de dpt Git. Pour linstant, rien nest encore suivi en version. (Cf. chapitre 9pour plus dinformation sur les chiers contenus dans le rpertoire .git que vous venez de crer.)

    Si vous souhaitez commencer suivre en version des chiers existants (contrairement unrpertoire vide), vous devriez probablement commencer par indexer ces chiers et faire une valida-tion initiale. Vous pouvez raliser ceci avec une poigne de commandes Git qui spcient les chiersque vous souhaitez suivre, suivi dun commit :

    13

  • Chapitre 2 Les bases de Git Sco Chacon Pro Git

    $ git add *.c

    $ git add README

    $ git commit m 'version initiale du projet'

    Nous allons passer en revue ce que ces commandes font dans une petite minute. Pour linstant,vous avez un dpt git avec des chiers sous gestion de version et un commit initial.

    2.1.2 Cloner un dpt existantSi vous souhaitez obtenir une copie dun dpt Git existant par exemple, un projet auquel

    vous aimeriez contribuer la commande dont vous avez besoin sappelle git clone. Si voustes familier avec dautres systmes de gestion de version tels que Subversion, vous noterez que lacommande est clone et non checkout. Cest une distinction importante Git reoit une copie dequasiment toutes les donnes dont le serveur dispose. Toutes les versions de tous les chiers pourlhistorique du projet sont tlcharges quand vous lancez git clone. En fait, si le disque duserveur se corrompt, vous pouvez utiliser nimporte quel clone pour remere le serveur dans ltato il tait au moment du clonage (vous pourriez perdre quelques paramtres du serveur, mais toutesles donnes sous gestion de version serait rcupres Cf. chapitre 4 pour de plus amples dtails).

    Vous clonez un dpt avec git clone [url]. Par exemple, si vous voulez cloner la biblio-thque Git Ruby appele Grit, vous pouvez le faire de manire suivante :

    $ git clone git://github.com/schacon/grit.git

    Ceci cre un rpertoire nomm grit , initialise un rpertoire .git lintrieur, rcupretoutes les donnes de ce dpt, et extrait une copie de travail de la dernire version. Si vous examinezle nouveau rpertoire grit, vous y verrez les chiers du projet, prt tre modis ou utiliss. Sivous souhaitez cloner le dpt dans un rpertoire nomm diremment, vous pouvez spcier lenom dans une option supplmentaire de la ligne de commande :

    $ git clone git://github.com/schacon/grit.git mygrit

    Cee commande ralise la mme chose que la prcdente, mais le rpertoire cible sappellemygrit.

    Git dispose de dirents protocoles de transfert que vous pouvez utiliser. Lexemple prcdentutilise le protocolegit://, mais vous pouvez aussi voirhttp(s):// ouutilisateur@serveur:/chemin.git, qui utilise le protocole de transfert SSH. Le chapitre 4 introduit toutes les optionsdisponibles pour mere en place un serveur Git, ainsi que leurs avantages et inconvnients.

    2.2 Enregistrer des modications dans le dptVous avez prsent un dpt Git valide et une extraction ou copie de travail du projet. Vous

    devez faire quelques modications et valider des instantans de ces modications dans votre dptchaque fois que votre projet aeint un tat que vous souhaitez enregistrer.

    14

  • Sco Chacon Pro Git Section 2.2 Enregistrer des modications dans le dpt

    Souvenez-vous que chaque chier de votre copie de travail peut avoir deux tats : sous suivi deversion ou non suivi. Les chiers suivis sont les chiers qui appartenait dj au dernier instantan ;ils peuvent tre inchangs, modis ou indexs. Tous les autres chiers sont non suivis tout chierde votre copie de travail qui nappartenait pas votre dernier instantan et na pas t index.andvous clonez un dpt pour la premire fois, tous les chiers seront sous suivi de version et inchangscar vous venez tout juste de les enregistrer sans les avoir encore dits.

    Au fur et mesure que vous ditez des chiers, Git les considre comme modis, car vous lesavez modis depuis le dernier instantan. Vous indexez ces chiers modis et vous enregistreztoutes les modications indexes, puis ce cycle se rpte. Ce cycle de vie est illustr par la gure2-1.

    Figure 2.1: Le cycle de vie des tats des iers.

    2.2.1 Vrier ltat des iersLoutil principal pour dterminer quels chiers sont dans quel tat est la commandegit sta-

    tus. Si vous lancez cee commande juste aprs un clonage, vous devriez voir ce qui suit :

    $ git status

    # On branch master

    nothing to commit (working directory clean)

    Ce message signie que votre copie de travail est propre, en dautres mots, aucun chier suivina t modi. Git ne voit pas non plus de chiers non-suivis, sinon ils seraient lists ici. Enn,la commande vous indique sur quelle branche vous tes. Pour linstant, cest toujours master, quicorrespond la valeur par dfaut ; nous ne nous en soucierons pas maintenant. Dans le chapitresuivant, nous parlerons plus en dtail des branches et des rfrences.

    Supposons que vous ajoutiez un nouveau chier votre projet, un simple chier LISEZMOI.Si ce chier nexistait pas auparavant, et que vous lancez la commande git status, vous verrezvotre chier non suivi comme ceci :

    $ vim LISEZMOI

    $ git status

    # On branch master

    15

  • Chapitre 2 Les bases de Git Sco Chacon Pro Git

    # Untracked files:

    # (use "git add ..." to include in what will be committed)

    #

    # LISEZMOI

    nothing added to commit but untracked files present (use "git add" to track)

    Vous pouvez constater que votre nouveau chier LISEZMOI nest pas en suivi de version, caril apparat dans la section Untracked les de ltat de la copie de travail. Untracked signiesimplement que Git dtecte un chier qui ntait pas prsent dans le dernier instantan ; Git ne leplacera sous suivi en version que quand vous lui indiquerez de le faire. Ce comportement permet dene pas placer accidentellement sous suivi de version des chiers binaires gnrs ou dautres chiersque vous ne voulez pas inclure. Mais vous voulez inclure le chier LISEZMOI dans linstantan, alorscommenons suivre ce chier.

    2.2.2 Placer de nouveaux iers sous suivi de versionPour commencer suivre un nouveau chier, vous utilisez la commande git add. Pour

    commencer suivre le chier LISEZMOI, vous pouvez entrer ceci :

    $ git add LISEZMOI

    Si vous lancez nouveau le commande status, vous pouvez constater que votre chier LISEZ-MOI est maintenant suivi et index :

    $ git status

    # On branch master

    # Changes to be committed:

    # (use "git reset HEAD ..." to unstage)

    #

    # new file: LISEZMOI

    #

    Vous pouvez armer quil est index car il apparat dans la section Changes to be commied (Modications enregistrer).Si vous enregistrez cemoment, la version du chier linstant o vouslancez git add est celle qui appartiendra linstantan. Vous pouvez vous souvenir que lorsquevous avez prcdemment lanc git init, vous avez ensuite lanc git add (fichiers) ctait bien sur pour commencer placer sous suivi de version les chiers de votre rpertoire detravail. La commande git add accepte en paramtre un chemin qui correspond un chier ou unrpertoire ; dans le cas dun rpertoire, la commande ajoute rcursivement tous les chiers de cerpertoire.

    2.2.3 Indexer des iers modisMaintenant, modions un chiers qui est dj sous suivi de version. Si vous modiez le chier

    sous suivi de version appel benchmarks.rb et que vous lancez nouveau votre commandestatus, vous verrez ceci :

    16

  • Sco Chacon Pro Git Section 2.2 Enregistrer des modications dans le dpt

    $ git status

    # On branch master

    # Changes to be committed:

    # (use "git reset HEAD ..." to unstage)

    #

    # new file: LISEZMOI

    #

    # Changed but not updated:

    # (use "git add ..." to update what will be committed)

    #

    # modified: benchmarks.rb

    #

    Le chier benchmarks.rb apparat sous la section nomme Changed but not updated cequi signie que le chier sous suivi de version a t modi dans la copie de travail mais nestpas encore index. Pour lindexer, il faut lancer la commande git add (qui est une commandemulti-usage elle peut tre utilise pour placer un chier sous suivi de version, pour indexer unchier ou pour dautres actions telles que marquer comme rsolu des conits de fusion de chiers).Lanons maintenant git add pour indexer le chier benchmarks.rb, et relanons la commandegit status :

    $ git add benchmarks.rb

    $ git status

    # On branch master

    # Changes to be committed:

    # (use "git reset HEAD ..." to unstage)

    #

    # new file: LISEZMOI

    # modified: benchmarks.rb

    #

    A prsent, les deux chiers sont indexs et feront partie de la prochaine validation. Mais sup-posons que vous souhaitiez apporter encore une petite modication au chier benchmarks.rb avantde rellement valider la nouvelle version. Vous louvrez nouveau, ralisez la petite modicationet vous voil prt valider. Nanmoins, vous lancez git status une dernire fois :

    $ vim benchmarks.rb

    $ git status

    # On branch master

    # Changes to be committed:

    # (use "git reset HEAD ..." to unstage)

    #

    # new file: LISEZMOI

    # modified: benchmarks.rb

    #

    # Changed but not updated:

    # (use "git add ..." to update what will be committed)

    #

    17

  • Chapitre 2 Les bases de Git Sco Chacon Pro Git

    # modified: benchmarks.rb

    #

    e sest-il donc pass ? prsent, benchmarks.rb apparat la fois comme index et nonindex. En fait, Git indexe un chier dans son tat au moment o la commande git add est lance.Si on valide les modications maintenant, la version de benchmarks.rb qui fera partie de linstantanest celle correspondant au moment o la commande git add benchmarks.rb a t lance, etnon la version actuellement prsente dans la copie de travail au moment o la commande git commitest lance. Si le chier est modi aprs un git add, il faut relancer git add pour prendre encompte ltat actuel dans la copie de travail :

    $ git add benchmarks.rb

    $ git status

    # On branch master

    # Changes to be committed:

    # (use "git reset HEAD ..." to unstage)

    #

    # new file: LISEZMOI

    # modified: benchmarks.rb

    #

    2.2.4 Ignorer des iersIl apparat souvent quun type de chiers prsent dans la copie de travail ne doit pas tre ajout

    automatiquement ou mme apparatre comme chier potentiel pour le suivi de version. Ce sont parexemple des chiers gnrs automatiquement tels que les chiers de journaux ou de sauvegardesproduits par loutil que vous utilisez. Dans un tel cas, on peut numrer les patrons de noms dechiers ignorer dans un chier .gitignore. Voici ci-dessous un exemple de chier .gitignore :

    $ cat .gitignore

    *.[oa]

    *~

    La premire ligne ordonne Git dignorer tout chier se terminant en .o ou .a des chiersobjet ou archive qui sont gnralement produits par la compilation dun programme. La secondeligne indique Git dignorer tous les chiers se terminant par un tilde (~), ce qui est le cas des nomsdes chiers temporaires pour de nombreux diteurs de texte tels quEmacs. On peut aussi inclureun rpertoire log, tmp ou pid, ou le rpertoire de documentation gnre automatiquement, ou toutautre chier. Renseigner un chier .gitignore avant de commencer travailler est gnralement unebonne ide qui vitera de valider par inadvertance des chiers qui ne doivent pas apparatre dansle dpt Git.

    Les rgles de construction des patrons placer dans le chier .gitignore sont les suivantes :

    Les lignes vides ou commenant par # sont ignore

    Les patrons standards de chiers sont utilisables

    18

  • Sco Chacon Pro Git Section 2.2 Enregistrer des modications dans le dpt

    Si le patron se termine par un slash (/), le patron dnote un rpertoire

    Un patron commenant par un point dexclamation (!) est invers.

    Les patrons standards de chiers sont des expressions rgulires simplies utilises par les shells.Un astrisque (*) correspond un ou plusieurs caractres ; [abc] correspond un des trois carac-tres lists dans les crochets, donc a ou b ou c ; un point dinterrogation (?) correspond un uniquecaractre ; des crochets entourant des caractres spars par un signe moins ([0-9]) correspond un caractre dans lintervalle des deux caractres indiqus, donc ici de 0 9.

    Voici un autre exemple de chier .gitignore :

    # un commentaire, cette ligne est ignore

    *.a # pas de fichier .a

    !lib.a # mais suivre en version lib.a malgr la rgle prcdente

    /TODO # ignorer uniquement le fichier TODO la racine du projet

    build/ # ignorer tous le fichiers dans le rpertoire build

    doc/*.txt # ignorer doc/notes.txt, mais pas doc/server/arch.txt

    2.2.5 Inspecter les modications indexes et non indexesSi le rsultat de la commande git status est encore trop vague lorsquon dsire savoir

    non seulement quels chiers ont chang mais aussi ce qui a chang dans ces chiers on peututiliser la commande git diff. Cee commande sera traite en dtail plus loin ; mais elle seravraisemblablement utilise le plus souvent pour rpondre aux questions suivantes : quest-ce qui at modi mais pas encore index ? elle modications a t indexe et est prte pour la vali-dation ? L o git status rpond de manire gnrale ces questions, git diff montre leslignes exactes qui ont t ajoutes, modies ou eaces le patch en somme.

    Supposons que vous ditez et indexez le chier LISEZMOI et que vous ditez le chier bench-marks.rb sans lindexer. Si vous lancez la commande status, vous verrez ceci :

    $ git status

    # On branch master

    # Changes to be committed:

    # (use "git reset HEAD ..." to unstage)

    #

    # new file: LISEZMOI

    #

    # Changed but not updated:

    # (use "git add ..." to update what will be committed)

    #

    # modified: benchmarks.rb

    #

    Pour visualiser ce qui a t modi mais pas encore index, tapez git diff sans autre argu-ment :

    19

  • Chapitre 2 Les bases de Git Sco Chacon Pro Git

    $ git diff

    diff --git a/benchmarks.rb b/benchmarks.rb

    index 3cb747f..da65585 100644

    --- a/benchmarks.rb

    +++ b/benchmarks.rb

    @@ -36,6 +36,10 @@ def main

    @commit.parents[0].parents[0].parents[0]

    end

    + run_code(x, 'commits 1') do

    + git.commits.size

    + end

    +

    run_code(x, 'commits 2') do

    log = git.commits('master', 15)

    log.size

    Cee commande compare le contenu du rpertoire de travail avec la zone dindex. Le rsultatvous indique les modications ralises mais non indexes.

    Si vous souhaitez visualiser les modications indexes qui feront partie de la prochaine vali-dation, vous pouvez utiliser git diff --cached (avec les versions 1.6.1 et suprieures de Git,vous pouvez aussi utiliser git diff --staged, qui est plus mnmotechnique). Cee commandecompare les chiers indexs et le dernier instantan :

    $ git diff --cached

    diff --git a/LISEZMOI b/LISEZMOI

    new file mode 100644

    index 0000000..03902a1

    --- /dev/null

    +++ b/LISEZMOI2

    @@ -0,0 +1,5 @@

    +grit

    + by Tom Preston-Werner, Chris Wanstrath

    + http://github.com/mojombo/grit

    +

    +Grit is a Ruby library for extracting information from a Git repository

    Il est important de noter que git diff ne montre pas les modications ralises depuis ladernire validation seulement les modications qui sont non indexes. Cela peut introduire uneconfusion car si tous les chiers modis ont t indexs, git diff nindiquera aucun change-ment.

    Par exemple, si vous indexez le chier benchmarks.rb et lditez en suite, vous pouvez utilisergit diff pour visualiser les modications indexes et non indexes de ce chier :

    $ git add benchmarks.rb

    $ echo '# test line' >> benchmarks.rb

    $ git status

    # On branch master

    20

  • Sco Chacon Pro Git Section 2.2 Enregistrer des modications dans le dpt

    #

    # Changes to be committed:

    #

    # modified: benchmarks.rb

    #

    # Changed but not updated:

    #

    # modified: benchmarks.rb

    #

    A prsent, vous pouvez utiliser git diff pour visualiser les modications non indexes :

    $ git diff

    diff --git a/benchmarks.rb b/benchmarks.rb

    index e445e28..86b2f7c 100644

    --- a/benchmarks.rb

    +++ b/benchmarks.rb

    @@ -127,3 +127,4 @@ end

    main()

    ##pp Grit::GitRuby.cache_client.stats

    +# test line

    et git diff --cached pour visualiser ce qui a t index jusqu maintenant :

    $ git diff --cached

    diff --git a/benchmarks.rb b/benchmarks.rb

    index 3cb747f..e445e28 100644

    --- a/benchmarks.rb

    +++ b/benchmarks.rb

    @@ -36,6 +36,10 @@ def main

    @commit.parents[0].parents[0].parents[0]

    end

    + run_code(x, 'commits 1') do

    + git.commits.size

    + end

    +

    run_code(x, 'commits 2') do

    log = git.commits('master', 15)

    log.size

    2.2.6 Valider vos modicationsVotre zone dindex est dans ltat dsir, vous pouvez valider vos modications. Souvenez-vous

    que tout ce qui encore non index tous les chiers qui ont t crs ou modis mais nont passubi de git add depuis ne feront pas partie de la prochaine validation. Ils resteront en tant quechiers modis sur votre disque.

    21

  • Chapitre 2 Les bases de Git Sco Chacon Pro Git

    Dans notre cas, la dernire fois que vous avez lanc git status, vous avez vri que touttait index, et vous tes donc prt valider vos modications. La manire la plus simple de validerest de taper git commit :

    $ git commit

    Cee action lance votre diteur par dfaut (qui est paramtr par la variable denvironnement$EDITOR de votre shell habituellement vim ou Emacs, mais vous pouvez le paramtrer spci-quement pour git en utilisant la commande git config --global core.editor commenous lavons vu au chapitre 1).

    Lditeur ache le texte suivant :

    # Please enter the commit message for your changes. Lines starting

    # with '#' will be ignored, and an empty message aborts the commit.

    # On branch master

    # Changes to be committed:

    # (use "git reset HEAD ..." to unstage)

    #

    # new file: LISEZMOI

    # modified: benchmarks.rb

    ~

    ~

    ~

    ".git/COMMIT_EDITMSG" 10L, 283C

    Vous constatez que le message de validation par dfaut contient une ligne vide suivie en com-mentaire le rsultat de la commande git status. Vous pouvez eacer ces lignes de commentaireet saisir votre propre message de validation, ou vous pouvez les laisser en place vous aider vousrappeler de ce que vous tes en train de valider (pour un rappel plus explicite de ce que vous avezmodi, vous pouvez aussi passer loption -v la commande git commit. Cee option place lersultat du di en commentaire dans lditeur pour vous permere de visualiser exactement ce quevous avez modi).and vous quiez lditeur (aprs avoir sauvegard le message), Git cre votrecommit avec ce message de validation (aprs avoir retir les commentaires et le di).

    Dune autre manire, vous pouvez spcier votre message de validation en ligne avec la com-mande commit en le saisissant aprs loption -m, de cee manire :

    $ git commit -m "Story 182: Fix benchmarks for speed"

    [master]: created 463dc4f: "Fix benchmarks for speed"

    2 files changed, 3 insertions(+), 0 deletions(-)

    create mode 100644 LISEZMOI

    A prsent, vous avez cr votre premier commit ! Vous pouvez constater que le commit vousfournit quelques information sur lui-mme : sur quelle branche vous avez valid (master), quelleest sa somme de contrle SHA-1 (463dc4f), combien de chiers ont t modis, et quelquesstatistiques sur les lignes ajoutes et eaces dans ce commit.

    22

  • Sco Chacon Pro Git Section 2.2 Enregistrer des modications dans le dpt

    Souvenez-vous que la validation enregistre linstantan que vous avez prpar dans la zonedindex. Tout ce que vous navez pas index est toujours en tat modi ; vous pouvez raliser unenouvelle validation pour lajouter lhistorique. A chaque validation, vous enregistrez un instantandu projet en forme de jalon auquel vous pourrez revenir ou comparer votre travail ultrieur.

    2.2.7 liminer la phase dindexationBien quil soit incroyablement utile de pouvoir organiser les commits exactement comme on

    lentend, la gestion de la zone dindex est parfois plus complexe que ncessaire dans une utilisationnormale. Si vous souhaitez viter la phase de placement des chiers dans la zone dindex, Git fournitun raccourcis trs simple. Lajout de loption -a la commande git commit ordonne Git deplacer automatiquement tout chier dj en suivi de version dans la zone dindex avant de raliserla validation, vitant ainsi davoir taper les commandes git add :

    $ git status

    # On branch master

    #

    # Changed but not updated:

    #

    # modified: benchmarks.rb

    #

    $ git commit -a -m 'added new benchmarks'

    [master 83e38c7] added new benchmarks

    1 files changed, 5 insertions(+), 0 deletions(-)

    Notez bien que vous navez pas eu lancer git add sur le chier benchmarks.rb avant devalider.

    2.2.8 Eacer des iersPour eacer un chier de Git, vous devez lliminer des chiers en suivi de version (plus pr-

    cisment, leacer dans la zone dindex) puis valider. La commandegit rm ralise cee actionmaiseace aussi ce chier de votre copie de travail de telle sorte que vous ne le verrez pas rapparatrecomme chier non suivi en version la prochaine validation.

    Si vous eacez simplement le chier dans votre copie de travail, il apparat sous la sectionChanged but not updated (cest--dire, non index) dans le rsultat de git status :

    $ rm grit.gemspec

    $ git status

    # On branch master

    #

    # Changed but not updated:

    # (use "git add/rm ..." to update what will be committed)

    #

    # deleted: grit.gemspec

    #

    Ensuite, si vous lancez git rm, leacement du chier est index :

    23

  • Chapitre 2 Les bases de Git Sco Chacon Pro Git

    $ git rm grit.gemspec

    rm 'grit.gemspec'

    $ git status

    # On branch master

    #

    # Changes to be committed:

    # (use "git reset HEAD ..." to unstage)

    #

    # deleted: grit.gemspec

    #

    Lors de la prochaine validation, le chier sera absent et non-suivi en version. Si vous avezauparavant modi et index le chier, son limination doit tre force avec loption -f. Cest unemesure de scurit pour empcher un eacement accidentel de donnes qui nont pas encore tenregistres dans un instantan et qui seraient dnitivement perdues.

    Un autre scnario serait de vouloir abandonner le suivi de version dun chier tout en le con-servant dans la copie de travail. Ceci est particulirement utile lorsquon a oubli de spcier unpatron dans le chier .gitignore et on a accidentellement ajout un chier dans linstantan, telquun gros chier de journal ou une srie darchives de compilation .a. Pour raliser ce scnario,utilisez loption --cached :

    $ git rm --cached readme.txt

    Vous pouvez spcier des noms de chiers ou de rpertoires, ou des patrons de chiers lacommande git rm. Cela signie que vous pouvez lancer des commandes telles que

    $ git rm log/\*.log

    Notez bien lantislash (\) devant *. Il est ncessaire dchapper le caractre * car Git utilisesa propre expansion de nom de chier en addition de lexpansion du shell. Cee commande eacetous les chiers avec lextension .log prsents dans le rpertoire log/. Vous pouvez aussi lancerune commande telle que :

    $ git rm \*~

    Cee commande limine tous les chiers se terminant par ~.

    2.2.9 Dplacer des iers la dirence des autres VCS, Git ne suit pas explicitement les mouvements des chiers. Si

    vous renommez un chier suivi par Git, aucune mta-donne indiquant le renommage nest stockepar Git. Nanmoins, Git est assez malin pour sen apercevoir aprs coup la dtection de mouve-ment de chier sera traite plus loin.

    24

  • Sco Chacon Pro Git Section 2.3 Visualiser lhistorique des validations

    De ce fait, que Git ait une commande mv peut paratre trompeur. Si vous souhaitez renommerun chier dans Git, vous pouvez lancer quelque chose comme

    $ git mv nom_origine nom_cible

    et cela fonctionne. En fait, si vous lancez quelque chose comme ceci et inspectez le rsultatdune commande status, vous constaterez que Git gre le renommage de chier :

    $ git mv LISEZMOI.txt LISEZMOI

    $ git status

    # On branch master

    # Your branch is ahead of 'origin/master' by 1 commit.

    #

    # Changes to be committed:

    # (use "git reset HEAD ..." to unstage)

    #

    # renamed: LISEZMOI.txt -> LISEZMOI

    #

    Nanmoins, cela revient lancer les commandes suivantes :

    $ mv LISEZMOI.txt LISEZMOI

    $ git rm LISEZMOI.txt

    $ git add LISEZMOI

    Git trouve implicitement que cest un renommage, donc cela importe peu si vous renommezun chier de cee manire ou avec la commande mv. La seule dirence relle est que mv ne faitquune commande taper au lieu de trois cest une commande de convenance. Le point principalest que vous pouvez utiliser nimporte quel outil pour renommer un chier, et traiter les commandesadd/rm plus tard, avant de valider la modication.

    2.3 Visualiser lhistorique des validationsAprs avoir cr plusieurs commits ou si vous avez clon un dpt ayant un historique de

    commits, vous souhaitez probablement revoir le l des vnements. La commande git log estloutil le plus basique et puissant pour cet objet.

    Les exemples qui suivent utilisent un projet trs simple nomm simplegit utilis pour les d-monstrations. Pour rcuprer le projet, lancez

    git clone git://github.com/schacon/simplegit-progit.git

    Lorsque vous lancez git log dans le rpertoire de ce projet, vous devriez obtenir un rsultatqui ressemble ceci :

    25

  • Chapitre 2 Les bases de Git Sco Chacon Pro Git

    $ git log

    commit ca82a6dff817ec66f44342007202690a93763949

    Author: Scott Chacon

    Date: Mon Mar 17 21:52:11 2008 -0700

    changed the version number

    commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7

    Author: Scott Chacon

    Date: Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

    commit a11bef06a3f659402fe7563abf99ad00de2209e6

    Author: Scott Chacon

    Date: Sat Mar 15 10:31:28 2008 -0700

    first commit

    Par dfaut, git log invoqu sans argument numre en ordre chronologique invers lescommits raliss. Cela signie que les commits les plus rcents apparaissent en premier. Commevous le remarquez, cee commande indique chaque commit avec sa somme de contrle SHA-1, lenom et le-mail de lauteur, la date et le message du commit.

    git log dispose dun trs grand nombre doptions permeant de paramtrer exactement ceque lon cherche voir. Nous allons dtailler quelques unes des plus utilises.

    Une des options les plus utiles est -p, qui montre les dirences introduites entre chaque val-idation. Vous pouvez aussi utiliser -2 qui limite la sortie de la commande aux deux entres les plusrcentes :

    $ git log p -2

    commit ca82a6dff817ec66f44342007202690a93763949

    Author: Scott Chacon

    Date: Mon Mar 17 21:52:11 2008 -0700

    changed the version number

    diff --git a/Rakefile b/Rakefile

    index a874b73..8f94139 100644

    --- a/Rakefile

    +++ b/Rakefile

    @@ -5,7 +5,7 @@ require 'rake/gempackagetask'

    spec = Gem::Specification.new do |s|

    - s.version = "0.1.0"

    + s.version = "0.1.1"

    s.author = "Scott Chacon"

    commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7

    Author: Scott Chacon

    Date: Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

    26

  • Sco Chacon Pro Git Section 2.3 Visualiser lhistorique des validations

    diff --git a/lib/simplegit.rb b/lib/simplegit.rb

    index a0a60ae..47c6340 100644

    --- a/lib/simplegit.rb

    +++ b/lib/simplegit.rb

    @@ -18,8 +18,3 @@ class SimpleGit

    end

    end

    -

    -if $0 == __FILE__

    - git = SimpleGit.new

    - puts git.show

    -end

    \ No newline at end of file

    Cee option ache la mme information mais avec un di suivant directement chaque entre.Cest trs utile pour des revues de code ou pour naviguer rapidement travers lhistorique desmodications quun collaborateur a apportes.

    Vous pouvez aussi utiliser une liste doptions de rsum avec git log. Par exemple, si voussouhaitez visualiser des statistiques rsumes pour chaque commit, vous pouvez utiliser loption--stat :

    $ git log --stat

    commit ca82a6dff817ec66f44342007202690a93763949

    Author: Scott Chacon

    Date: Mon Mar 17 21:52:11 2008 -0700

    changed the version number

    Rakefile | 2 +-

    1 files changed, 1 insertions(+), 1 deletions(-)

    commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7

    Author: Scott Chacon

    Date: Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

    lib/simplegit.rb | 5 -----

    1 files changed, 0 insertions(+), 5 deletions(-)

    commit a11bef06a3f659402fe7563abf99ad00de2209e6

    Author: Scott Chacon

    Date: Sat Mar 15 10:31:28 2008 -0700

    first commit

    LISEZMOI | 6 ++++++

    Rakefile | 23 +++++++++++++++++++++++

    lib/simplegit.rb | 25 +++++++++++++++++++++++++

    3 files changed, 54 insertions(+), 0 deletions(-)

    27

  • Chapitre 2 Les bases de Git Sco Chacon Pro Git

    Comme vous pouvez le voir, loption --stat ache sous chaque entre de validation uneliste des chiers modis, combien de chiers ont t changs et combien de lignes ont t ajoutesou retires dans ces chiers. Elle ajoute un rsum des informations en n de sortie. Une autreoption utile est --pretty. Cee option modie le journal vers un format dirent. elquesoptions incluses sont disponibles. Loption oneline ache chaque commit sur une seule ligne,ce qui peut savrer utile lors de la revue dun long journal. De plus, les options short, full etfuller montrent le rsultat peu de choses prs dans le mme format mais avec de plus en plusdinformation :

    $ git log --pretty=oneline

    ca82a6dff817ec66f44342007202690a93763949 changed the version number

    085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test code

    a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

    Loption la plus intressante est format qui permet de dcrire prcisment le format de sortie.Cest spcialement utile pour gnrer des sorties dans un format facile analyser par unemachine lorsquon spcie intgralement et explicitement le format, on sassure quil ne changera pas au grdes mises jour de Git :

    $ git log --pretty=format:"%h %an, %ar : %s"

    ca82a6d Scott Chacon, 11 months ago : changed the version number

    085bb3b Scott Chacon, 11 months ago : removed unnecessary test code

    a11bef0 Scott Chacon, 11 months ago : first commit

    Le tableau 2-1 liste les options de formatage les plus utiles.

    Option Description du formatage

    %H Somme de contrle du commit

    %h Somme de contrle abrge du commit

    %T Somme de contrle de l'arborescence

    %t Somme de contrle abrge de l'arborescence

    %P Sommes de contrle des parents

    %p Sommes de contrle abrges des parents

    %an Nom de l'auteur

    %ae e-mail de l'auteur

    %ad Date de l'auteur (au format de l'option -date=)

    %ar Date relative de l'auteur

    %cn Nom du validateur

    %ce e-mail du validateur

    %cd Date du validateur

    %cr Date relative du validateur

    %s Sujet

    Vous pourriez vous demander quelle est la dirence entre auteur et validateur. Lauteur est lapersonne qui a ralis initialement le travail, alors que le validateur est la personne qui a eective-ment valid ce travail en gestion de version. Donc, si quelquun envoie patch un projet et un desmembres du projet lapplique, les deux personnes reoivent le crdit lcrivain en tant quauteur,

    28

  • Sco Chacon Pro Git Section 2.3 Visualiser lhistorique des validations

    et le membre du projet en tant que validateur. Nous traiterons plus avant de cee distinction auchapitre 5.

    Les options oneline et format sont encore plus utiles avec une autre option log appele --graph. Cee option ajoute un joli graphe en caractres ASCII pour dcrire lhistorique des brancheset fusions, ce que nous pouvons visualiser pour notre copie du dpt de Grit :

    $ git log --pretty=format:"%h %s" --graph

    * 2d3acf9 ignore errors from SIGCHLD on trap

    * 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit

    |\

    | * 420eac9 Added a method for getting the current branch.

    * | 30e367c timeout code and tests

    * | 5a09431 add timeout protection to grit

    * | e1193f8 support for heads with slashes in them

    |/

    * d6016bc require time for xmlschema

    * 11d191e Merge branch 'defunkt' into local

    Les options ci-dessus ne sont que des options simples de format de sortie de git log il yen a de nombreuses autres. Le tableau 2-2 donne une liste des options que nous avons traites ainsique dautres options communment utilises accompagnes de la manire dont elles modient lersultat de la commande log.

    Option Description

    -p Affiche le patch appliqu par chaque commit

    --stat Affiche les statistiques de chaque fichier pour chaque commit

    --shortstat N'affiche que les ligne modifies/insres/effaces de l'option --stat

    --name-only Affiche la liste des fichiers modifis aprs les informations du commit

    --name-status Affiche la liste des fichiers affects accompagns des informations d'ajout/

    modification/suppression

    --abbrev-commit N'affiche que les premiers caractres de la somme de contrle SHA-1

    --relative-date Affiche la date en format relatif (par exemple "2 weeks ago" : il y a deux semaines) au lieu du format de date complet

    --graph Affiche en caractre ASCII le graphe de branches et fusions en vis--

    vis de l'historique

    --pretty=Affiche les commits dans un format alternatif. Les formats incluent oneline, short, full, fuller, et format (o on peut spcifier son propre format)

    2.3.1 Limiter la longueur de lhistoriqueEn complment des options de formatage de sortie, git log est pourvu de certaines options de

    limitation utiles des options qui permeent de restreindre la liste un sous-ensemble de commits.Vous avez dj vu une de ces options loption -2 qui ne montre que le deux derniers commits.En fait, on peut utiliser -, ou n correspond au nombre de commits que lon cherche visualiseren partant des plus rcents. En vrit, il est peu probable que vous utilisiez cee option, parce queGit injecte par dfaut sa sortie dans un outil de pagination qui permet de la visualiser page page.

    Cependant, les options de limitation portant sur le temps, telles que --since (depuis) et --until (jusqu) sont trs utiles. Par exemple, le commande suivante ache la liste des commitsdes deux dernires semaines :

    29

  • Chapitre 2 Les bases de Git Sco Chacon Pro Git

    $ git log --since=2.weeks

    Cee commande fonctionne avec de nombreux formats vous pouvez indiquer une date sp-cique (2008-01-05) ou une date relative au prsent telle que 2 years 1 day 3 minutes ago .

    Vous pouvez aussi restreindre la liste aux commits vriant certains critres de recherche.Loption --author permet de ltrer sur un auteur spcique, et loption --grep permet dechercher des mots cls dans les messages de validation. Notez que si vous cherchez seulementdes commits correspondant simultanment aux deux critres, vous devez ajouter loption --all-match, car par dfaut ces commandes retournent les commits vriant au moins un critre lors derecherche de chanes de caractres.

    La dernire option vraiment utile git log est la spcication dun chemin. Si un rpertoireou un nomde chier est spci, le journal est limit aux commits qui ont introduit desmodicationsaux chiers concerns. Cest toujours la dernire option de la commande, souvent prcde de deuxtirets (--) pour sparer le chemin des options prcdentes.

    Le tableau 2-3 rcapitule les options que nous venons de voir ainsi que quelques autres pourrfrence.

    Option Description

    -(n) N'affiche que les n derniers commits

    --since, --after Limite l'affichage aux commits raliss aprs la date spcifie

    --until, --before Limite l'affichage aux commits raliss avant la date spcifie

    --author Ne montre que les commits dont le champ auteur correspond la chane passe en argument

    --committer Ne montre que les commits dont le champ validateur correspond la chane passe en argument

    Par exemple, si vous souhaitez visualiser quels commits modiant les chiers de test danslhistorique du source de Git ont t valids par Junio Hamano et ntaient pas des fusions durantle mois doctobre 2008, vous pouvez lancer ce qui suit :

    $ git log --pretty="%h %s" --author=gitster --since="2008-10-01" \

    --before="2008-11-01" --no-merges -- t/

    5610e3b Fix testcase failure when extended attribute

    acd3b9e Enhance hold_lock_file_for_{update,append}()

    f563754 demonstrate breakage of detached checkout wi

    d1a43f2 reset --hard/read-tree --reset -u: remove un

    51a94af Fix "checkout --track -b newbranch" on detac

    b0ad11e pull: allow "git pull origin $something:$cur

    A partir des 20 000 commits constituant lhistorique des sources de Git, cee commande extraitles 6 qui correspondent aux critres.

    2.3.2 Utiliser une interface graphique pour visualiser lhistoriqueSi vous prfrez utiliser un outil plus graphique pour visualiser lhistorique dun projet, vous

    pourriez jeter un il un programme distribu avec Git nomm gitk. Gitk est un outil graphique

    30

  • Sco Chacon Pro Git Section 2.4 Annuler des actions

    mimant les fonctionnalits de git log, et il donne accs quasiment toutes les options de ltragede git log. Si vous tap