35
Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé . 2012, tous droits réservés DCLL - Partie III Git - concepts clés UPS, Master Informatique M1 UE14 Franck Silvestre 1

Cours sur github part3 git

Embed Size (px)

Citation preview

Page 1: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

DCLL - Partie IIIGit - concepts clés

UPS, Master Informatique M1UE14

Franck Silvestre

1

Page 2: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Développement collaboratif

Développer de manière collaborative, c’est travailler à plusieurs sur la même base de code pour produire un logiciel

2

Page 3: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Version Control System

• Gestion de version de code de source• Permet de gérer les changements sur le code source• Prise en compte des modifications provenant de plusieurs

contributeurs• Révision : un lot de changements reportés par un

contributeur induit une nouvelle version du code source • Possibilité de retrouver à tout moment le code source

correspondant à une révision donnée

3

Page 4: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

VCS - Concepts clés

• Repository / dépôt

- réceptacle du code source : versions passée et en cours• 3 modèles d’architecture- modèle local- modèle centralisé- modèle distribué

Utilisable dans le cadre d’un développement collaboratif

4

Page 5: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Modèle architecture centralisée

Serveur

Sur un serveur central

Poste de développement m

Fichiers

Chaque développeur travaille sur une copie locale des fichiers

Poste de développement 1

Fichiers ...

FichiersRévision 1

FichiersRévision n

...

Repository

5

Page 6: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Modèle architecture distribuée

Serveur

Sur un serveur central

Poste de développement m

Fichiers

Chaque développeur travaille sur une copie locale des fichiers et dispose d'un mirroir du repository

Poste de développement 1

Fichiers

...

FichiersRévision 1

FichiersRévision n

...

Repository

FichiersRévision 1

FichiersRévision n

...

Repository

FichiersRévision 1

FichiersRévision n

...

Repository

6

Page 7: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Modèle distribué

• Avantages- Modèle plus tolérant aux pannes• si le serveur tombe, le repository n’est pas perdu

- Modèles organisationnels plus riches• modèles de repositories hiérarchiques

• Inconvénient- Temps de prise en main un peu plus long

7

Page 8: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Git

• Développement collaboratif du noyeau Linux- changement de politique commerciale de BitKeeper

- création d’un nouvel outil s’impose

• Avril 2005 : 1er commit de Linus Thorvald

6,7 millions de lignes de code !

8

Page 9: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Projets utilisant Git

• Git• Noyau Linux• Perl• Eclipse• Gnome• KDE• Qt

• Ruby On Rails• Android• PostgreSQL• Debian• X.org• Grails• ...

9

Page 10: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Git - Installation

• Linux- distributions binaires Debian/Ubuntu/...

sudo apt-get install git-core git-doc git-gui

- distributions binaires Redhat/fedora/cent-ossudo yum install git-all

- distribution à partir des sources

• Windows- cygwin

- msysgit (recommandé)

• Mac OS X- git-osx-installer

- à partir des sources

10

Page 11: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Git en ligne de commandegitusage: git [--version] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] [-c name=value] [--help] <command> [<args>]

The most commonly used git commands are: add Add file contents to the index bisect Find by binary search the change that introduced a bug branch List, create, or delete branches checkout Checkout a branch or paths to the working tree clone Clone a repository into a new directory commit Record changes to the repository diff Show changes between commits, commit and working tree, etc fetch Download objects and refs from another repository grep Print lines matching a pattern init Create an empty git repository or reinitialize an existing one log Show commit logs merge Join two or more development histories together mv Move or rename a file, a directory, or a symlink pull Fetch from and merge with another repository or a local branch push Update remote refs along with associated objects rebase Forward-port local commits to the updated upstream head reset Reset current HEAD to the specified state rm Remove files from the working tree and from the index show Show various types of objects status Show the working tree status tag Create, list, delete or verify a tag object signed with GPG

See 'git help <command>' for more information on a specific command.

11

Page 12: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Git configuration

git config --global user.name "Franck Silvestre"git config --global user.email "[email protected]"git config --global color.ui "auto"git config --global -luser.name=Franck [email protected]=auto

Pas de commit possibles si pas d’identité !

12

Page 13: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Premiers projet Git

git init MonProjetInitialized empty Git repository in /Users/fsil/10_Dev/Other/Bacasable/MonProjet/.git/

mkdir MonProjet2cd MonProjet2/git initInitialized empty Git repository in /Users/fsil/10_Dev/Other/Bacasable/MonProjet2/.git/

On peut intialiser le repository Git sur un projet existant !

13

Page 14: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Création de fichiers dans le projet

MonProjet fsil$ groovy ../createFiles MonProjet fsil$ lsFichier_0.txt! Fichier_2.txt! Fichier_4.txt! Fichier_6.txt! Fichier_8.txtFichier_1.txt! Fichier_3.txt! Fichier_5.txt! Fichier_7.txt! Fichier_9.txt

MonProjet fsil$ git status# On branch master## Initial commit## Untracked files:# (use "git add <file>..." to include in what will be committed)##! Fichier_0.txt#! Fichier_1.txt#! Fichier_2.txt#! Fichier_3.txt#! Fichier_4.txt#! Fichier_5.txt#! Fichier_6.txt#! Fichier_7.txt#! Fichier_8.txt#! Fichier_9.txtnothing added to commit but untracked files present (use "git add" to track)

14

Page 15: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Ajout des fichiers dans «l’aire d’embarquement»

MonProjet fsil$ git add Fichier_0.txtMonProjet fsil$ git add Fichier_1.txt MonProjet fsil$ git status# On branch master## Initial commit## Changes to be committed:# (use "git rm --cached <file>..." to unstage)##! new file: Fichier_0.txt#! new file: Fichier_1.txt## Untracked files:# (use "git add <file>..." to include in what will be committed)##! Fichier_2.txt#! Fichier_3.txt#! Fichier_4.txt#! Fichier_5.txt#! Fichier_6.txt#! Fichier_7.txt#! Fichier_8.txt#! Fichier_9.txt

15

Page 16: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Commit des fichiers dans le repository

MonProjet fsil$ git commit -m'Premier commit !'[master (root-commit) f331ccf] Premier commit ! 2 files changed, 2 insertions(+), 0 deletions(-) create mode 100644 Fichier_0.txt create mode 100644 Fichier_1.txt

MonProjet fsil$ git status# On branch master# Untracked files:# (use "git add <file>..." to include in what will be committed)##! Fichier_2.txt#! Fichier_3.txt#! Fichier_4.txt#! Fichier_5.txt#! Fichier_6.txt#! Fichier_7.txt#! Fichier_8.txt#! Fichier_9.txtnothing added to commit but untracked files present (use "git add" to track)

16

Page 17: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Git et ses trois espaces

• L’espace de travail- l’ensemble des fichiers sur lequel travaille le développeur

• L’aire d’embarquement - les fichiers qui ont subit des modifications et qui sont «candidats»

à un commit

• Le repository- l’ensembles des fichiers ayant été «commités»

- l’historique des commits et les fichiers dans chaque version associée

17

Page 18: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

L’aire d’embarquement

• Dans la documentation anglophone- index

- staging area

• Espace tampon entre l’espace de travail et le repository• Possibilité d’ajouter ou de retirer les fichiers de l’aire

d’embarquement

18

Page 19: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Git et ses trois espaces

MonProjet fsil$ echo "OK ceci est un ajout..." >> Fichier_0.txt MonProjet fsil$ git status# On branch master# Changes not staged for commit:# (use "git add <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working directory)##! modified: Fichier_0.txt## Untracked files:# (use "git add <file>..." to include in what will be committed)##! Fichier_2.txt#! Fichier_3.txt#! Fichier_4.txt#! Fichier_5.txt#! Fichier_6.txt#! Fichier_7.txt#! Fichier_8.txt#! Fichier_9.txtno changes added to commit (use "git add" and/or "git commit -a")

Un fichier peut avoir subit des modifications et ne pas être envoyé sur l’aire d’embarquement !

19

Page 20: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Git et ses trois espaces

MonProjet fsil$ git add Fichier_0.txt MonProjet fsil$ git status# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)##! modified: Fichier_0.txt## Untracked files:# (use "git add <file>..." to include in what will be committed)##! Fichier_2.txt#! Fichier_3.txt#! Fichier_4.txt#! Fichier_5.txt#! Fichier_6.txt#! Fichier_7.txt#! Fichier_8.txt#! Fichier_9.txt

Un fichier doit être rajouté explicitement à l’aire d’embarquement avant de pouvoir faire l’objet d’un commit même si il a déjà fait l’objet d’un commit

20

Page 21: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Git-ignorer des fichiers

• Le fichier .gitignore- permet de spécifier des fichiers de l’espace de travail devant être

ignorer par git (index et repository)

- Lignes vides et lignes commençant par # sont ignorées

- Un nom de fichier spécifié : tous les fichiers de même nom ignorés dans tous l’espace de travail

- “*“ utilisable comme joker mais s’applique que dans le dossier courant ou dans le dossier indiqué par le pattern

- ...

21

Page 22: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Ignorer une catégorie de fichier

MonProjet fsil$ cat .gitignore*.logtargetMonProjet fsil$ git add .gitignore MonProjet fsil$ git commit -m'Le .gitignore dans le repo !'[master 4f50e11] Le .gitignore dans le repo ! 1 files changed, 3 insertions(+), 0 deletions(-) create mode 100644 .gitignore

MonProjet fsil$ groovy ../createFiles 3 logMonProjet fsil$ lsFichier_0.log! Fichier_1.txt! Fichier_3.txt! Fichier_6.txt! Fichier_9.txtFichier_0.txt! Fichier_2.log! Fichier_4.txt! Fichier_7.txtFichier_1.log! Fichier_2.txt! Fichier_5.txt! Fichier_8.txt

MonProjet fsil$ git status -s M Fichier_0.txt?? Fichier_2.txt?? Fichier_3.txt?? Fichier_4.txt?? Fichier_5.txt?? Fichier_6.txt?? Fichier_7.txt?? Fichier_8.txt?? Fichier_9.txt

22

Page 23: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Les groupes de fichiers Git

• Fichier «tracked»- fichier dans le repository ou dans l’aire d’embarquement

• Fichier «ignored»- fichier ignoré par git

• Fichier «untracked»- un fichier non ignoré et non «tracked»

23

Page 24: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Et les dossiers ?

• «Git tracks content not files !»• Un dossier n’apparaît dans le repository que si il contient

du contenu i.e des fichiers non vides !

24

Page 25: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Git débite à la Hash !

• Un repository Git est une base de donnée stockant 4 types d’objet

- Blob : un blob correspond au contenu d’un fichier

- Tree : descriptions du premier niveau d’un dossier

- Commit : description d’un commit

- Tags : alias sur un objet décrit précédemment• La valeur du hash code SHA1 d’un objet

- deux objets ayant le même contenu ont le même code SHA1

- le code SHA1 d’un objet est utilisé par Git comme identifiant de l’objet

- deux fichiers ayant le même contenu ne sont jamais dupliqués dans Git !

25

Page 26: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Restons branchés !

• La création de branches sur Git - facile et rapide

- à utiliser massivement

• Usages- développement de nouvelles fonctionnalités

- correction de bugs pour une version correspondant à une release

26

Page 27: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Création et utilisation d’une branche

MonProjet fsil$ git branch dev/198ticetime-book:MonProjet fsil$ git branch dev/198* master

MonProjet fsil$ git checkout dev/198M! Fichier_0.txtSwitched to branch 'dev/198'

MonProjet fsil$ git branch* dev/198 master

27

Page 28: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Création et utilisation d’une branche

MonProjet fsil$ git status# On branch dev/198# Changes not staged for commit:# (use "git add <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working directory)##! modified: Fichier_0.txt## Untracked files:# (use "git add <file>..." to include in what will be committed)##! Fichier_2.txt#! Fichier_3.txt#! Fichier_4.txt#! Fichier_5.txt#! Fichier_6.txt#! Fichier_7.txt#! Fichier_8.txt#! Fichier_9.txtno changes added to commit (use "git add" and/or "git commit -a")

28

Page 29: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

La fusion c’est pas dangereux ?

• Pas avec Git :-)• La commande «git merge <branche à fusionner>»- la branche courante fusionne avec la branche à fusionner

- si pas de conflit le commit correspondant au merge est créé

- si conflit : «git diff» pour résoudre le conflit et commiter

29

Page 30: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Et le développement collaboratif

• Cloner un repository existant- git clone <URL repository>

- Git supporte plusieurs protocoles : https, git, http...

$ git clone [email protected]:FranckSilvestre/MonPremierProjetGithub.gitCloning into 'MonPremierProjetGithub'...remote: Counting objects: 31, done.remote: Compressing objects: 100% (11/11), done.remote: Total 31 (delta 7), reused 31 (delta 7)Receiving objects: 100% (31/31), done.Resolving deltas: 100% (7/7), done.

30

Page 31: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Les branches d’un projet «cloné»

$ cd MonPremierProjetGithub/$ lsFichier_0.txt! Fichier_2.txt! Fichier_4.txt! Fichier_6.txt! Fichier_8.txtFichier_1.txt! Fichier_3.txt! Fichier_5.txt! Fichier_7.txt! Fichier_9.txt$ git status# On branch masternothing to commit (working directory clean)$ git branch -a* master remotes/origin/HEAD -> origin/master remotes/origin/dev/198 remotes/origin/master

Les branches sur le repository distant ( tracking branches) sont dissociées des branches sur le repository local.

31

Page 32: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Les «remotes»

• Un «remote» est un alias sur un repository distant• Un repository local peut déclarer autant de «remotes» qu’il

le souhaite• L’utilisation d’un «remote» n’est pas obligatoire pour

interagir avec un repository distant• Déclarer un «remote»

$ git remote add origin [email protected]:FranckSilvestre/MonPremierProjetGithub.git$ git remote -vorigin! [email protected]:FranckSilvestre/MonPremierProjetGithub.git (fetch)origin! [email protected]:FranckSilvestre/MonPremierProjetGithub.git (push)

32

Page 33: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Interagir avec un repository distant

• Synchroniser une branche locale- checkout sur la branche locale

- fetch de la branche distante

- merge des deux branches dans la branche locale

$ git checkout dev/198$ git pull origin master

Fusion de la branche master sur le remote dans la branche locale dev/198

• La commande pull- effectue le fetch de la branche distante puis le merge

- possibilité de séparer les deux actions avec commandes fetch et merge

33

Page 34: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Interagir avec un repository distant

• Répercuter les modifications de la branche locale sur une branche distante

$ echo "Modif fichier 4" >> Fichier_4.txt $ git add .$ git commit -m"fichier 4 modifié encore"[dev/198 f0cb3e4] fichier 4 modifié encore 1 files changed, 1 insertions(+), 0 deletions(-)$ git push origin dev/198Counting objects: 5, done.Delta compression using up to 8 threads.Compressing objects: 100% (3/3), done.Writing objects: 100% (3/3), 314 bytes, done.Total 3 (delta 1), reused 0 (delta 0)To [email protected]:FranckSilvestre/MonPremierProjetGithub.git 5d1cf0b..f0cb3e4 dev/198 -> dev/198

34

Page 35: Cours sur github part3 git

Ce(tte) oeuvre est mise à disposition selon les termes de la Licence Creative Commons Paternité - Pas d'Utilisation Commerciale 3.0 non transposé. 2012, tous droits réservés

Liens utiles pour la pratique

• http://schacon.github.com/git/gittutorial.html• http://gitref.org/

35