1. T R A V A I L C O L L A B O R A T I F
E F F I C A C E A V E C G I T
V E R S I O N P Y C H A R M
18 mai 2016
2. O B J E C T I F S
2
1 Comprendre l'intérêt des gestionnaires de code
2 Effectuer des manipulations simples
3 Découvrir une stratégie de gestion des projets
5. P O U R S O I
5
Il est utile
de pouvoir retrouver les différentes étapes de son travail
d'avoir plusieurs versions de son travail en même temps
6. P O U R S O N E Q U I P E
6
Toute production - code ou autre - fait partie du patrimoine de son équipe et doit
être conservée de manière pérenne (c.a.d avec des pratiques connues)
7. P O U R N O S E Q U I P E S
7
Il est nécessaire d'outiller et organiser le travail collaboratif
9. P O U R Q U O I G I T ?
9
Il existe beaucoup de SCM : CVS, SVN, Git, Mercurial,...
En général chaque nouvelle génération d'outil rend la précédente obsolète
Git apporte beaucoup de souplesses :
Le travail déconnecté
La possibilité de travailler facilement sur plusieurs versions de l'application (les branches)
La version de production
La version en développement
La possibilité de travailler à plusieurs :
Avec un serveur central
Avec plusieurs serveurs centraux
Directement entre plusieurs développeurs
10. P O U R Q U O I G I T ?
La plupart des opérations s’effectuent
sur le poste du développeur sans
passer par le réseau
Rapide
Git est disponible sur tous les systèmes
d’exploitation. Il peut être utilisé en
ligne de commande ou via un IDE.
Agnostique
Il existe, sur Internet, un grand nombre de
forge basées sur Git. Elles ajoutent des
fonctionnalités sociales permettant de
proposer des évolutions, des corrections…
Social
Via ses fonctionnalités, Git permet de
mettre en place des organisations du
développement permettant de résoudre les
soucis usuels, par exempleGitFlow.
Efficace
10
12. I D E U T I L I S E
12
Par défaut Git s'utilise avec l'invite de commande
Les principaux IDE (Eclipse, Netbeans, IntelliJ ...) masquent ces commandes en les intégrant à
leur interface
Les exercices proposés utilisent gratuit l'IDE PyCharm (Community Edition) disponible ici
: https://www.jetbrains.com/pycharm/.
Toutefois, afin de permettre le passage vers d'autres IDE et l'appronfondissement de l'outil,
les commandes sont indiquées en marge des exercices
L'onglet Console de PyCharm permet de voir les commandes effectuées de manière sous-
jacente.
13. S E R V E U R G I T
13
Plusieurs serveurs Git en ligne et gratuits existent (GitHub, BitBucket,...)
Il existe également des serveurs à installer localement (GitLab C.E.)
Renater propose gratuitement une forge destinée aux EPST, Sourcesup, offrant les
fonctionnalités suivantes :
Dépôts publics/privés (Authentification basée sur Sibboleth)
Git
Gestionnaire d'anomalies (Mantis BT)
Wiki
Moteur d'intégration continue (Jenkins)
Sourcesup
15. D E P O T LO C A L E T R E P E R T O I R E D E T R AVA I L
15
Pour chaque projet, Git utilise un répertoire (.git) dans lequel il va mettre l'ensemble des
données/métadonnées permettant de retracer l'histoire du projet. C'est le dépôt local du
projet.
Git va extraire de ce dépôt une version du projet dans un répertoire afin de permettre l'édition
des fichiers. C'est le répertoire de travail du projet.
En général le dépôt local est un sous répertoire du projet
16. D E P O T LO C A L E T R E P E R T O I R E D E T R AVA I L
16
Ve r s i o n d e t r a v a i l d u p r o j e t
Ré p e r t o i r e d e t r a v a i l
D é p ô t l o c a l
17. Chaque fois qu'un projet est validé, Git stocke dans le dépôt local, une image de tous les
fichers composants alors le projet.
On parle d'instantané.
I N S TA N TA N E
17
18. Avec Git, le cycle classique est le suivant :
1. On ajoute/supprime/modifie des fichiers dans l'espace de travail
2. On groupe l'ensemble de ces modifications (on parle d'indexation)
3. On valide (commit) ces modifications dans le dépôt local en y associant un commentaire
(exemple: correction de l'anomalie #145)
E C H A N G E S LO C A U X
18
20. Le projet peut déjà exister ou n'être qu'un répertoire vide.
Dans le menuVCS, sélectionnez EnableVersion Control Integration
Dans la fenêtre popup, sélectionnez Git et cliquez sur Ok
A l'issue de la configuration, la barre de statut devrait afficherGit:master
A J O U T E R G I T A U N P R O J E T
20
22. Il est utile de pouvoir facilement voir l'ensemble des fichiers ajoutés/supprimés/modifiés et non
ajoutés au dépôt local.
Dans la barre de statut, faites apparaître le menuVersion Control et cliquez dessus
Cliquez sur Local Changes pour faire apparaître la liste des fichiers non validés
C O N N A I T R E L E S F I C H I E R S N O N VA L I D E S
22
23. Il est utile de pouvoir facilement voir l'ensemble des fichiers ajoutés/supprimés/modifiés et non
ajoutés au dépôt local.
Dans la barre de statut, faites apparaître le menuVersion Control et cliquez dessus
Cliquez sur Local Changes pour faire apparaître la liste des fichiers non validés
C O N N A I T R E L E S F I C H I E R S N O N VA L I D E S
23
24. A J O U T E R D E S F I C H I E R S A U D E P O T LO C A L
24
L’ajout de fichiers au dépôt local s’appelle un commit.
Dans le projet, créez deux fichiers, fichier1.txt et fichier2.txt avec comme contenu Contenu du
fichier X
PyCharm vous propose par défaut que ces fichiers soient gérés par Git. Déclinez l'offre en
cliquant sur No
Vous pouvez vérifier dans Local Changes que les deux fichiers apparaissent dans la
section Unversioned Files
Sélectionnez les fichiers (dans l'arboresence du projet), Dans le menu contextuel cliquez
sur Git puis sur Add.
25. A J O U T E R D E S F I C H I E R S A U D E P O T LO C A L
25
26. A J O U T E R D E S F I C H I E R S A U D E P O T LO C A L
26
Les fichiers sont désormais indexés et vont pouvoir être proposés au prochain Commit
Cliquez sur l'icône de commit
La fenêtre qui apparaît indique les fichiers qui vont faire partie du commit.Vous pouvez en
désélectionner.
Indiquez un commentaire ainsi que le nom de l'auteur et cliquez sur Commit
27. A J O U T E R D E S F I C H I E R S A U D E P O T LO C A L
27
28. I G N O R E R D E S F I C H I E R S
28
Certains fichiers ne doivent pas être commités :
Fichier spécifiques à un IDE ou à un poste de développement
Fichiers générés (.class, .jar)
…
PyCharm propose un mécanisme propriétaire pour ignorer les fichiers. Nous allons utiliser
le mécanisme standard de Git qui repose sur un fichier nommé .gitignore
Créez un fichier .gitignore à la racine du projet
Indiquez comme contenu /.idea.Cela signifie que tous les fichiers du
répertoire .idea seront ignorés.
La liste Unversioned Files n'affiche plus les fichiers du répertoire .idea
29. I G N O R E R D E S F I C H I E R S
29
Le fichier .gitignore est un fichier ordinaire : il doit être ajouté au dépôt et commité.
La syntaxe du fichier .gitignore est détaillée ici : http://git-scm.com/docs/gitignore
Des exemples de fichiers .gitignore adaptés à chaque language/framework sont disponibles
: https://github.com/github/gitignore
REMARQUES
30. S U P P R I M E R U N F I C H I E R
30
Lorsque que l'on supprime un fichier - via l'IDE par exemple - il faut répercuter cette suppression
au niveau du dépôt local si celui-ci y était déjà présent. Cette opération est similaire à un
commit.
Créez un fichier fichier3.txt avec comme contenu Contenu du fichier 3. Ajoutez ce fichier au
dépot local
Supprimez le fichier dans l'arboresence du projet.
Cliquez sur le bouton Commit
31. S U P P R I M E R U N F I C H I E R
31
Remarquez que cette fois-ci, la boite de dialogue indique que le commit va concerner une
suppression.
Commitez
32. R E N O M M E R U N F I C H I E R
32
Répercuter le changement de nom d'un fichier présent au dépôt est un action similaire à la
suppression
Renommez le fichier fichier2.txt en fichier2b.txt (via le menu contextuel)
L'onglet Local Changes indique que le changement est un changement de nom
Cliquez sur le bouton Commit
33. R E N O M M E R U N F I C H I E R
33
Remarquez que cette fois-ci, la boite de dialogue indique que le commit va concerner un
changement de nom
Commitez
34. C O N S U LT E R L’ H I S T O R I Q U E
34
L'onglet Log permet de consulter l'historique du projet :
les différents commits (avec leur messages)
les différentes branches
Dans le fichier fichier1.txt ajoutez une ligne ayant comme contenu Ligne ajoutée
ultérieurement
Commitez le fichier
35. C O N S U LT E R L’ H I S T O R I Q U E
35
Pour chaque commit, les différents fichiers concernés sont affichés sur le panneau de droite.
Dans le menu contextuel, Show Diff with local permet de voir les différences par rapport au
répertoire de travail
36. C O N S U LT E R L’ H I S T O R I Q U E
36
Il est également possible de connaitre l'historique d'un fichier unique
38. A J O U T E R D E S E T I Q U E T T E S ( TA G )
38
Une étiquette permet de donner un nom sur un instantanné afin d'être facilement identifiable
par la suite.
Par exemple, cela permet d'associer un numéro de version à un état du projet.
Dans la vue Log, sélectionnez le commit à tagger et faîtes apparaître le menu contextuel
Sélectionnez la commande NewTag...
39. A J O U T E R D E S E T I Q U E T T E S ( TA G )
39
Indiquez le nom de l'étiquette et validez
L'étiquette est visible dans la vue Log
40. R E M P L A C E R PA R U N E V E R S I O N A N T E R I E U R E
40
La commande git checkout permet de naviguer entre les branches et les commits (cf. infra).
Elle peut toutefois être utilisée pour restaurer un fichier dans une version plus ancienne. Par
exemple fichier3.txt.
Identifiez l'identifiant du commit contenant la version de fichier3.txtsouhaitée via la vue Log.
Dans notre cas 479b5c7.
Ouvrir un terminal dans le répertoire racine du projet
41. R E M P L A C E R PA R U N E V E R S I O N A N T E R I E U R E
41
Lancez la commande git checkout 479b5c7 fichier3.txt
Le fichier a été restauré et est présent dans l'espace de travail comme un nouveau fichier.
42. R E PA R T I R D ’ U N C O M M I T A N T E R I E U R
42
Il peut être utile - mais dangereux - de repartir d'un commit plus ancien et de supprimer
les commits survenus depuis.
Dans la fenêtre Log, sélectionnez le commit à partir duquel vous voulez repartir.
Dans le menu contextuel, sélectionnez la commande Reset current branche to here...
43. R E PA R T I R D ’ U N C O M M I T A N T E R I E U R
43
Dans la boite de dialogue choisissez l'option adaptée à votre besoin et validez en cliquant
sur Reset.
Il est peut-être plus prudent de créer une branche à partir du commit identifié.
45. P O U R Q U O I AV O I R B E S O I N D E B R A N C H E S ?
45
Il peut être nécessaire de travailler simultanément sur plusieurs versions du code:
Version en production
Version en développement
...
Le concept de branche répond à ce besoin et les différents SCM le mettent en œuvre.
Toutefois, généralement, l'implémentation proposée fait que le concept est rarement utilisé.
Exemple: En SVN, les branches sont gérées sur le serveur et le temps de création des branches
puis de bascule d'une branche à l'autre est rédhibitoire.
Avec Git, les branches sont très simples à gérer et le passage entre deux branches est quasi
instantané.
46. G I T F LO W
46
En 2010, Vincent Driessen publie un article intitulé A successful Git branching
model (http://nvie.com/posts/a-successful-git-branching-model/) proposant une méthodologie
efficace pour gérer les projets avec Git grâce aux branches.
Cette méthodologie a été rapidement adoptée par beaucoup de grands acteurs du
développement, notamment dans le cadre de méthodologie agile.
48. G I T F LO W
48
Branches pérennes
master : branche correspondant au code en production
develop : branche correspondant au code en développement
Branches transitoires
Feature : pour toute nouvelle fonctionalité ou correction de bug
Hotfix: correction de bug en production
Release : livraison
Principaux points
49. G I T F LO W
49
Une surcouche à Git en mode commande est également disponible mettant en oeuvre de
manière explicite les principes de GitFlow.Toutefois, elle n'est pas indispensable.
Remarque
http://danielkummer.github.io/git-flow-cheatsheet/index.fr_FR.html
50. C O M M E N T G I T G E R E L E S B R A N C H E S ?
50
Chaque commit entraîne la création d'un instantané identifié par un numéro unique.
Avec Git, une branche est simplement un pointeur vers un instantané
Un pointeur spécial, HEAD, indique la branche courante.
51. C O M M E N T G I T G E R E L E S B R A N C H E S ?
51
Créer une nouvelle branche revient donc à ajouter un nouveau pointeur sur l'instantané
courant.
Changer de branche consiste à basculer vers l'instantané pointé par la branche et à mettre à
jour le pointeur HEAD.
52. C O M M E N T G I T G E R E L E S B R A N C H E S ?
52
Lors des commits suivants seul le pointeur de la branche actuelle va se déplacer.
53. L E S F U S I O N S
53
Deux cas se présentent en général
1. La branche qui va recevoir la fusion est un ancêtre de la branche à fusionner
2. La branche qui va recevoir la fusion n'est pas un ancêtre de la branche à fusionner
54. L E S F U S I O N S
54
Ce cas est très simple, la fusion revient simplement à déplacer le curseur de la branche
recevante sur l'instantané pointé par la branche à fusionner.
Cas 1 : La branche qui va recevoir la fusion est un ancêtre de la branche
à fusionner
Avant fusion Après fusion
55. L E S F U S I O N S
55
Ce cas est potentiellement compliqué car certains fichiers ont pu être modifiés dans les deux
branches, il va falloir fusionner ces fichiers via un nouvel instantané.
Cas 2 : La branche qui va recevoir la fusion n'est pas un ancêtre de la
branche à fusionner
Avant fusion Après fusion
57. C R É E R U N E B R A N C H E
57
La branche courante est indiquée à droite de la barre de statut.
Par défaut, la 1ère branche s'appelle master.
Pour créer une nouvelle branche et basculer dessus :
Cliquez sur la branche actuelle afin de faire apparaitre le menu déroulant et sélectionnez
l'action New Branch
58. C R É E R U N E B R A N C H E
58
Dans la boite de dialogue, indiquez le nom de la nouvelle branche :develop
La vue Log affiche les deux branches au niveau du dernier commit
59. C R É E R U N E B R A N C H E
59
La barre de statut indique désormais develop comme branche actuelle.
Créez de la même manière une branche nommée feature_MaFonction et basculez dessus.
60. B A S C U L E R D ’ U N E B R A N C H E A L’A U T R E
60
Le menu déroulant des branches indique les différentes branches présentes
Pour basculer d'une branche à l'autre, il suffit de chosir la branche cible dans le menu et de
cliquer sur Checkout
La bascule est très rapide car totalement locale.
61. B A S C U L E R D ’ U N E B R A N C H E A L’A U T R E
61
Remarque : le fichier fichier3.txt est présent dans la nouvelle branche.
62. F U S I O N S I M P L E ( FA S T F O R WA R D)
62
Dans fichier1.txt ajoutez une nouvelle ligne (Ligne ajoutée dans MaFonction)
Ajoutez un fichier fichier4.txt avec comme contenu la ligne Contenu du fichier4.txt
Commitez le fichier 1 et le fichier 4 avec un commentaire identifié (modification pour
MaFonction)
Basculez sur la branche develop (le fichier fichier1.txt est affiché dans son état antérieur, le
fichier fichier4.txt absent)
Dans le menu des branches, sélectionnez la branche feature_MaFonctionet cliquez sur merge
63. F U S I O N S I M P L E ( FA S T F O R WA R D)
63
Le fichier 1 modifié et le fichier 4 sont bien présents
En fait Git n'a fait que déplacer le pointeur de la branche develop sur la
branche feature_MaFonction
64. F U S I O N AV E C C O N F L I T
64
Supprimez le fichier fichier3.txt
Demandez la fusion avec la branche Hotfix_1
Il y a dans ce cas, un conflit avec les deux versions de fichier1.txt
Cliquez sur Merge. Dans la boite de dialogue, fusionnez manuellement les deux fichiers
Validez en cliquant sur Apply.
65. F U S I O N AV E C C O N F L I T
65
La situation est alors la suivante :
Notez la présence du commit de fusion.
66. S U P P R E S S I O N D E B R A N C H E
66
Les branches Hotfix_1 et feature_MaFonction sont des branches temporaires. Elles peuvent être
supprimées.
Dans le menu des branches, sélectionnez chacune de ces deux branches et cliquez
sur Delete
Remarque: Git vous avertit si vous tentez de supprimer une branche n'ayant jamais été
fusionnée
68. L E S D E P O T S D I S TA N T S ( R E M O T E )
68
Objectifs
Les dépots vont permettre aux développeurs de partager leur travail.
Ils peuvent aussi servir de dépôt de référence pour l'intégration continue
Git offre beaucoup de souplesse dans la gestion des dépôts distants :
Nature (cloud, disque partagé, clé usb...)
Protocole (SSH, Git, HTTPS...)
Nombre (utilisation de plusieurs dépôts...)
Structure (communication directe entre développeur, serveur central ...)
Dans notre exercice nous allons créer un dépôt distant ...local au poste de travail.
69. C R E AT I O N D U D E P O T D I S TA N T
69
Dans un terminal créez un répertoire monDepotGit.git
Entrez dans le répertoire
Tapez la commande git init –bare
Remarque: par convention, le nom des dépôts Git finit par .git
70. C O N N E X I O N A U D E P O T D I S TA N T
70
Dans Pycharm, via le menu contextuel du projet, utilisez la commande
Git > Repository > Push
Push est la commande qui indique à Git de transférer des fichiers vers le dépôt distant.
71. C O N N E X I O N A U D E P O T D I S TA N T
71
Dans la fenêtre qui s'ouvre cliquez sur Define remote
Laissez le nom origin
Indiquez comme URL l'adresse de votre dépôt distant et validez en cliquant sur Ok
72. C O N N E X I O N A U D E P O T D I S TA N T
72
origin est le nom d'usage pour le serveur distant central.
L'URL indique le protocole de connexion :
HTTPS : https://github.com/francoisandre/gtdrosea_workshop.git
SSH : git@github.com:francoisandre/gtdrosea_workshop.git
Finalisez le transfert en
Cliquant sur Push tags
Cliquant sur Push
Remarques
73. C O N N E X I O N A U D E P O T D I S TA N T
73
74. R E C U P E R AT I O N D U D E P O T D I S TA N T
74
Nous allons récupérer le projet à partir du dépôt distant pour simuler un deuxième développeur
Dans le menuVCS, SélectionnezCheckout fromVersion Control puis Git
Le terme Checkout est ici inadapté, il s'agit d'un Clone qui va - par défaut - récupérer l'intégralité
de l'historique du projet
75. R E C U P E R AT I O N D U D E P O T D I S TA N T
75
Indiquez l'adresse du dépôt distant
Indiquez comme nom de projet monProjetDev2
Validez en cliquant sur Clone
Validez les boîtes de dialogues qui apparaissent alors et indiquez que vous souhaitez voir le
projet dans une nouvelle fenêtre
Dans la barre de statut vous remarquez que Git est activé et pointe alors sur la
branche master qui n'existe pas dans notre dépôt distant.
76. R E C U P E R AT I O N D U D E P O T D I S TA N T
76
Dans la barre de statut, choisissez la branche develop et cliquez sur Checkout as new local
branch...
A l'issue du traitement, on retrouve le projet complet dans l'environnement du deuxième
développeur
77. T R A N S F E R T D U C O M M I T ( P U S H )
77
Dans monProjetDev2, créez un fichier fichier5.txt avec comme contenuContenu du fichier
fichier5.txt
Faites un commit de ce fichier, mais dans la fenêtre de commit
• Indiquez comme auteur Developpeur 2
• Choisissez l'option Commit and push...
Cliquez sur Push dans la fenêtre suivante
Le contenu du commit a été transféré sur le dépôt distant
78. R E C U P E R AT I O N D U C O M M I T ( P U L L )
78
Dans monProjet, à partir du menu contextuel du projet choisissez Git > Repository > Pull
Validez la fenêtre suivante en cliquant sur Pull
79. R E C U P E R AT I O N D U C O M M I T ( P U L L )
79
Le commit contenant fichier5.txt a été récupéré dans monProjet
80. R E M A R Q U E S S U R L E S R E M O T E S
80
Avec les remotes, les développeurs vont être confrontés aux problèmes classiques de fusions,
vus précédemment
Des nouveaux problèmes vont apparaître : suppression de branches distantes, ...
82. P O U R A L L E R P L U S LO I N
82
Pro Git (par Scott Chacon)
• Ouvrage de référence
• Disponible gratuitement en français : https://git-scm.com/book/fr/v2(différents formats:
pdf, html, epub...)
Tutoriel(s)
• http://www.grafikart.fr/formations/git