Naviguer avec les fléches ou la molette de la souris
Agenda (en vert, les TP)
1-Concepts généraux, SVN
2-Pratique de SVN
3-Présentation de Git
4-Pratique de Git
5-Travail collaboratif avec Git
TP1 : Motivations
Historique
Notions et terminologie
Règles de l'art
Focus sur SVN
Outils
Règles de l'art SVN
Présentation des commandes de base
TP2 : commandes de base
Présentation des concepts
Présentation des commandes de base
TP3 : commandes de base en équipe
Outils
Règles de l'art
Les différents types de workflow
TP4 : utilitaires Git
Motivations
TP1 : Que serait notre vie
sans VCS ?
Vous faites partie d’une équipe de développement qui
intervient sur la réalisation d’une application
Comment conserver l’historique et revenir
en arrière ?
Comment partager le développement entre
plusieurs personnes ?
avec des contributeurs Open Source ?
Comment gérer plusieurs versions à la
fois ?
Comment tracer les modifications ?
En utilisant un VCS !
Usage
Utilisateurs : les développeurs et les intégrateurs
Le VCS est avec l'IDE l'outil principal du développeur
Principalement stockage de fichiers texte
Le VCS au sein de l'usine logicielle
Quels fichiers gérer en configuration ou pas ?
Le projet (et toutes ses versions) doit être
auto-porteur
Fichiers source (.java, .c, .html, .css...)
Fichiers binaires non dérivés des sources, images par exemple
Fichiers de build (maven: pom.xml, npm: package.json ...)
Pas en configuration :
Fichiers temporaires, générés ou compilés
Librairies (utiliser un dépot Maven)
Selon les politiques :
Fichiers projets de l'IDE (.project, .idea ...)
Personnalisation et historique de l'IDE
Modèles de gestion des accès concurrents
Modèle de contrôle de concurrence pessimiste:
fichiers réservés en lecture seule
Modèle de contrôle de concurrence optimiste :
conflits possibles mais possibilité de réconcilier
Quelques VCS (Clearcase, SVN etc) mixtes
La plupart des VCS sont à contrôle optimiste : CVS, SVN, Git,
Mercurial, BitKeeper etc.
Le modèle pessismiste est obsolète et pousse à de mauvaises pratiques de développement, à éviter !
Modeles centralisés / client-serveur
Copyright CC-BY-NC-SA Mathieu
Nebra (M@teo21)
Exemples : CVS, SVN, ClearCase, Perforce
Un serveur gère l'intégralité des révisions (le dépôt), les
développeurs récupèrent les modifications des autres et y ajoutent
les leurs
Modeles distribués
Copyright CC-BY-NC-SA Mathieu
Nebra (M@teo21)
Exemples : Git, Mercurial, Baazar, BitKeeper
Chaque développeur possède un dépôt entier mais les dépôts
peuvent s'échanger des modifications
Historique
Retour d'expérience : quels VCS dans les grands
comptes ?
Concepts généraux
SCM, VCS, outil de versioning, GCL
Source Control Management, Version Control System :
outils permettant de gérer plusieurs versions de sources
dépôt, référentiel [repository, depot]
Un dépôt est une sortie de base de données de sources
contenant toutes les révisions (tout l'historique) des fichiers
ainsi que des données de gestion (méta-données) associées
Copie locale, espace de travail [working
copy/directory/workspace]
Copie locale éditable d'une révision du dépôt et dont les modifications
peuvent ensuite être validées (commitées) dans le dépôt
Concepts généraux
Commit, validation, "mettre en conf", [commit,checkin]
(verbe) Enregistrer des modifications de la copie locale
vers dépôt. (nom) modifications
elles-mêmes.
Checkout
Récupération dans la copie locale de la version du dépôt
Update
Mise à jour dans sa copie locale d'un fichier du dépôt
Concepts généraux
Branche [branch]
Une ligne de développement d'un projet. Sert par exemple à :
Gérer une version spécifique pour un client
Gérer des branches de maintenance corrective
Tester une idée, un refactoring sans risques
Fork [fork]
Créer une nouvelle branche
Concepts généraux
Merge, fusion [merge]
Fusion des modifications de deux branches
Tag, étiquette [tag, label]
Photo du dépôt à un moment précis. Etiquette d'un
ensemble cohérent de sources.
Un tag peut présenter un aspect contractuel (signature numérique)
Concepts généraux
Modification concurrente
Tentative de mise à jour de sources ayant divergées
Copyright CC-BY-SA Ben
Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato
Concepts généraux
Conflit [conflict]
Modification concurrente d'une même zone de texte. La
résolution est manuelle.
Exemple de conflit :
<<<<<<< commit A'
int i = 0;
=======
int i = 1;
int j=0;
>>>>>>> commit A''
Bonnes pratiques
Le code commité doit toujours compiler
Commiter et merger souvent, mettre à jour régulièrement
Utiliser avec un outil de gestion de tickets (Trac,
Mantis, GitHub...)
Grouper les modifications en commits cohérents
Ne jamais commiter du code mort (en commentaire ou pas)
Formatage coersitif des sources ASAP
Version scheme : [X].[Y].[Z], exemple : 1.2.3
Programme : [major (refonte complète)].[minor (évolution)].[no fix (correction) en partant de zéro]
Librairie : [compatibilite API].[évolution].[fix], voir le semantic versionning http://semver.org/
Bonnes pratiques / Convention message de commit
Une ligne de contexte (max 50 caractères)
Une ligne vide (options -m " et retour charriot)
Un paragraphe détaillé (largeur 72 caractères max), liens vers
numéros de tickets
Présent : "corrige", pas "a été corrigé"
Exemple :
Correction bug #1456:Problème fichier bootstrap vide
Corrige une NPE se produisant quand le fichier bootstrap existe mais
est vide.
Reproduit uniquement par TU, non reporté par les utilisateurs
à ce point.
Voir aussi le bug #1674.
Zoom sur Subversion (SVN)
Open Source (licence Apache et BSD), écrit par CollabNet,
projet fondation Apache depuis 2010
Réécriture de CVS : SVN = sorte de "CVS++"
SVN est très populaire dans les grands comptes
Outil facile d'accès, intuitif
VCS de type centralisé (client-serveur)
VCS principalement à verrouillage optimiste (merge)
Fonctionnement spécifique de SVN
Révision de niveau dépôt, donc no révision fichiers
augmente même sans modification
Branche = Tag = répertoire
Une copie locale par branche*
* il est néanmoins possible d'utiliser svn switch
Copyright CC-BY-SA Ben
Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato
Outils SVN
[Tous OS] client en ligne de commande
[Tous OS] Plugins Eclipse : Subclipse ou Subversive
[Windows] TortoiseSVN (intégration dans l'OS)
Initalisation d'un dépôt SVN
Sur le serveur SVN :
svnadmin create nom depot
mkdir trunk tags branches
Si le projet existe déjà :
[soit import initial] sur le serveur SVN
$ svn import
[soit commit d'initialisation] sur un client SVN,
checkout du projet vide puis ajout des sources et commit :
Il faut ensuite commiter pour intégrer ces
modifications dans le dépôt
Détecter et visualiser les modifications
svn info url
affiche des informations de l'élement (auteur dernière
modification, date etc.)
svn status
affiche l'état de la copie locale par rapport au dépôt
' ' No modifications.
'A' Item is scheduled for addition.
'D' Item is scheduled for deletion.
'M' Item has been modified.
'R' Item has been replaced in your working copy.
'C' The contents of the item conflict with updates received from the repository.
'I' Item is being ignored (e.g., with the svn:ignore property).
'?' Item is not under version control.
'!' Item is missing (e.g., you moved or deleted it without using svn).
svn diff
affiche les différences entre révisions ou fichiers
Visualisation des messages des logs et des auteurs de
révisions
svn log
affiche les différents messages de commit
svn blame
affiche l'auteur de modifications d'un fichier ligne par ligne
Résolution de conflits
svn update propose de résoudre le conflit de façon interactive (forcer nos modifs, les leurs, éditer...)
Si la résolution est remise plus tard (p=postpone), il faudra utiliser:
svn resolve --accept <option
de résolution><fichier> quand le conflit sera corrigé.
puis faire un svn commit.
Options de résolution : working: version
résolue manuellement, base: version du
serveur avant modifications locales, mine-full
: notre version modifiée localement avant le conflit, theirs-full : révision serveur
Note : ne pas utiliser la commande svn resoved qui est dépréciée
Pointeurs pour une utilisation plus avancée
Voir la commande svn
propset svn:ignore fichier_a_ignorer .
pour ignorer des fichiers ou répertoires
Les externals svn
propset svn:externals
Voir fonctions de branching et merge : svn copy, svn switch et svn merge
Voir fonctions de tagging : svn copy
Keywords comme $$Date$$,
$$Author$$, $$Rev$$, à éviter.
Ne pas copier, renommer ou déplacer des fichiers ou des
répertoires avec les commandes systèmes. Utiliser svn (add|mv|rm) et commiter à chaque
modification
Un problème ? svn helpcommande
Quelles structurations pour un dépot multi-projets ?
Copyright CC BY-NC-ND Bertrand Florat
Quelques limitations
Impact du réseau : latences
Pas possible de travailler off-line ou sans le serveur
Limitations pour merges complexes (modification + déplacement)
Impose un modèle organisationnel simple mais limité
Problème du choix de structures du dépôt : par branches/tags ou par projets ?
Un workflow de validation nécessite des tags ou branches
Forte utilisation espace disque des copies locales sur les
clients et du dépôt sur le serveur (malgré le cheap-copy)
-> Talk de Linus Torvalds, comparaison entre Git et SVN: [9]
TP2 Commandes SVN de base
Voir la feuille de travaux pratiques
Zoom sur Git
I'm an egotistical bastard, and I name all my
projects after myself. First Linux, now git
Linus Torvalds + 3 semaines = Git (utilisé pour le kernel
Linux dès avril 2005)
VCS le plus puissant et le plus performant mais non
trivial
Open Source (licence GPL)
VCS de type distribué et contrôle optimiste uniquement
Programme "Unix-like" : commandes de haut niveau
(porcelain) utilisant commandes bas niveau (plumbing)
Quand utiliser Git ?
Equipes formées
Projets Open-Source (GitHub/Bitbucket)
Organisations décentralisées, développement non linéaire
Latences réseau importantes
Très grosses volumétries
Note : possible d'utiliser client git vers dépôt SVN (git-svn mais pas recommendé)
Quelques clients Git
Tous OS
egit/jgit (plugin Eclipse)
Gnu/Linux
git (ligne de commande) + gitk (GUI pour l'historique)
tig : navigateur Git en ncurses
Microsoft Windows
Git for Windows : git en ligne de commande + un éditeur
graphique d'historique
TurtoiseGit : éditeur graphique intégré dans l'OS
Mac OSX
Tower
GitBox
Différences immédiates vis à vis de SVN
Tout est beaucoup plus rapide :-)))
Un seul projet dans l'IDE par branche/tag
Impossible de commiter un répertoire vide
L'index (staging area)
On utilise beaucoup plus les branches
Configurer git
Attention! ne surtout pas oublier de configurer
Git avant tout commit, plus possible ensuite de changer nom/e-mail
(sauf perte historique)
Trois niveaux de configuration :
/etc/gitconfig : configuration
multi-dépôt pour tous les utilisateurs de la machine
~/.gitconfig : configuration
multi-dépôt pour l'utilisateur (en général, seul ce fichier est à
modifié)
/chemin dépôt/.git/config
: configuration du dépôt
Configuration globale (multi-dépôts) de l'utilisateur courant
:
$ git config --global user.name "John Doe" //Obligatoire !
$ git config --global user.email johndoe@example.com //Obligatoire !
$ git config --global push.default simple //Mode de push
$ git config --global core.editor vim //choix de l'éditeur, vi par défaut
$ git config --global merge.tool vimdiff //choix de l'outil de diff
Création d'un nouveau dépôt
Note : un seul projet par dépôt pour raison
d'isolation et de performances
$ cd ~/depots/my-app
$ git init
Le contenu du répertoire (projet Maven/Eclipse) sera :
Le dépôt que l'on vient de cloner est spécial : il est appelé origin (upstream repository)
Structure de base de Git
Git stocke des : trees, blobs, tags et commits,
tous référencés par un hash SHA-1 unique (intégrité)
Les références (refs) sont des noms symboliques des hashs
Copyright CC BY-SA-NC Scott Chacon
SHA-1 transforme une suite de caractères de 1 à 2^64 bits en un nombre de 160 bits.
Non réversible. Exemple : a6e757a90e389270e75428473858e04f8c71121b.
Versions réduites : a6e757a. Risque
collisions infinitésimaux.
Les commits dans Git
Chaque commit possède [1..n] parents
Donc l'historique forme un graphe
Le commit est de niveau dépôt (pointe sur le tree racine)
Notation : ref^n (nième père) et ref~n (nième premier père)
Note : si changement de branche avec des modifications non commitées, git merge les copies locales sauf si conflit detecté
(dans ce cas, on peut forcer tout de même le merge avec checkout -m).
Branching (suite)
Branche 'HEAD' = ref vers branche courante
Images Copyright CC BY-SA-NC Scott Chacon
Conventions :
master : branche par défaut
develop : branche de développment (instable)
Merge de branches
Merge branche develop dans
la branche master (courante):
$ git merge develop
Applique tous les commits de develop
dans master depuis le dernier merge entre ces deux branches.
Plusieurs algorithmes, défaut : "three ways merge"
Si la branche courante n'a pas évolué depuis dernier
merge, fast-forward (ff)
Si divergence (non-ff), merge automatique. Conflits
possibles
Images Copyright CC BY-SA-NC Scott Chacon
Branches remote
Branche remote (distante) : branche locale cache d'une
branche d'un dépôt distant
Lecture seule, se resynchronise avec son dépôt distant
avec git fetch et git
push
Par défaut, push refusé si branche distante a divergé
git pull = git
fetch + git merge
Tracking remote branch : branche remote avec refspec,
push/fetch/pull sans arguments (le '+' signifie qu'on met à jour la référence même si ce n'est pas un ff)
Options -w pour ignorer les différences de formatage
Toutes les différences entre deux branches :
$ git diff branche1..branche2
Seulement les différences de la branche2 avec le dernier commit commun entre branche1 et branch2 (qu'ai-je fait dans la branche2 depuis que mes deux branches ont divergées ?) :
$ git diff branche1...branche2
Note : les notations '..' et '...' n'ont pas la même
signification que les ranges utilisés (entre autres) par git log
Attention ! git diff sans arguments
compare copie locale et index, pas HEAD
Merging
$ git checkout master
$ git merge iss53
C'est la copie locale de la branche courante qui est
modifiée
Si conflit, plus possible de commiter :
Soit résolution manuelle des conflits
Soit git checkout --ours fichier
Soit git checkout --theirs fichier
puis (dans les trois cas), add
et commit
Revenir à l'état antérieur : git
reset --merge
Bonne pratique : option --no-ff pour
créer un commit de merge même en cas de FF
Images Copyright CC BY-SA-NC Scott Chacon
Rebasing
$ git checkout experiment
$ git rebase master
Sérialise deux branches
Rend l'historique beaucoup plus lisible (linéaire)
Utiliser avec git pull :
$ git pull --rebase
Permet de réécrire son historique (rebase interactif)
Attention : n'utiliser rebase qu'avec ses
branches locales, ne jamais rebaser un commit qui a déjà été
pushé
Images Copyright CC BY-SA-NC Scott Chacon
Utilitaires
Rebase interactif pour réécrire son historique local
git rebase -i
debugage multi-révisions avec bisect
git bisect [good|bad|start|skip|run|reset]
Commit partiel dans un même fichier :
git add -p
(option patch)
Les alias
git config --global alias.co checkout
L'IHM gitk
Changelog avec shortlog :
$ git shortlog
Fancy CLI
Coloriser :
git config --global ui.color true
son .bashrc
Templates de messages de commit
git config --global commit.template fichier
Recherche multi-revisions avec git
grep :
$ git grep [--name-only] texteref
Ignorer des fichiers
Fichier .gitignore à la racine
de la copie locale (lui-même commité). Exemples :
# a comment - this is ignored
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the root TODO file, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# Exemple réél :
.metadata
bin
build
.settings
*.class
Possible de positionner un fichier .gitignore
n'importe où
Peut être défini au niveau utilisateur dans le fichier
donné par ~/.gitconfig propriété core.excludesfile
Bonnes pratiques Git, à faire
Configurer Git (nom et e-mail) avant tout commit
Utiliser les commandes git rm,
git mv au lieu des commandes sytème
Bloquer les push forcés et les suppressions coté serveur
publique avec les options receive.denyNonFastForwards=true
et receive.denyDeletes=true
Nettoyer son historique avant de le pousser si confus
Utiliser l'option merge -no-ff
N'utiliser rebase que sur les branches locales
Bonnes pratiques Git, à éviter
Pas de merge avec modifications non commitées (retour
arrière difficile)
Ne pas forcer les push (avec push -f ou via refspecs),
risque de perte de commits
Ne pas pousser des branches privées
Ne pas modifier un commit publié
TP3 Commandes Git de base
Voir la feuille de travaux pratiques
Le coding social
Copyright
The Jajuk project
Réseaux sociaux de code comme
GitHub
Bitbucket
"Zone grise" entre l'équipe et les utilisateurs
Discussions sur le code (mode wiki)
Exemple de politique "grise" :
Les types d'organisations
Centralisé (SVN/CVS like) avec un "blessed server"
Hiérarchisé, par exemple à 3 grades : contributeur,
vérificateur, intégrateur
Patch/pull request : un projet + des contributeurs
externes