Support du TP

Transcription

Support du TP
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 \
"<[email protected]>"
% git config --global --add core.editor "emacs -nw"
% cat ~/.gitconfig
[user]
name = Matthieu Herrb
email = <[email protected]>
[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 <file>..." 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 <[email protected]>
Date:
Tue Oct 28 12:29:33 2008 +0100
Modif
commit 0ba7bd8b93ef9ddd8917814bde8cbdaaf9732559
Author: Matthieu Herrb <[email protected]>
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
résultat.
branch
et commite le
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://[email protected]/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
checkout
update
commit
add
remove
diff
log
git
clone
pull
commit -a + push
add
rm
diff
log