Download - Tutoriel GIT

Transcript
Page 1: Tutoriel GIT

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

Page 2: Tutoriel GIT

O B J E C T I F S

2

1 C o m p r e n d r e l ' i n t é r ê t d e s g e s t i o n n a i r e s d e c o d e

2 E f f e c t u e r d e s m a n i p u l a t i o n s s i m p l e s

3 D é c o u v r i r u n e s t r a t é g i e d e g e s t i o n d e s p r o j e t s

Page 3: Tutoriel GIT

Introduction

Page 4: Tutoriel GIT

Pourquoi ? Utiliser un Source Code Manager

Page 5: Tutoriel GIT

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

Page 6: Tutoriel GIT

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)

Page 7: Tutoriel GIT

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

Page 8: Tutoriel GIT

Pourquoi ? GIT

Page 9: Tutoriel GIT

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

Page 10: Tutoriel GIT

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

R a p i d e

Git est disponible sur tous les systèmes

d’exploitation. Il peut être utilisé en

ligne de commande ou via un IDE.

A g n o s t i q u e

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…

S o c i a l

Via ses fonctionnalités, Git permet de

mettre en place des organisations du

développement permettant de résoudre les

soucis usuels, par exemple GitFlow.

E f f i c a c e

10

Page 11: Tutoriel GIT

Remarques

Page 12: Tutoriel GIT

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.

Page 13: Tutoriel GIT

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

Page 14: Tutoriel GIT

Quelques notions préliminaires

Page 15: Tutoriel GIT

D E P O T L O C A L E T R E P E R T O I R E D E T R A V A 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

Page 16: Tutoriel GIT

D E P O T L O C A L E T R E P E R T O I R E D E T R A V A I L

16

V e 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

Page 17: Tutoriel GIT

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 T A N T A N E

17

Page 18: Tutoriel GIT

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 L O C A U X

18

Page 19: Tutoriel GIT

Manipulations locales

Page 20: Tutoriel GIT

Le projet peut déjà exister ou n'être qu'un répertoire vide. Dans le menu VCS, sélectionnez Enable Version 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 afficher Git:master

A J O U T E R G I T A U N P R O J E T

20

Page 21: Tutoriel GIT

A J O U T E R G I T A U N P R O J E T

21

Page 22: Tutoriel GIT

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 menu Version 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 V A L I D E S

22

Page 23: Tutoriel GIT

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 menu Version 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 V A L I D E S

23

Page 24: Tutoriel GIT

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 L O 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.

Page 25: Tutoriel GIT

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 L O C A L

25

Page 26: Tutoriel GIT

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 L O 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

Page 27: Tutoriel GIT

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 L O C A L

27

Page 28: Tutoriel GIT

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

Page 29: Tutoriel GIT

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

Page 30: Tutoriel GIT

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

Page 31: Tutoriel GIT

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

Page 32: Tutoriel GIT

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

Page 33: Tutoriel GIT

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

Page 34: Tutoriel GIT

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

Page 35: Tutoriel GIT

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

Page 36: Tutoriel GIT

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

Page 37: Tutoriel GIT

C O N S U LT E R L ’ H I S T O R I Q U E

37

Page 38: Tutoriel GIT

A J O U T E R D E S E T I Q U E T T E S ( T A 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 New Tag...

Page 39: Tutoriel GIT

A J O U T E R D E S E T I Q U E T T E S ( T A G )

39

Indiquez le nom de l'étiquette et validez L'étiquette est visible dans la vue Log

Page 40: Tutoriel GIT

R E M P L A C E R P A 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

Page 41: Tutoriel GIT

R E M P L A C E R P A 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.

Page 42: Tutoriel GIT

R E P A 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...

Page 43: Tutoriel GIT

R E P A 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é.

Page 44: Tutoriel GIT

Les branches Partie 1 : la théorie

Page 45: Tutoriel GIT

P O U R Q U O I A V 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é.

Page 47: Tutoriel GIT

G I T F L O W

47

Page 48: Tutoriel GIT

G I T F L O 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

Page 49: Tutoriel GIT

G I T F L O 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

Page 50: Tutoriel GIT

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.

Page 51: Tutoriel GIT

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.

Page 52: Tutoriel GIT

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.

Page 53: Tutoriel GIT

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

Page 54: Tutoriel GIT

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

Page 55: Tutoriel GIT

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

Page 56: Tutoriel GIT

Les branches Partie 2 : la pratique

Page 57: Tutoriel GIT

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

Page 58: Tutoriel GIT

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

Page 59: Tutoriel GIT

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.

Page 60: Tutoriel GIT

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.

Page 61: Tutoriel GIT

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.

Page 62: Tutoriel GIT

F U S I O N S I M P L E ( F A S T F O R W A 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

Page 63: Tutoriel GIT

F U S I O N S I M P L E ( F A S T F O R W A 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

Page 64: Tutoriel GIT

F U S I O N A V 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.

Page 65: Tutoriel GIT

F U S I O N A V E C C O N F L I T

65

La situation est alors la suivante :

Notez la présence du commit de fusion.

Page 66: Tutoriel GIT

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

Page 67: Tutoriel GIT

Échanger avec d'autres développeurs : les dépôts distants

Page 68: Tutoriel GIT

L E S D E P O T S D I S T A 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.

Page 69: Tutoriel GIT

C R E A T I O N D U D E P O T D I S T A 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

Page 70: Tutoriel GIT

C O N N E X I O N A U D E P O T D I S T A 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.

Page 71: Tutoriel GIT

C O N N E X I O N A U D E P O T D I S T A 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

Page 72: Tutoriel GIT

C O N N E X I O N A U D E P O T D I S T A 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 : [email protected]:francoisandre/gtdrosea_workshop.git

Finalisez le transfert en Cliquant sur Push tags Cliquant sur Push

Remarques

Page 73: Tutoriel GIT

C O N N E X I O N A U D E P O T D I S T A N T

73

Page 74: Tutoriel GIT

R E C U P E R A T I O N D U D E P O T D I S T A 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 menu VCS, Sélectionnez Checkout from Version 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

Page 75: Tutoriel GIT

R E C U P E R A T I O N D U D E P O T D I S T A 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.

Page 76: Tutoriel GIT

R E C U P E R A T I O N D U D E P O T D I S T A 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

Page 77: Tutoriel GIT

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

Page 78: Tutoriel GIT

R E C U P E R A T 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

Page 79: Tutoriel GIT

R E C U P E R A T 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

Page 80: Tutoriel GIT

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, ...

Page 81: Tutoriel GIT

Conclusion

Page 82: Tutoriel GIT

P O U R A L L E R P L U S L O 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

Page 83: Tutoriel GIT

M e r c i

www.aeris-data.fr

Modèle de présentation : ttp://thepopp.com/ - Jun Akizak


Top Related