TP Gestion de versions avec Git

La page est créée Louis Barbier
 
CONTINUER À LIRE
TP Gestion de versions avec Git

                       Matthieu Herrb

http://homepages.laas.fr/matthieu/envol2010/tp-git/tp-git.pdf

                         Envol 2010
Agenda

  1 Introduction

  2 Concepts de Git

  3 Développeur isolé

  4 Utilisation des branches

  5 Travailler à plusieurs

  6 Autres fonctionnalités

  7 Appendix
Agenda

  1 Introduction

  2 Concepts de Git

  3 Développeur isolé

  4 Utilisation des branches

  5 Travailler à plusieurs

  6 Autres fonctionnalités

  7 Appendix
Introduction

      Système de gestion de version distribué
      par opposition à CVS ou subversion qui sont centralisés
      Développé par Linus Torvalds pour le noyau Linux
      Similaire à Monotone, Darcs, Mercurial, Bazaar, etc.
Interfaces de git

       Ligne de commande
       Diverses GUI pour git (gitk, qgit, giggles, etc.)
       Plugin Eclipse: EGit
Agenda

  1 Introduction

  2 Concepts de Git

  3 Développeur isolé

  4 Utilisation des branches

  5 Travailler à plusieurs

  6 Autres fonctionnalités

  7 Appendix
Concepts de base

     repository tout l’historique du projet,
                contenu dans le répertoire .git
   diff ou patch différences entre 2 versions d’un fichier
        commit (verbe) action d’enregistrer les version d’un ensemble
               de fichiers
               dans le repository
        commit (nom) le résultat d’une action de commit, représenté
               par un hash SHA-1.
       branche une lignée de développement.
               par défaut tout le développement se fait dans la
               branche master
            tag un identificateur symbolique pour un commit ou une
                branche
Concepts de base (2)

   Working tree L’arborscence de fichiers en cours d’édition
          Index un objet traquant les fichiers modifiés, ajoutés ou
                supprimés
          Blob données binaires utilisées pour stocker les fichiers,
               commits, et autres données
Configuration initiale

   Définir les valeurs par défaut pour les commits
        Nom d’utilisateur & adresse mail
        Éditeur de textes préféré

    % git config --global --add user.name "Matthieu Herrb"
    % git config --global --add user.email \
                               ""
    % git config --global --add core.editor "emacs -nw"
    % cat ~/.gitconfig
    [user]
            name = Matthieu Herrb
            email = 
    [core]
            editor = emacs -nw
Agenda

  1 Introduction

  2 Concepts de Git

  3 Développeur isolé

  4 Utilisation des branches

  5 Travailler à plusieurs

  6 Autres fonctionnalités

  7 Appendix
Créer un repository

   git init crée un répository vide dans le répertoire courant
    % mkdir git-tutorial
    % cd git-tutorial
    % git init
    Initialized empty Git repository in /home/mh/git-tuturial/.git/
    % ls -l .git
    total 24
    -rw-r--r--   1 mh mh    23 Oct 26 09:14 HEAD
    -rw-r--r--   1 mh mh 111 Oct 26 09:14 config
    -rw-r--r--   1 mh mh    58 Oct 26 09:14 description
    drwxr-xr-x 12 mh mh 408 Oct 26 09:14 hooks
    drwxr-xr-x   3 mh mh 102 Oct 26 09:14 info
    drwxr-xr-x   4 mh mh 136 Oct 26 09:14 objects
    drwxr-xr-x   4 mh mh 136 Oct 26 09:14 refs
Ajout de fichiers

   git add ajoute des fichiers nouveaux ou récemment modifiés à
   l’index
    % echo "Hello World" > file.txt
    % git add .
Consulter l’état

   Affichier la branche courante, et l’état de l’index
    %   git status
    #   On branch master
    #
    #   Initial commit
    #
    #   Changes to be committed:
    #     (use "git rm --cached ..." to unstage)
    #
    #        new file: file.txt
    #
Committer les modifications

   % git commit
   Created initial commit 0ba7bd8: Initial version
    1 files changed, 1 insertions(+), 0 deletions(-)
    create mode 100644 file.txt
   % echo "Hello Matthieu" > file.txt
   % git commit -a
   Created commit 7fbf4cb: Modif
    1 files changed, 1 insertions(+), 1 deletions(-)

   Ouvre l’éditeur de textes pour entrer un message de commit,
   puis enregistre les modifications dans le repository.
Regarder en arrière

   Plusieurs façons d’examiner l’historique des modifications
    % git log
    commit 7fbf4cb7c8977061fbfb609016f5414e833a3a1c
    Author: Matthieu Herrb 
    Date:   Tue Oct 28 12:29:33 2008 +0100

        Modif

    commit 0ba7bd8b93ef9ddd8917814bde8cbdaaf9732559
    Author: Matthieu Herrb 
    Date:   Tue Oct 28 12:28:38 2008 +0100

        Initial version
    % git log --stat
    % git log -p
Examiner les modifications

   Affiche les modifications entre le working set et l’index,
   ou entre l’index et le répository.
   echo "Good bye" > file.txt
   % git diff
   diff --git a/file.txt b/file.txt
   index 6bd8f3c..c0ee9ab 100644
   --- a/file.txt
   +++ b/file.txt
   @@ -1 +1 @@
   -Hello Matthieu
   +Good bye
   % git add file.txt
   % git diff --cached
Marquer une version

   Créer un objet de type tag, contenant un nom et un commentaire.
   Ouvre l’éditeur de texte pour saisir le commentaire.
   % git tag -a git-tuto-1.0
   % git tag -l
   git-tuto-1.0
Corriger les erreurs, revenir à une version saine

   Restaurer le working set à partir de la dernière version commitée,
   détruisant toutes les modifications locales:
    % git reset --hard

   Inverser un commit donné:
    % git revert 03bace
    Finished one revert.
    Created commit c333ab5: Revert "3rd version"
     1 files changed, 1 insertions(+), 1 deletions(-)
Agenda

  1 Introduction

  2 Concepts de Git

  3 Développeur isolé

  4 Utilisation des branches

  5 Travailler à plusieurs

  6 Autres fonctionnalités

  7 Appendix
Changer de branche

   Créer une nouvelle branche:
   % git checkout -b newbranch

   Retourner à la branche master:
   % git checkout master
Lister les branches existantes

    % git branch
    * master
      newbranch
Fusionner les modifications d’une autre branche

   % git merge branch

   Fusionne les commits de la branche      branch      et commite le
   résultat.

   2 types de fusion
       fast forward: pas de conflits, seulement des nouveaux commits
       à ajouter à la version courante.
       fusion normale: présence de modifications locales : utilise un
       algorithme de fusion à 3 voies.
Gestion des conflits

   Un conflit se produit lorsque les modifications à fusionner sont
   incompatibles avec les modifications locales de la branche cible.
       Les fichiers avec des conflits contiennent des marqueurs de
       conflit
       Ils ne sont pas automatiquement ajoutés à l’index
       Résoudre le conflict
       Ajouter les fichiers à l’index
       Committer le resultat
Outils pour aider à la fusion

   Git peut utiliser des outils tiers pour aider à résoudre les conflits:
   kdiff3, tkdiff, meld, xxdiff, opendiff,...
    % git config --global merge.tool meld

    % git mergetool
Selectionner des modifications individuelles

   Prendre un commit dans une autre branche (une correction de bug)
   et l’appliquer à la branche courante.

    % git cherry-pick SHA1_HASH
Rebase - rejouer les commits d’une branche

   Les fusions créent des commits  fantômes  sous forme de liens
   dans le graphe des versions.
   Lorsqu’une branche n’a que quelques commits locaux, rebase est
   préférable

   % git rebase master
Agenda

  1 Introduction

  2 Concepts de Git

  3 Développeur isolé

  4 Utilisation des branches

  5 Travailler à plusieurs

  6 Autres fonctionnalités

  7 Appendix
Copier un repository

   git clone repo

   repo: un URL du repository à copier. Peut être:
       un chemin vers un répertoire sur la même machine
       ssh://[user@]host/path - utilise GIT dans SSH
       git://host/path - accès anonyme avec le protocole GIT
       http://host/path - accès anonyme avec le protocole HTTP
exercice

   repository dinner:
   ssh://envol2010@trac.laas.fr/git/envol2010/dinner
       clonez le repository
       créez votre branche personnelle
       modifiez le code
            utilisez les fichiers de compilation du TP automake
            arrangez le style
            corrigez des défauts dans le code
            ...
       commitez vos modifs au fur et à mesure
       synchronizez avec le repository central
       visualisez les modifs faites par d’autres
       fusionnez les modifs de plusieurs personnes pour faire une
       meilleure version
Mise à jour depuis un répository

    % git pull

       récupère les branches distantes dans le repository local
       fusionne la branch distante par défaut dans la branche
       courante.
       et commite le résultat
       peut produire un conflit.
            Résoudre le conflit
            Committer le résultat
Branches distantes

   % git branch -r

   liste les branches distantes (origin/branch).

   Une branche distante peut être suivie (fusionnée dans les 2 sens)
   avec:
    % git checkout -t -b newbranch origing/newbranch
Utilisation de rebase avec les branches distantes

   fecth récupère les commits distants sans les fusionner
    % git fetch
    % git rebase origin/master

   Raccourci:
   % git fetch
   % git rebase origin/master
Envoyer des commits vers un repository

   % git push

   Transfère les commits locaux vers les branches distantes suivies.
   Génère une erreur si pas à jour (pull ou rebase d’abord).

   Il faut transférer les tags séparément:
   % git push --tags
Agenda

  1 Introduction

  2 Concepts de Git

  3 Développeur isolé

  4 Utilisation des branches

  5 Travailler à plusieurs

  6 Autres fonctionnalités

  7 Appendix
Identifier les auteurs

    % git blame -- file.txt

   Pour chaque ligne d’un fichier montre le dernier commit et son
   auteur.
Recherche par dissection d’un bug

   git bissect permet de rechercher dans l’historique des commits
   l’origine d’un bug.
       git bisect start
       git bisect bad la version courante est buguée
       git bisect good v2.6.33-rc2 dernière bonne version
   Git détermine le commit médian et l’extrait.
   Tester et exécuter selon le résultat:
       git bisect good
       git bisect bad
   À la fin reste le commit responsable du bug...
Créer une distribution avec git

   (Alternative à la fonction d’automake make dist)
       Committer toutes les modifications, y compris le nouveau nom
       de la version.
       Tagger le résultat
       Utiliser archive pour produire une archive qui sera la
       distribution source.
    % git tag -a foo-1.3
    % git archive --prefix=foo-1.3/ foo-1.3 \
      | gzip -c - > foo-1.3.tar.gz
Outils graphiques

       gitk
       git gui
       qgit
       giggle
   Web browsers: cgit, gitweb.
Intégration avec eclipse

   Installation:
        ajouter http://download.eclipse.org/egit/updates
        comme site de téléchargement
        (Preferences → Install/Updates)
        installer EGit et JGit (Help → Install new software)
   Eclipse peut alors gérer l’historique du projet avec git.

   Documentation:
   http://www.eclipse.org/egit/documentation/
Agenda

  1 Introduction

  2 Concepts de Git

  3 Développeur isolé

  4 Utilisation des branches

  5 Travailler à plusieurs

  6 Autres fonctionnalités

  7 Appendix
Git pour utilisateurs de CVS

    CVS        git
    checkout   clone
    update     pull
    commit     commit -a + push
    add        add
    remove     rm
    diff       diff
    log        log
Vous pouvez aussi lire