Conduite et Gestion de Projet Syst` emes de gestion de version
Thierry Hamon
Bureau H202 Institut Galil´ee - Universit´e Paris 13
&
LISN - Universit´e Paris-Saclay hamon@limsi.fr
https://perso.limsi.fr/hamon/Teaching/P13/CGP-2021- 2022/
Introduction
Gestion de version :
Maintenance d’un ensemble de fichiers et de leurs versions Utilisation importante dans le d´eveloppement logiciel (gestion du code source) :
Nombreuses fonctionnalit´es n´ecessaires au d´eveloppement logiciel :
Sauvegarde r´eguli`ere des modifications
Historique des modifications (date, nom du d´eveloppeur, zone de code modifi´e)
Partage des fichiers entre plusieurs d´eveloppeurs D´eveloppement en parall`ele sur le mˆeme fichier D´efinition de distribution
Maintenance et correction (d´efinition de patch)
Syst` eme optimiste
Plusieurs utilisateurs peuvent travailler sur le mˆeme fichier en mˆeme temps
le syst`eme fait l’hypoth`ese que les conflits (dus `a des modifications) sont rares : les utilisateurs ne travaillent pas sur la mˆeme partie du fichier
le syst`eme n’a qu’`a fusionner les modifications (au niveau des lignes)
les conflits sont r´egl´es manuellement par les utilisateurs Autre solution : r´eserver le fichier `a modifier, de mani`ere `a travailler en exclusivit´e
Syst` eme optimiste
Mode de fonctionnement optimiste : avantages importants un d´eveloppeur voulant faire modifier un fichier n’est pas empˆech´e par quelqu’un qui a r´eserv´e ce mˆeme fichier pas de cassure dans le rythme de d´eveloppement
D´ epˆ ot / R´ ef´ erentiel
Centralisation des fichiers et des informations associ´ees : Stockage dans une base de donn´ees
Acc`es local et distant partag´e par tous les utilisateurs Sauvegarde des diff´erentes versions des fichiers
Sauvegarde des informations associ´ees aux fichiers et au d´epˆot Chaque utilisateur travaille sur une copie locale et envoie ses modifications sur le d´epˆot
Principe de la gestion de version
Chaque ´el´ement (fichier, r´epertoire, etc.)
est contrˆol´e par le syst`eme de gestion de version se voit associer un num´ero de version (r´evision)
L’enregistrement d’une modification d’un ´el´ement de la copie locale provoque une incr´ementation du num´ero de r´evision D´efinition d’une arborescence des versions (organis´ee suivant un tronc et des branches)
Principe de num´ erotation des versions
format : m.n.p
voir par exemple la num´erotation des noyaux Linux m: num´ero de r´evision majeure
Incr´ementation lors d’ajout de fonctionnalit´es incompatibles avec la version pr´ec´edente
n: num´ero de r´evision mineure
Incr´ementation lors d’ajout de fonctionnalit´es compatibles avec la version courante (maintenance ´evolutive)
La parit´e peut ˆetre utilis´ee pour indiquer la stabilit´e : pair : version stable
impair : version de d´eveloppement p: num´ero de patch
Incr´ementation lors de la correction de bugs (maintenance corrective)
Rˆ oles des diff´ erentes arborescences
Distribution :
Identifier des rep`eres dans le d´eveloppement (phase de d´eveloppement, version, etc.)
Faciliter le support en figeant des versions Branches :
Correction de bugs
Tester de nouvelles fonctionnalit´esrisqu´ees sur des versions ant´erieures ou en parall`ele `a la version principale
Op´ erations principales
import: Initialisation/importation d’un projet dans un d´epˆot
`
a partir d’une arborescence non g´er´ees par un syst`eme de gestion de version
checkout: r´ecup´eration d’un projet dans un d´epˆot pour obtenir une copie locale
commit: mise `a jour du d´epˆot avec la copie locale update: mise `a jour de la copie locale avec le d´epˆot Synchronisation avec des modifications des autres d´eveloppeurs
Terminologie
R´esum´e
D´epˆot : ensemble des fichiers sous le syst`eme de gestion de version Copie locale : ensemble des fichiers sur la machine locale du d´eveloppeur R´evision : version d’un ´el´ement (fichier, r´epertoire, projet, etc.) du d´epˆot Tronc : arborescence principale d’un projet
Distribution (tags) : arborescence fig´ee d’un projet
Branches : arborescences secondaires, zones de travail utilis´ees pour des d´eveloppements ou des corrections en parall`ele `a l’arborescence principale Checkout : r´ecup´eration des fichiers du d´epˆot dans leur version courante Commit : soumision des modifications et/ou des ajouts de la copie locale Update : Mise `a jour de la copie locale par rapport aux fichiers sur le d´epˆot
Git
https://git-scm.com
Syst`eme de gestion de version distribu´e (DVCS) rappel : SVN est un syst`eme centralis´e
Syst`eme optimiste, rapide et efficace pour de grands projets Permet le d´eveloppement collaboratif, non lin´eaire (branches parall`eles)
Commande utilisateur : git
Aide : git helpougit help commande GUI :gitk,qgit, ...
Documentation : https://git-scm.com/doc
D´evelopp´e par Linus Torvalds pour la gestion du noyau Linux, premi`ere version en d´ecembre 2005
Git
Syst`eme de gestion de version tr`es complet
difficile `a maˆıtriser compl`etement Principes de base simples `a apprendre si le mod`ele sous-jacent est compris
(http://xkcd.com/1597/)
Principes
Conception similaire `a un syst`eme de fichiers (adressage, etc.) Commit: instantan´e (snapshot) du projet (r´epertoire de travail), d´esign´e par une r´ef´erence
Fichiers non modifi´es : r´ef´erence au fichier d´ej`a enregistr´e Utilisation de r´esum´es (cl´es de hachage) et la compression pour ´eviter la duplication des donn´ees
Identification des r´evisions avec des cl´es de hachage (SHA1)
Principe de stockage des modifications
Principe de stockage classique (SVN) :
Principe de stockage dans Git :
Principes
Deux niveaux de d´epˆot :
D´epˆot local utilis´e la plupart de op´erations courantes
(historique d’un projet, diff´erence sur un fichier, commit, etc.) Rapidit´e de r´eponse puisqu’on ne passe pas par un serveur distant
Utilisation de Git possible mˆeme sans connectivit´e Internet D´epˆot distant (remote) utilis´e pour le travail collaboratif Partage des modifications en
poussant (push), int´egrant/tirant (pull)
les modifications sur le serveur Git distant D´epˆot pr´ef´er´e : origin
Architecture Git
Index Copie de travail Index Copie de travail
modification différence ...
édition
modification différence ...
édition Dépot Git
distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git) Administrateur
pull push
clone push
add
commit reset −−hard reset −−hard
clone pull
commit
add
Principes
Cycle de vie d’un fichier (git status)
untracked: fichier non g´er´e par git unmodified/committed: copie de travail correspondant `a la version dans le d´epˆot
Modified: copie de travail ne correspondant par `a la version dans le d´epˆot
Staged(index´e) : copie de travail marqu´ee pour ˆetre incluse dans le prochaincommit
Flux des donn´ ees dans Git
Configuration initiale
D´efinition des valeurs par d´efaut pour les commits Stockage dans le fichier$HOME/.gitconfig
$ git config --global --add user.name "Thierry Hamon"
$ git config --global user.email hamon@limsi.fr
$ git config --global core.editor emacs
Initialisation d’un d´ epˆ ot local
+ Initialisation d’un d´epˆot
Dépot Git distant
Dépot Git local
Dépot Git local 1b Utilisateur
(git init) Administrateur 1 (git −−bare init)
1b Utilisateur (git init) (commande git)
Développeur
Développeur (commande git)
Initialisation d’un d´ epˆ ot local
Utilisation de la commandegit initdans le r´epertoire d´edi´e au d´epˆot (icigit-cgp)
Cr´eation de la branche principale (master)
$ mkdir git-cgp
$ cd git-cgp
$ git init
D´ep^ot Git vide initialis´e dans /home/thierry/git-cgp/.git/
$ ls -a ./ ../ .git/
$ ls -a .git
./ ../ branches/ config description HEAD hooks/
info/ objects/ refs/
ou
git init git-cgp;cd git-cgp
Consultation de l’´ etat de la copie de travail
1cstatus, log 1cstatus, log
Dépot Git distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git)
Consultation de l’´ etat de la copie de travail
$ git status Sur la branche master Validation initiale
rien `a valider (cr´eez/copiez des fichiers et utilisez "git add" pour les suivre)
$ echo "Hello world" > fichier.txt
$ git status Sur la branche master Validation initiale Fichiers non suivis:
(utilisez "git add <fichier>..." pour inclure dans ce qui sera valid´e) fichier.txt
aucune modification ajout´ee `a la validation mais des fichiers non suivis sont pr´esents (utilisez "git add" pour les suivre)
Le fichierfichier1.txt est inconnu pour le d´epˆot git local.
Ajout de fichiers
1dadd 1dadd
Index Copie de travail Index Copie de travail
modification différence ...
édition
modification différence ...
édition Dépot Git
distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git)
Ajout de fichiers
Utilisation degit add
$ git add fichier.txt
$ git status
Sur la branche master Validation initiale
Modifications qui seront valid´ees :
(utilisez "git rm --cached <fichier>..." pour d´esindexer) nouveau fichier: fichier.txt
Le fichierfichier1.txt est maintenant traqu´e/index´e.
Envoi de fichiers au d´ epˆ ot local
1ecommit
1ecommit
Index Copie de travail Index Copie de travail
modification différence ...
édition
modification différence ...
édition Dépot Git
distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git)
Envoi de fichiers au d´ epˆ ot local (1)
Utilisation degit commit -m "Message"
$ git commit -m ’Version initiale du projet’
[master (commit racine) 0fed1bf] Version initiale du projet 1 file changed, 1 insertion(+)
create mode 100644 fichier.txt
Envoi des fichiers ajout´es `a la liste des fichiers `acommitter
Envoi de fichiers au d´ epˆ ot local (2)
Tout fichier `acommitter doit d’abord ˆetre ajout´e `a la liste
$ echo "Hello world" >> fichier.txt
$ git commit -m ’Version modifi´ee 1 du projet’
Sur la branche master
Modifications qui ne seront pas valid´ees : modifi´e: fichier.txt
aucune modification ajout´ee `a la validation Utilisation de l’option-a(ou r´ealisation degit add)
$ git commit -a -m ’Version modifi´ee 1 du projet’
[master 6606d3d] Version modifi´ee 1 du projet 1 file changed, 1 insertion(+)
Historique des modifications
git log,git log --stat,git log -p
$ git log
commit 6606d3dd255f9c27447706a79f8d315346e0bd27 Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 13:59:40 2016 +0200 Version modifi´ee 1 du projet
commit 0fed1bfe1fbc4453e98954282caf5a16f219ee37 Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 13:41:18 2016 +0200 Version initiale du projet
Examen des modifications (1)
Affichage des modifications entre la copie de travail et la version index´ee (pas forc´ement committ´ee)
$ echo "Hello world" >> fichier.txt
$ git diff
diff --git a/fichier.txt b/fichier.txt index 57bf5a7..7780f02 100644
--- a/fichier.txt +++ b/fichier.txt
@@ -1,2 +1,3 @@
Hello world Hello world +Hello world
Examen des modifications (2)
Affichage des modifications entre la version index´ee et la version committ´ee
$ git add fichier.txt
$ git diff
$ git diff --cached
diff --git a/fichier.txt b/fichier.txt index 57bf5a7..7780f02 100644
--- a/fichier.txt +++ b/fichier.txt
@@ -1,2 +1,3 @@
Hello world Hello world +Hello world
D´ etail d’un commit
git show <HASHKEY>
$ git show 93f467b557
commit 93f467b5575964cd8fd266e105c065a1c214948e Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 15:00:19 2016 +0200 suppression fichier2
diff --git a/fichier2.txt b/fichier2.txt deleted file mode 100644
index e69de29..0000000
$ git show df0888da
commit df0888daa575bc283fa470a23c7ac01114066b46 Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 14:55:43 2016 +0200 Version modifi´ee 2 du projet diff --git a/fichier.txt b/fichier.txt index 95cb3b3..04d3bea 100644 --- a/fichier.txt
+++ b/fichier.txt
@@ -1,2 +1,3 @@
Hello world
Revenir en arri` ere (1)
Retirer un fichier de la liste des fichiers `acommitter (fichier index´e) avec git reset HEAD
$ git reset HEAD
Modifications non index´ees apr`es reset :
M fichier.txt
Revenir en arri` ere (2)
Suppression des modifications r´ealis´ees sur la copie de travail : git checkout -- FICHIER
$ git checkout -- fichier.txt
$ git status
Sur la branche master
rien `a valider, la copie de travail est propre
Revenir en arri` ere (3)
Restauration de la copie de travail `a partir de la derni`ere version committ´ee
$ echo "Hello world" >> fichier.txt
$ git add fichier.txt
$ git reset --hard
HEAD est maintenant `a 581337e Version modifi´ee 1 du projet
Suppression de la derni` ere version committ´ ee
Utilisation degit revert <HASHKEY>
$ cat fichier.txt Hello world Hello world 1 Hello world 4
$ git log
commit bd98a589871fbdc28f904630a5b27de38b0ff9fd Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 14:49:54 2016 +0200 Version modifi´ee 2 du projet
commit 82c980fea261f79030ad888dabbca53d372d74cb Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 14:49:50 2016 +0200 Version modifi´ee 1 du projet
commit 90f8ee3f9090f66c6dafe9817e41ac40cfd3eaf7 Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 14:49:50 2016 +0200 Version initiale du projet
$ git revert bd98a
Suppression de la derni` ere version committ´ ee
$ cat fichier.txt Hello world Hello world 1
$ git log
commit a57b23231e32304067034e0d8dc78889bba6dfb3 Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 14:51:48 2016 +0200 Revert "Version modifi´ee 2 du projet"
This reverts commit bd98a589871fbdc28f904630a5b27de38b0ff9fd.
commit bd98a589871fbdc28f904630a5b27de38b0ff9fd Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 14:49:54 2016 +0200 Version modifi´ee 2 du projet
commit 82c980fea261f79030ad888dabbca53d372d74cb Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 14:49:50 2016 +0200 Version modifi´ee 1 du projet ...
Suppression de la derni` ere version committ´ ee
...
commit 90f8ee3f9090f66c6dafe9817e41ac40cfd3eaf7 Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 14:49:50 2016 +0200 Version initiale du projet
Suppression d’un fichier
Utilisation degit rm FICHIER
$ touch fichier2.txt
$ git add fichier2.txt
$ git commit -m "ajout fichier2"
[master f312e5c] ajout fichier2
1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 fichier2.txt
$ git rm fichier2.txt rm ’fichier2.txt’
$ ls fichier.txt
$ git status Sur la branche master
Modifications qui seront valid´ees :
(utilisez "git reset HEAD <fichier>..." pour d´esindexer) supprim´e: fichier2.txt
$ git commit -m "suppression fichier2"
[master 93f467b] suppression fichier2
1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 fichier2.txt
$ ls fichier.txt
D´ eplacement/renommage d’un fichier (1)
Utilisation degit mv SOURCE CIBLE
$ git mv fichier.txt fichier1.txt
$ git status
Sur la branche master
Modifications qui seront valid´ees :
(utilisez "git reset HEAD <fichier>..." pour d´esindexer) renomm´e: fichier.txt -> fichier1.txt
$ ls
DIR1/ fichier1.txt
$ git commit -m "renommage de fichier en fichier1"
[master 71f2f4d] renommage de fichier en fichier1 1 file changed, 0 insertions(+), 0 deletions(-) rename fichier.txt => fichier1.txt (100%)
$ ls
DIR1/ fichier1.txt
D´ eplacement/renommage d’un fichier (2)
$ git mv fichier1.txt DIR1
$ git status
Sur la branche master
Modifications qui seront valid´ees :
(utilisez "git reset HEAD <fichier>..." pour d´esindexer) renomm´e: fichier1.txt -> DIR1/fichier1.txt
$ git commit -m "d´eplacement de fichier1 dans DIR1"
[master 7ace76a] d´eplacement de fichier1 dans DIR1 1 file changed, 0 insertions(+), 0 deletions(-) rename fichier1.txt => DIR1/fichier1.txt (100%)
$ ls -R .:
DIR1/
./DIR1:
fichier1.txt
Cr´ eation d’un r´ epertoire
NB : Pas d’ajout de r´epertoire vide dans un d´epˆot Git
$ mkdir DIR1
$ git add DIR1
$ git status
Sur la branche master
rien `a valider, la copie de travail est propre
$ git commit -m "cr´eation r´epertoire"
Sur la branche master
rien `a valider, la copie de travail est propre
$ git log
commit 93f467b5575964cd8fd266e105c065a1c214948e Author: Thierry Hamon <hamon@limsi.fr>
Date: Mon Sep 5 15:00:19 2016 +0200 suppression fichier2
....
Cr´ eation d’un r´ epertoire
Git ne g`ere que les fichiers (et indirectement les r´epertoires contenant des fichiers)
$ touch DIR1/.gitkeep
$ git add DIR1
$ git status
Sur la branche master
Modifications qui seront valid´ees :
(utilisez "git reset HEAD <fichier>..." pour d´esindexer) nouveau fichier: DIR1/.gitkeep
$ git commit -m "cr´eation r´epertoire"
[master b364b1f] cr´eation r´epertoire
1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 DIR1/.gitkeep
Identification d’une version
Marquage d’une version avec une ´etiquette explicite : git tag -a ETIQUETTE
$ git tag -a RELEASE-1.0 -m "Premi`ere version potable du projet"
$ git tag -l RELEASE-1.0
Suppression de l’´etiquette avec l’option-d ETIQUETTE
$ git tag -d RELEASE-1.0
´Etiquette ’RELEASE-1.0’ supprim´ee (elle ´etait sur 824801a)
Gestion des branches
Possibilit´e de d´eveloppement parall`ele Cr´eation d’une branche :
$ git checkout -b branch1
Basculement sur la nouvelle branche ’branch1’
Liste des branches :
$ git branch
* branch1 master
S´election d’une branche :
$ git checkout master
Basculement sur la branche ’master’
Modification d’une branche
$ git branch
* branch1 master
$ echo "Bonjour tout le monde 1" >> DIR1/fichier1.txt
$ git commit -a -m ’Version modifi´ee 5 du projet’
[branch1 47450ea] Version modifi´ee 5 du projet 1 file changed, 1 insertion(+)
$ more DIR1/fichier1.txt Hello world
Hello world 1 Hello world 4 Bonjour tout le monde 1
$ git checkout master
Basculement sur la branche ’master’
$ more DIR1/fichier1.txt Hello world
Hello world 1 Hello world 4
Fusion de branches
Utilisationgit merge BRANCHE_ORIGINE
Fusion des modifications deBRANCHE_ORIGINEavec la branche courante
thierry@brest:~/git-cgp$ git branch branch1
* master
thierry@brest:~/git-cgp$ git merge branch1 Mise `a jour b1360f3..04c6fc8
Fast-forward
DIR1/fichier1.txt | 1 + 1 file changed, 1 insertion(+)
thierry@brest:~/git-cgp$ more DIR1/fichier1.txt Hello world
Hello world 1 Hello world 4 Bonjour tout le monde 1
NB : Les modifications sont imm´ediatementcommit´ees
Utilisation d’un d´ epˆ ot distant
Index Copie de travail Index Copie de travail
modification différence ...
édition
modification différence ...
édition Dépot Git
distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git)
Utilisation d’un d´ epˆ ot distant
2 clone
Index Copie de travail Index Copie de travail
modification différence ...
édition
modification différence ...
édition Dépot Git
distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git)
Utilisation d’un d´ epˆ ot distant (1)
R´ecup´eration d’une copie locale du d´epˆot avec git clone ADRESSE_DEPOT
$ git clone thierry@brest:git-cgp Clonage dans ’git-cgp’...
thierry@brest’s password:
remote: Counting objects: 25, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 25 (delta 2), reused 0 (delta 0) R´eception d’objets: 100% (25/25), done.
R´esolution des deltas: 100% (2/2), done.
V´erification de la connectivit´e... fait.
$ cd git-cgp/
$ ls -R .:
DIR1/
./DIR1:
fichier1.txt
Utilisation d’un d´ epˆ ot distant
1ecommit
1dadd
Index Copie de travail Index Copie de travail
modification différence ...
édition
modification différence ...
édition Dépot Git
distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git)
Utilisation d’un d´ epˆ ot distant
3 pull
Index Copie de travail Index Copie de travail
modification différence ...
édition
modification différence ...
édition Dépot Git
distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git)
Utilisation d’un d´ epˆ ot distant
3bpush
Index Copie de travail Index Copie de travail
modification différence ...
édition
modification différence ...
édition Dépot Git
distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git)
Utilisation d’un d´ epˆ ot distant (2)
R´ecup´erer/tirer des branches distantes : git pull
Fusion de la branche distante dans la branche courante puis commit du r´esultat
Attention : possibilit´e de conflit `a r´esoudre puis committer le r´esultat
Machine 1 :
$ echo "Bonjour tout le monde 2" >> DIR1/fichier1.txt
$ git commit -a -m ’Version modifi´ee 6 du projet’
[master 81e872d] Version modifi´ee 6 du projet 1 file changed, 1 insertion(+)
$ git pull Already up to date.
$ git push
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 383 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0) To thierry@brest:git-cgp
Machine 2 :
$ git pull
thierry@brest’s password:
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (4/4), done.
Depuis brest:git-cgp
04c6fc8..81e872d master -> origin/master Mise `a jour 04c6fc8..81e872d
Fast-forward
Utilisation d’un d´ epˆ ot distant
4bpush 4apull
Index Copie de travail Index Copie de travail
modification différence ...
édition
modification différence ...
édition Dépot Git
distant
Dépot Git local
Dépot Git local (commande git)
Développeur
Développeur (commande git)
Utilisation d’un d´ epˆ ot distant (3)
Envoyer/pousser une branche locale : git push Machine 2 :
$ echo "Bonjour tout le monde 3" >> DIR1/fichier1.txt
$ git commit -a -m ’Version modifi´ee 7 du projet’
[master 39256f5] Version modifi´ee 7 du projet 1 file changed, 1 insertion(+)
$ git push
thierry@brest’s password:
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 383 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0) To thierry@brest:git-cgp
eee01f8..39256f5 master -> master
NB : Modification du d´epˆot sur la machine 1 pour ˆetre une simple d´epˆot (pas de possibilit´e de modification en locale)
Identification de l’auteur des commits
git blame -- FICHIER
$ git blame -- DIR1/fichier1.txt
^5f6bc29 fichier.txt (Thierry Hamon 2016-09-05 18:12:10 +0200 1) Hello world 1a1d0990 fichier.txt (Thierry Hamon 2016-09-05 18:12:10 +0200 2) Hello world 1 785210f2 fichier.txt (Thierry Hamon 2016-09-05 18:12:10 +0200 3) Hello world 4 eee01f87 DIR1/fichier1.txt (Thierry Hamon 2016-09-05 18:12:10 +0200 4) Bonjour tout le monde 1 39256f53 DIR1/fichier1.txt (Thierry Hamon 2016-09-05 18:12:53 +0200 5) Bonjour tout le monde 3
R´ esolution des conflits
Conflit : incompatibilit´e de modifications `a fusionner Processus :
Marqueurs de conflits associ´es aux fichiers sur lesquels portent les conflits
Pas d’ajout `a l’index (liste des fichiers `a committer) R´esolution du conflit par le d´eveloppeur
Ajouter des fichiers `a l’index Committer le r´esultat
Conclusion
Git :
Outil complexe mais puissant pour la gestion de version de fichiers (code ou autre)
Tr`es souvent utilis´e en milieu professionnel Nombreuses autres possibilit´es non pr´esent´ees ici
Sources des transparents
Matthieu Herrb (LAAS)
https://git-scm.com/book/en/v2 Christopher Simpkins (Georgia Tech) Anthony Baire (Rennes 1/IRISA)
http://ben-denham.github.io/git-advanced/pages/
git-cheatsheet.html
Subversion (SVN)
http://subversion.apache.org/
Syst`eme de gestion de version permettant le d´eveloppement collaboratif
le partage de fichiers et de r´epertoire dans un d´epˆot la num´erotation des version des fichiers et r´epertoires la r´ecup´eration des anciennes versions des fichiers la gestion des conflits sur un fichier
la diffusion des mises `a jour du d´epˆot
Centralisation du d´epˆot (mod`ele client-serveur) Disponible ind´ependamment de tout IDE
mais accessible sous forme d’un module dans Eclipse Commande utilisateur (client) : svn
Aide : svn helpousvn help commande
Fonctionnalit´ es de Subversion
Syst`eme optimiste
(mais possibilit´e de verrouillage si c’est vraiment n´ecessaire) D´efinition de m´eta-donn´ees (informations associ´ees) sur les fichiers et les r´epertoires
R´evision des fichiers, r´epertoires et m´eta-donn´ees
Manipulation de l’arborescence du d´epˆot (ajout, suppression et d´eplacement des fichiers et r´epertoires)
Op´erations de r´evision (commit/update/import) regroup´ees sur plusieurs fichiers
atomiques (travail au niveau de la ligne et non du fichier) Gestion des branches et des distributions
Caract´ eristiques techniques
Stockage diff´erentiel des fichiers
Seules les modifications par rapport `a la r´evision pr´ec´edente sont enregistr´ees
Gestion particuli`ere des fichiers binaires
Fonctionnementoffline pour certaines op´erations :
Etat des fichiers de la copie locale (svn status), diff´erences entre deux r´evisions (svn diff), annulation des modifications locales (svn revert)
Utilisation des informations se trouvant dans les r´epertoires .svn
Diff´erents protocoles de communication (SGF, HTTP, SVN, SVN+SSH)
Architecture SVN
svn commit svn commit
svn update svn update
svn checkout svn checkout
modification différence
...
édition modification
différence ...
édition
Développeur (commande svn) Copie de travail
Développeur (commande svn) Copie de travail svn import
Arborescence initiale
Dépot SVN
Administrateur (commande svnadmin)
Cr´ eation du d´ epˆ ot
En tant qu’administrateur de Subversion Utilisation de la commande svnadmin
Cr´eation du d´epˆot : svnadmin create <depot>
Aide pour svadmin : svnadmin help
Sauvegarde/restauration du d´ epˆ ot
svnadmin dump <depot> > fichier
Sauvegarde l’ensemble du d´epˆot : fichiers, r´epertoires, m´eta-donn´ees, etc.
Le fichier en sortie permet la restauration du d´epˆot svnadmin load <depot> < fichier
Restauration du d´epˆot `a partir d’un fichier sauvegard´e
Cr´ eation d’un projet
Importation d’une arborescence initiale dans le d´epˆot Arborescence UNIX contenant et organisation les fichiers `a ajouter au d´epˆot SVN
Organisation sur le d´epˆot, dans le r´epertoire contenant le projet :
un r´epertoiretrunkcontenant la branche principale o`u sera import´ee l’arborescence principale
un r´epertoirebrancheso`u seront stock´es plus tard les arborescences secondaires
un r´epertoiretags o`u seront stock´ees les distributions Remarques :
Organisation purement conventionnelle
Quels fichiers placer sur le d´ epˆ ot ?
Tous les fichiers modifi´es par les d´eveloppeurs : Fichiers sources
s’assurer qu’il est possible de reconstituer le produit `a partir de ces fichiers
Fichiers de documentation et de construction du logiciel (makefile, etc.)
Ne surtout pas mettre : les fichiers temporaires
les fichiers compil´es ou g´en´er´es `a partir des fichiers sources (fichiers objets, ex´ecutables, librairies, archives)
Importation initiale
svn import -m "Message" <arborescence initiale> <depot>
Int´egration de l’arborescence initiale (fichiers et r´epertoire dans le d´epˆot)
Tous les fichiers et r´epertoires sont g´er´es sous SVN Cr´eation de la version 1 du d´epˆot
Option -m: sp´ecification d’un message associ´e `a l’op´eration effectu´ee
NB : sans l’option -m, un ´editeur par d´efaut est ex´ecut´e pour r´ediger un message (l’´editeur est d´efini dans la variable d’environnementSVNEDITOR.
Remarque importante : supprimer ou ne plus utiliser l’arborescence
Importation initiale (1)
1 svn import
Arborescence initiale
Dépot SVN
Administrateur (commande svnadmin)
Importation initiale (2)
1 svn import
Arborescence initiale
Dépot SVN
Administrateur (commande svnadmin)
R´ ecup´ eration d’une copie locale
svn checkout <chemin du depot>
Cr´eation d’une copie locale du d´epˆot
Chaque d´eveloppeur doit effectuer l’op´eration avant de travailler sur les sources (´edition, modification, ajout, suppression, etc.)
Raccourci pour checkout: co svn co <chemin du depot>
R´ ecup´ eration de la copie locale
2
2 svn checkout svn checkout
modification différence
...
édition modification
différence ...
édition
Développeur (commande svn) Copie de travail
Développeur (commande svn) Copie de travail
Dépot SVN
Administrateur (commande svnadmin)
Mise ` a jour de la copie locale
svn update
(en ´etant pr´esent dans un r´epertoire sous SVN)
R´ecup´eration/synchronisation de la copie locale avec les derni`eres modifications sur le d´epˆot
Fusionne les donn´ees si n´ecessaire En cas d’´echec de la fusion,
un conflit est identifi´e
l’utilisateur doit choisir entre les modifications sur le d´epˆot et ses propres modifications
La mise `a jour peut n’ˆetre demand´ee pour qu’une partie de l’arborescence
Raccourci pour update: up svn up
Mise ` a jour de la copie locale
3 3
svn update svn update
modification différence
...
édition modification
différence ...
édition
Développeur (commande svn) Copie de travail
Développeur (commande svn) Copie de travail
Dépot SVN
Administrateur (commande svnadmin)
Mise ` a jour du d´ epˆ ot
svn commit -m "Message"
Mise `a jour du d´epˆot avec les modifications locales
Possibilit´e d’´echec si le d´epˆot a ´et´e mis `a jour depuis le dernier svn update
Il est n´ecessaire de faire une nouvelle mise `a jour
Option -m: sp´ecification d’un message associ´e `a l’op´eration effectu´ee (idemsvn import)
Mise ` a jour du d´ epˆ ot
4
4 svn commit
svn commit
modification différence
...
édition modification
différence ...
édition
Développeur (commande svn) Copie de travail
Développeur (commande svn) Copie de travail
Dépot SVN
Administrateur (commande svnadmin)
Manipulation de l’arborescence
... sous SVN
(en ´etant pr´esent dans un r´epertoire sous SVN) Ajout de fichier : svn add <fichier>
Ajout de r´epertoire : svn mkdir <fichier>
D´eplacement/renommage de fichier : svn mv <fichier> <nouveau fichier Suppression de fichier ou de r´epertoire : svn rm <fichier>ousvn delete <fichier>
NB : Effectuer uncommitapr`es ces op´erations pour qu’elles soient effectives sur le d´epˆot
Attention: ne pas utiliser de commandes UNIX pour r´ealiser ces op´erations. SVN prend tout en charge (mˆeme sur la copie locale).
R´ esolution d’un conflit
Apparition possible d’un conflit lors d’un commitou d’un update
le statut est `aCpour les fichiers o`u un conflit est apparu R´esolution du conflit :
Editer du fichier local
les zones en conflit sont marqu´ees par
>>>>>>>>>>>>>>>
et
<<<<<<<<<<<<<<<
Faire un choix dans les modifications `a conserver et sauvegarder le fichier
Indiquer `a SVN que le conflit est r´esolu :
R´ esolution d’un conflit
Remarque
SVN propose la r´esolution des conflits (l’´edition des fichiers o`u se trouve un conflit) lors d’un commit
les modifications locales peuvent ˆetre abandonn´ees : svn revert <fichier>
(retour `a la derni`ere mise `a jour locale –COMMITTED)
Examen du d´ epˆ ot
Informations sur le d´epˆot : svn info
Liste des fichiers sur le d´epˆot : svn list (svn ls) Statut des fichiers : svn status
Diff´erences entre la copie locale et le d´epˆot : svn diff NB : Il est possible de mentionner des num´eros de version : svn diff -r 11:20 fichier.txt
Visualisation des logs : svn log
R´ evisions
num´eros de version
R´ealis´ees par groupe d’actions (modification de fichiers, manipulation de l’arborescence, etc.)
Num´ero de version : entier croissant `a chaque commit Un num´ero de version par fichier
Il existe des raccourcis :
HEAD: dernier num´ero de version sur le d´epˆot
BASE: dernier num´ero de version dans la copie locale (avant modification)
COMMITTED: num´ero de version pour laquelle une modification a ´et´e plac´ee sur le d´epˆot (COMMITTED<=BASE)
PREV: num´ero de version juste avantCOMMITTED (PREV =COMMITTED−1)
Statut des fichiers
svn status
A: Il est pr´evu d’ajouter le fichier lors du prochaincommit D: Il est pr´evu de supprimer le fichier lors du prochaincommit U: Le fichier vient d’ˆetre mis `a jour
M: Le fichier de la copie locale a subi des modifications (par rapport au dernier update)
C: Le fichier contient des conflits (apparus lors de la dernier mise `a jour/fusion avec la version sur le d´epˆot)
G: Le fichier n’est pas int´egr´e au d´epˆot
?: Le fichier n’est pas int´egr´e au d´epˆot
!: Le fichier est incompl`ete ou absent
X: Le fichier n’est pas int´egr´e dans la copie de travail
Substitution de mots-cl´ es
Insertion dans les fichiers d’informations relatives aux r´evisions (num´eros de version, auteur, date, etc.)
Substitution lors des commit
Activation de la propri´et´e de substitution des mots-cl´es : svn propset svn:keywords "Id" fichier.txt Utilisation des mots-cl´es dans les fichiers ($Id$) Mots-cl´es disponibles :
Date(ouLastChangedDate) : date de la derni`ere r´evision sur le fichier
Revision:derni`ere r´evision sur le fichier
Author: Auteur de la derni`ere r´evision sur le fichier HeadURL: URL du fichier sur le d´epˆot
Cr´ eation d’une distribution
Copie d’une r´evision dans le r´epertoiretags
svn copy <depot>/trunk <depot>/tags/<release>
release est le nom de la distribution (par exemple version-1.2)
ATTENTION : les modifications restent possibles sur la distribution (`a ´eviter absolument !)
R´ecup´eration de la distribution : svn co <depot>/tags/<release>
Cr´eation d’une copie non-versionn´ee de la distribution : svn export <depot>/tags/<release>
Cr´ eation d’un patch
Objectif : transmettre des modifications en dehors du d´epˆot SVN
Modification de sources d´ej`a publi´ees
Cr´eation du patch : g´en´eration d’un fichier des diff´erences entre deux r´evisions du d´epˆot (fichier ou arborescence) Exemple sur un fichier :
svn diff -r 12:13 fichier > fichier-r12-13.patch Application du patch sur une arborescence quelconque : (la o`u se trouve le fichier `apatcher)
patch < fichier-r12-13.patch
Cr´ eation d’une branche
Objectif : R´ealiser des d´eveloppements ou des corrections en parall`ele au tronc (trunk)
Branche : copie d’une r´evision de l’arborescence principale (trunk)
svn copy <depot>/trunk <depot>/branches/<feature>
feature est l’identifiant de la branche cr´e´ee (par exemple, ma-branche)
Utilisation :
svn co <depot>/branches/<feature>
Puis travail sur la branche de la mˆeme mani`ere que le tronc Possibilit´e de fusion des modifications de la branche dans le
Fusion des branches
Rapatriement des modifications dans le tronc (ou dans un autre branche) et inversement
svn merge -rRi <depot>/branches/<feature>
Application de la r´evision Ri de la branche feature`a la copie locale courante (tronc ou autre branche)
NB : il est fortement conseiller de commencer par examiner les diff´erences :
svn diff -rRi <depot>/branches/<feature>
Conseils et bonnes pratiques
Effectuer des mises `a jour (commit) r´eguli`eres de la copie locale (limite les possibilit´es de conflits)
Pr´ef´erer les mises `a jour (update) de l’ensemble de l’arborescence Toujours r´ealiser unupdateavant uncommit
R´ealiser descommitcorrespondant `a un ensemble coh´erent de modifications
Toujours compiler et tester les sources avant de r´ealiser un commit V´erifier que les fusions sont r´ealis´ees correctement
Ne pas prendre `a la l´eg`ere les conflits
Ne pas utiliser les commandes syst`eme pour les modifications d’arborescence (utilisersvn add|mv|rm)
Documenter les commits avec des messages explicites (accessibles ensuite avecsvn log)
Les messages de commit peuvent ˆetre envoy´es automatiquement `a toutes
Sources des transparents
Georges-Etienne Legendre, F´elix-Antoine Bourbonnais Jean-Fran¸cois Mari, IUT Charlemagne, dpt. informatique Didier DONSEZ, Universit´e Joseph Fourier - Grenoble 1, PolyTech’Grenoble LIG/ADELE
Nicolas Hernandez, IUT de Nantes - D´epartement Informatique