Utilisation de git

Avant de commencer Plusieurs documents sont à votre dispostion sur la page officielle de GIT :

Découverte

Le but du tp est de se familiariser avec l'outil git. les objectifs sont les suivants :

  • Comprendre le cycle de vie des fichiers dans un dépôt : modification, validation, annulation des changements.
  • Savoir se synchroniser avec un dépôt distant.
  • Savoir manipuler des branches, et les fusionner.
  • Savoir utiliser les hooks de git, pour mettre à jour un site en production.

Créez un répertoire tp_git. Initilisez le dépôt avec

git init

Cette commande crée tout ce dont git a besoin pour gérer le dépôt.

Quels sont les fichiers et/ou répertoires créés par git init ? (ls -al permet de lister aussi les fichiers cachés).
Configuration générale

Adaptez les commandes suivantes pour configurer votre installation de git (en adaptant évidemment les parties en gras):

git config --global user.name "Votre nom"
git config --global user.email login@machine.net
git config --global core.editor vim

L’effet de ces commandes est permanent, vous n’aurez plus besoin de les taper (à moins de travailler sur un compte différent — par exemple chez vous). Enlevez l'option --global pour une configuration par dépôt.

Git gère trois états dans lesquels les fichiers peuvent résider : validé, modifié et indexé.


Le cycle de vie des fichiers est le suivant :


  1. Créez un fichier README, avec le contenu

    tp git 27/09/2017

    Que donne la commande git status ?

  2. indéxez le fichier README

    git add README

    Que donne git status ?

    Remarque : git add est une commande multi-usage — elle peut être utilisée pour placer un fichier sous suivi de version, pour indexer un fichier ou pour d’autres actions telles que marquer comme résolus des conflits de fusion de fichiers.

  3. Pour archiver (valider) les modifications dans votre entrepôt (c’est ce que l’on appelle un commit), utilisez les commandes suivantes :

    git commit -m "Message expliquant la modification"
  4. La commande git add indique les fichiers à prendre en compte pour la prochaine sauvegarde. La commande git commit réalise l’archivage des fichiers sauvegardés dans répertoire de travail vers le dépôt local. L’option -m permet de préciser le message explicatif dans la ligne de commande, au lieu d’ouvrir un éditeur de texte (comportement par défaut). Remarque : un commit sans message n’est jamais valide. A votre avis, pourquoi ? (pensez à ce qui peut arriver sur un gros projet, comme le noyau Linux…)

    On peut combiner les deux (add et commit avec l'option -a au moment du commit).

    Il est recommandé d’utiliser ces deux commandes (git add / commit) très souvent : seules les versions ayant fait l’objet d’un commit sont conservées. On doit toujours faire un commit dans les cas suivants :

    • Après avoir fini et/ou corrigé quelque-chose (une nouvelle page, un paragraphe de texte, une feuille de style, une image de fond etc…)
    • Avant de faire quelque-chose de « risqué » (tout ce qui pourrait « casser » le site
    • Avant de fermer une session ou d’arrêter de travailler sur quelque chose.

    Attention, on ne peut pas faire deux commits d’affilée sans avoir rien modifier entre deux (quelle commande permet de vérifier si c’est le cas ou non ?).
    Si vous avez beaucoup de choses à mettre dans votre message de commit, il aurait probablement fallu en faire un plus tôt.

  5. Ajoutez une ligne au README avec votre nom. Vérifiez avec

    git diff
    
  6. Indéxez le changement. Vérifiez avec

    git diff --staged
    
  7. Validez. Faites afficher les différences avec

    git diff HEAD~1
    

    Faites affichez l'historique des commits avec

    git log

    On peut personnaliser la sortie de cette commande. Par exemple, avec

    git log --graph --pretty=format:'%C(red)%h%Creset -%C(yellow)%d%Creset %s %C(green)(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
    

    Pour ne pas à avoir à retaper tout ça à chaque fois, ajoutez au fichier .git/config, la ligne suivante :

    [alias]
    hist = log --graph --pretty=format:'%C(red)%h%Creset -%C(yellow)%d%Creset %s %C(green)(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
    

    Observez maintenant la commande git hist.

  8. Utilisation du fichier .gitignore

    Certains fichiers n’ont pas leur place dans le dépôt, comme par exemple les fichiers de sauvegarde des éditeurs de texte. Pour éviter que ces fichiers soient considérés comme des fichiers à ajouter par git, on utilise un fichier d’exclusion : .gitignore

    Consultez ce fichier et ajoutez si nécessaire des fichiers à ignorer.

  9. Comment récupérer une version précédente ?
    1. Modifiez le fichier README sans l'indéxer. Que donne git status ? Annulez la modification avec

      git chechkout README
      
      Attention, cela écrase les modifications dans le repertoire de travail.
    2. Modifiez le fichier README en l'indéxant. Annulez en faisant

      git reset HEAD README
      

      Que donne git status ?

    3. Vous avez fait 2 commits. Revenez à la version du premier commit par

      git checkout hash_corresponsant_au_premier_commit ou HEAD^.
      

      Vérifiez le contenu du fichier README.

      Revenez à la branche master

      git checkout master 
      

      Vérifiez le contenu du fichier README.

  10. Vous disposez d'un compte sur la plateforme Gogs (Go Git Service). Ce site permet d'héberger des dépôts git, public et privés.

    1. Générez une clé ssh par

      ssh-keygen -t rsa -C "votre email@mondomaine"
      

      Ajoutez cette clé à votre trousseau github.

    2. Créez sur Gogs un dépôt vide, avec un readme.


    3. Clonez ce dépôt localement :

      git clone gogs@dwarves.iut-fbleau.fr:login/TP_GIT.git
      

      Donnez la commande.

      git remote -v
    4. Ajoutez dans votre entrepôt local le fichier index.html avec votre nom et adresse mail.

      <!DOCTYPE html>
      <html lang="fr">
      <head>
      	<meta charset="UTF-8">
      	<title></title>
      	<link rel="stylesheet" href="./style.css">
      </head>
      <body>
      	<h1>Denis Monnerat</h1>
      	<h2><a href="mailto:monnerat@u-pec.fr">monnerat@u-pec.fr</a></h2>
      </body>
      </html>
      Vérifiez que la syntaxe est correcte sur la validateur du W3C.

      Poussez sur le dépôt Gogs avec

      git push
      
      Vérifiez depuis l'interface web le changement sur Gogs.
    5. Récupérez une deuxième copie du dépôt github. Dans la suite, cette copie est depot2, tandis que le précédent est depot1.

      1. Dans depot1, ajouter une feuille de style à index.html avec une couleur d'écriture pour le body. Poussez vos changements.
      2. Faites la même chose dans depot2, avec une couleur différente. Essayez de pousser vos changements. Que se passe-t'il ? pourquoi ?
      3. Faites comme git vous le conseille

        git pull
        dans le depot2. Réglez le conflit à la main (git add, puis commit, et poussez vers le dépôt Gogs). Vous pouvez également résoudre le conflit en faisant git mergetool.
      4. Dans l'autre dépôt local, récupérez les changements, et vérifiez que tout le monde est à jour.

      Remarque Souvenez-vous que Git est complétement distribué. Il ne privilégie aucun dépôt les uns par rapport aux autres.
    1. Créez une branche locale dans depot1 avec le nom branche1, et placez-vous dedans :

      git checkout -b branche1
      

      Cela équivaut à git branch branch1, et git checkout branche1

      Que donne ?

      git hist
      
      hist est l'alias créé précédemment.
    2. Ajoutez dans le fichier css une couleur à l'arrière plan du body. Indéxez et validez.
    3. Revenez dans la branche principale, et regardez le contenu de style.css.
    4. On va fusionner la branche principale avec la branche1

      git merge branche1
      
      Il ne devrait pas y avoir de conflit. Poussez vos changements sur Gogs.

    À la racine de votre compte, se trouve le répertoire public_html qui est servi par http par le serveur dwarves à l'url suivante :

    http://dwarves.arda/~login
    

    Le but est ici de faire en sorte qu'un dépot git de production soit automatiquement mis à jour à partir du dépôt local dépot1, à chaque commit (dans la vraie vie, on utiliserait surement push).

    1. Clonez votre dépôt vers le répertoire public_html/PRODUCTION

      git clone /home/denis/GIT/TP_GIT /home/denis/public_html/PRODUCTION
      

      Adaptez les chemins !

    2. Ajoutez dans le répertoire hooks du dépôt un script post-commit le script suivant :

      #!/bin/bash
      echo "********** mise en production *********" 
      cd /var/www/Production 
      unset GIT_DIR
      git pull origin master

retour à la page d'accueil

retour au sommet