Le systŁme de gestion de version Git et GitHub
GØnie Logiciel - MPRI
Lucca Hirschi
d’aprŁs des slides de Nathan Grosshans
6 octobre 2016
Introduction
SystŁme de gestion de version
SystŁme logiciel permettant de maintenir et gØrer toutes les
versions d’un ensemble de (cid:28)chiers.
Pourquoi un systŁme de gestion de version ?
(cid:73) Revenir aisØment (cid:224) une version prØcØdente.
(cid:73) Suivre l’Øvolution du projet au cours du temps.
(cid:73) Permettre le travail en parallŁle sur des parties disjointes du
projet et gØrer les modi(cid:28)cations concurrentes.
(cid:73) Faciliter la dØtection et la correction d’erreurs.
(cid:73) ...
Ouvrage de rØfØrence
http://git-scm.com/book
Di(cid:27)Ørents types de systŁmes de gestion de version
SystŁme de gestion de version local
Avantages
InconvØnients
(cid:73) Gestion et utilisation trŁs
simples.
(cid:73) Est trŁs sensible aux pannes.
(cid:73) Ne permet pas la collaboration.
Di(cid:27)Ørents types de systŁmes de gestion de version
SystŁme de gestion de version centralisØ
Avantages
InconvØnients
(cid:73) Structurellement simple.
(cid:73) Gestion et utilisation simples.
(cid:73) Est trŁs sensible aux pannes.
(cid:73) InadaptØ aux trŁs grands projets
et/ou avec une forte structure
hiØrarchique.
Di(cid:27)Ørents types de systŁmes de gestion de version
SystŁme de gestion de version distribuØ
Avantages
InconvØnients
(cid:73) Moins sensible aux pannes.
(cid:73) AdaptØ aux trŁs grands projets
et/ou avec une forte structure
hiØrarchique.
(cid:73) Gestion et utilisation plus
compliquØes.
(cid:73) Peut devenir trŁs complexe
structurellement.
Git
Carte d’identitØ
SystŁme de gestion de version distribuØ (DVCS).
Bref historique (Wikipedia)
(cid:73) De 1991 (cid:224) 2002, le noyau Linux Øtait dØveloppØ sans utiliser de
systŁme de gestion de version.
(cid:73) A partir de 2002, la communautØ a commencØ (cid:224) utiliser
BitKeeper, un DVCS propriØtaire.
(cid:73) En 2005, suite (cid:224) un contentieux, BitKeeper retire la possibilitØ
d’utiliser gratuitement son produit. Linus Torvalds lance le
dØveloppement de Git et aprŁs seulement quelques mois de
Advertisement
dØveloppement, Git hØberge le dØveloppement du noyau Linux.
Git
Les principes de base
Un dØp(cid:244)t Git est une sorte de systŁme de (cid:28)chiers (base de
donnØes), enregistrant les versions de (cid:28)chiers d’un projet (cid:224) des
moments prØcis au cours du temps sous forme d’instantanØs.
Comment fonctionne le processus de versionnement ?
Git
Les principes de base
3 sections d’un projet Git :
(cid:73) Le rØpertoire Git/dØp(cid:244)t :
contient les mØta-donnØes et la
base de donnØes des objets du
projet.
(cid:73) Le rØpertoire de travail :
extraction unique d’une version
du projet depuis la base de
donnØes du dØp(cid:244)t.
(cid:73) La zone de transit/d’index :
simple (cid:28)chier contenant des
informations (cid:224) propos de ce qui
sera pris en compte lors de la
prochaine soumission.
Git
Les principes de base
4 Øtats d’un (cid:28)chier dans Git :
(cid:73) non versionnØ : (cid:28)chier n’Øtant
pas ou plus gØrØ par Git ;
(cid:73) non modi(cid:28)Ø : (cid:28)chier sauvegardØ
de maniŁre sßre dans sa version
courante dans la base de
donnØes du dØp(cid:244)t ;
(cid:73) modi(cid:28)Ø : (cid:28)chier ayant subi des
modi(cid:28)cations depuis la derniŁre
fois qu’il a ØtØ soumis ;
(cid:73) indexØ (staged) : idem, sauf qu’il
en sera pris un instantanØ dans
sa version courante lors de la
prochaine soumission (commit).
Git
Les principes de base
Chaque soumission (commit) donne lieu (cid:224) la crØation d’un objet
(cid:16)commit(cid:17) contenant un pointeur vers un instantanØ du contenu
dont les modi(cid:28)cations Øtaient indexØes au moment de la soumission
(ensemble d’objets permettant de stocker un instantanØ des (cid:28)chiers
concernØs d’une part et de reproduire la structure du rØpertoire
projet et de ses sous-rØpertoires d’autre part), quelques
mØta-donnØes (auteur, message) et un pointeur vers l’objet
(cid:16)commit(cid:17) prØcØdent.
Git
Les commandes de base
Initialiser un dØp(cid:244)t
$ git init
A(cid:30)cher l’Øtat des (cid:28)chiers du rØpertoire courant
$ git status
(cid:73) Untracked (cid:28)les : (cid:28)chiers non versionnØs.
(cid:73) Changes to be committed : modi(cid:28)cations (ajout, suppression,
changements) chargØes en zone de transit (staging area), ou
indexØes.
(cid:73) Changes not staged for commit : modi(cid:28)cations n’ayant pas ØtØ
Advertisement
chargØes en zone de transit (ou indexØes).
Git
Les commandes de base
Indexer l’ajout ou les changements d’un (cid:28)chier
$ git add [-p] <fichier>
Annuler les modi(cid:28)cations indexØes d’un (cid:28)chier
$ git reset <fichier>
Annuler les modi(cid:28)cations non encore indexØes d’un (cid:28)chier
$ git checkout [--] <fichier>
Indexer la suppression d’un (cid:28)chier
$ git rm <fichier>
DØversionner un (cid:28)chier
$ git rm --cached <fichier>
Git
Les commandes de base
A(cid:30)cher le dØtail des modi(cid:28)cations non indexØes
$ git diff
A(cid:30)cher le dØtail des modi(cid:28)cations indexØes
$ git diff --staged
Soumettre les modi(cid:28)cations indexØes en zone de transit
$ git commit
Voir l’historique des soumissions
$ git log
Git
Branches
Qu’est-ce qu’une branche dans un projet ?
C’est une ligne d’Øvolution
divergent de la ligne
d’Øvolution courante, celles-ci
se poursuivant
indØpendemment l’une de
l’autre.
Pourquoi des branches ?
(cid:73) Pouvoir se lancer dans des Øvolutions ambitieuses en ayant
toujours la capacitØ de revenir (cid:224) une version stable que l’on
peut continuer (cid:224) maintenir indØpendemment.
(cid:73) Pouvoir tester di(cid:27)Ørentes implØmentations d’une mŒme
fonctionnalitØ de maniŁre indØpendante.
Git
Branches
Une branche dans Git est tout simplement un pointeur vers un objet
(cid:16)commit(cid:17). Par dØfaut, il en existe une seule, nommØe (cid:16)master(cid:17).
CrØer une nouvelle branche
$ git branch <branche>
HEAD est un pointeur spØcial vers la
branche sur laquelle on travaille
actuellement (extraite dans le
rØpertoire de travail).
Git
Branches
Voir les branches du dØp(cid:244)t local
$ git branch
Supprimer une branche
$ git branch -d <branche>
Passer (cid:224) une branche donnØe (mise (cid:224) jour de l’index et du
rØpertoire de travail, ainsi que du pointeur HEAD)
$ git checkout <branche>
(cid:32)
Git
Branches
Advertisement
Deux fa(cid:231)ons pour incorporer les modi(cid:28)cations d’une branche dans
la branche courante.
Fusionner (merge)
Rebaser (rebase)
Git
Branches
Fusionner les modi(cid:28)cations d’une branche donnØe dans la
branche courante (HEAD)
$ git merge <branche>
(cid:73) Si l’objet (cid:16)commit(cid:17) pointØ par <branche> est dØj(cid:224) un ancŒtre
de l’objet (cid:16)commit(cid:17) courant (HEAD), alors rien n’est fait.
(cid:73) Si l’objet (cid:16)commit(cid:17) pointØ par <branche> est un descendant
de l’objet (cid:16)commit(cid:17) courant, seul le pointeur de la branche
courante est dØplacØ sur l’objet (cid:16)commit(cid:17) concernØ par la
fusion ((cid:16)fast-forward(cid:17)).
(cid:32)
Git
Branches
(cid:73) Autrement, Git se base sur trois instantanØs di(cid:27)Ørents, celui de
l’objet (cid:16)commit(cid:17) courant, celui de l’objet (cid:16)commit(cid:17) pointØ par
<branche> et celui de l’objet (cid:16)commit(cid:17) correspondant au plus
jeune ancŒtre commun des deux premiers objets (cid:16)commit(cid:17),
pour crØer un nouvel instantanØ associØ (cid:224) un nouvel objet
(cid:16)commit(cid:17) par la fusion de deux branches, sur lequel la branche
courante pointera (cid:224) prØsent.
(cid:32)
Git
Branches
En cas de con(cid:29)it empŒchant la fusion
(cid:73) Aucun objet (cid:16)commit(cid:17) de fusion n’est crØØ, mais le processus
est mis en pause.
(cid:73) git status donne les (cid:28)chiers n’ayant pas pu Œtre fusionnØs
(listØs en tant que (cid:16)unmerged(cid:17)).
(cid:73) Git ajoute des marqueurs de rØsolution de con(cid:29)its (cid:224) tout (cid:28)chier
sujet (cid:224) con(cid:29)its a(cid:28)n que ceux-ci puissent Œtre rØsolus (cid:224) la main.
(cid:73) Pour marquer les con(cid:29)its dans un (cid:28)chier <fichier> comme
rØsolus, il faut faire git add <fichier>. On peut, aprŁs
rØsolution de tous les con(cid:29)its, soumettre les modi(cid:28)cations sous
forme d’objet (cid:16)commit(cid:17) de fusion avec git commit et
terminer ainsi le processus de fusion.
Git
Branches
Rebaser les modi(cid:28)cations de la branche courante (HEAD) sur
une branche donnØe
$ git rebase <branche>
(cid:73) Aller (cid:224) l’objet (cid:16)commit(cid:17) correspondant au plus jeune ancŒtre
commun des deux objets (cid:16)commit(cid:17) pointØs par la branche
courante et <branche>.
(cid:73) Obtenir et sauvegarder les changements introduits depuis ce
point par chaque objet (cid:16)commit(cid:17) de la branche courante.
(cid:73) Faire pointer la branche courante sur le mŒme objet (cid:16)commit(cid:17)
que <branche> et rØappliquer tous les changements un par un.
(cid:32)
Git
Travail avec des dØp(cid:244)ts distants
Pour collaborer, il est nØcessaire de communiquer et d’Øchanger
avec un ou plusieurs dØp(cid:244)ts distants hØbergeant le mŒme projet
(typiquement des dØp(cid:244)ts publics associØs (cid:224) une personne, une
Øquipe ou tout le projet).
Les donnØes des dØp(cid:244)ts distants (objets (cid:16)commit(cid:17) et instantanØs)
Advertisement
sont entiŁrement copiØes dans le dØp(cid:244)t local, et pour chaque
branche <branche> d’un dØp(cid:244)t distant <dØp(cid:244)t> est maintenue une
branche locale <dØp(cid:244)t>/<branche> non modi(cid:28)able, permettant de
suivre la position de <branche> sur <dØp(cid:244)t> localement.
A(cid:30)cher la liste de tous les dØp(cid:244)ts distants du projet
$ git remote
Git
Travail avec des dØp(cid:244)ts distants
Cloner un dØp(cid:244)t distant (automatiquement nommØ origin)
$ git clone <URL> [<rØpertoire>]
(cid:32)
Git
Travail avec des dØp(cid:244)ts distants
RØcupØrer les modi(cid:28)cations d’un dØp(cid:244)t distant
$ git fetch <dØp(cid:244)t>
Git
Travail avec des dØp(cid:244)ts distants
Ajouter un dØp(cid:244)t distant
$ git remote add <nom> <URL>
(cid:32)
Git
Travail avec des dØp(cid:244)ts distants
Mettre (cid:224) jour un dØp(cid:244)t distant donnØ pour une certaine
branche locale
$ git push <dØp(cid:244)t> <branche>
Attention : ceci fonctionne uniquement si le dernier objet (cid:16)commit(cid:17)
de la branche concernØe du dØp(cid:244)t distant a ØtØ rØcupØrØ et intØgrØ
dans la branche en question du dØp(cid:244)t local, en d’autres termes si la
mise (cid:224) jour de la branche du dØp(cid:244)t distant peut Œtre faite par
(cid:16)fast-forward(cid:17).
Combiner git fetch et git merge
git pull <dØp(cid:244)t> <branche>
Combiner git fetch et git rebase
git pull --rebase <dØp(cid:244)t> <branche>
Git
Conseils, bonnes pratiques
Conseils
(cid:73) User et abuser des branches.
(cid:73) Eviter de systØmatiquement faire un git pull, mais rØ(cid:29)Øchir
(cid:224) ce qu’il est le plus pertinent de faire (fusionner ou rebaser).
Bonnes pratiques
(cid:73) Ne jamais rebaser une branche dØj(cid:224) prØsente sur un dØp(cid:244)t
public.
(cid:73) Respecter les conventions de formattage du message de
soumission : titre de 50 caractŁres au plus, suivi d’une ligne
vide puis d’une description dØtaillØe avec des lignes de 72
caractŁres au plus, le tout au prØsent de l’impØratif
(http://tbaggery.com/2008/04/19/
a-note-about-git-commit-messages.html).
GitHub
(cid:73) Service web d’hØbergement et de gestion de projets de
dØveloppement logiciel utilisant le systŁme de gestion de
version Git.
(cid:73) En plus de ce systŁme, on trouvera tout un Øco-systŁme
incluant notamment un Wiki et un systŁme de tickets (avec
MarkDown et rØfØrencement des tickets).
(cid:73) https://help.github.com/
Fin
Des questions ?