1
Travailler à plusieurs avec
GitLab ou GitHub
Bruno Mermet
Université du Havre
2018
Bruno Mermet
2
Plan
● Présentation générale du principe
● Démarche avec gitlab
Bruno Mermet
3
Travailler à 2 avec git
Bruno Mermet
4
Travailler à 2 avec git
Fetch :
Les branches distantes
sont importées dans le
dépôt local avec un nom de
la forme
1: fetch dépôtDistant/nomBranche
Bruno Mermet
5
Travailler à 2 avec git
Fetch :
Les
Mergebranches
: distantes
sont importées
On fusionne dans
dans la le
dépôt
branchelocal avec un
courante la nom de
la forme distante de même
branche
1: fetch dépôtDistant/nomBranche
nom
2: merge
Bruno Mermet
6
Travailler à 2 avec git
Fetch :
Les
Merge branches
: distantes
sont
On importées
fusionne dans
dans la le
Commit
dépôt : avec un nom de
local
branche
On archivecourante la de la
le résultat
la forme
branche distante de même
1: fetch fusion
dépôtDistant/nomBranche
nom
2: merge
3: commit
Bruno Mermet
7
Travailler à 2 avec git
Fetch :
Les
Merge branches
: distantes
sont
On importées
fusionne dans
dans la le
Commit
dépôt : avec un nom de
local
branche
On archivecourante
le la de la
résultat
la forme
Push : distante de même
branche
1: fetch 4: push fusion
dépôtDistant/nomBranche
On transfère sur le dépôt
nom
distant l'historique de la
branche courante
2: merge
3: commit
Bruno Mermet
8
Travailler à 2 avec git
Fetch :
Les branches Pull
distantes
Merge :
sont
On importées
fusionne dans
dans la le
Commit
dépôt : avec un nom de
local
branche
On archivecourante
le la de la
résultat
la forme
Push : distante de même
branche
1: fetch 4: push fusion
dépôtDistant/nomBranche
On transfère sur le dépôt
nom
distant l'historique de la
branche courante
2: merge
3: commit
Bruno Mermet
9
Travailler à plusieurs avec git
1. Version complètement décentralisée
Bruno Mermet
10
Travailler à plusieurs avec git
2. Version complètement centralisée
Bruno Mermet
11
Travailler à plusieurs avec git
2. Version complètement centralisée
Bruno Mermet
12
Travailler à plusieurs avec git
3. En résumé…
● On travaille toujours avec 2 dépôts
– Le dépôt local
– Un dépôt « distant » (remote) auquel on associe un nom
● Les 4 principales commandes git permettant d’interagir avec
un dépôt distant sont :
– git fetch : on récupère en local le contenu du dépôt distant
– git pull : équivalent d’un git fetch suivi d’un git
merge
– git push : on transfère l’état actuel de la branche courante (et
son historique) vers le dépôt distant
– git clone : on crée un dépôt local à partir d’un dépôt distant
Bruno Mermet
13
Travailler à plusieurs avec git
4. Faciliter les choses
Gitlab
+ Interface
Web
Bruno Mermet
14
Gitlab et consorts (Github, Gitbucket)
Structure générale
Interface Gitlab
Web
Groupe 1 Groupe 2
Bruno Mermet
15
Gitlab et Github
Résumé
● Fonctionnalités offertes
– Gestion de multiples dépôts git, permettant de faciliter le travail à
plusieurs
– Interface Web pour interagir avec le dépôt git
– Gestion de « pull request » ou « merge requests »
– Approche de l'intégration continue
● Utilisation
– Soit depuis gitlab.com / github.com
– Soit via une installation locale (gratuite pour gitlab)
Bruno Mermet
16
Travailler à plusieurs avec un dépôt
commun
● Principe de base
– Dépôt « en ligne » accessible par tous, au moins
occasionnellement
– Chacun « clone » le dépôt commun sur sa machine
– Périodiquement :
● Mise à jour de son dépôt local à partir du dépôt commun
● Transfert de versions stables de son travail dans le dépôt
commun
● Principe « évolué »
– Faire un « fork » du dépôt commun et travailler avec ce dépôt
personnel distant
– Faire des « pull request » vers le dépôt commun lorsqu'on a atteint
une version stable sur son dépôt personnel distant
Bruno Mermet
17
Gestion de la synchronisation entre
dépôts
● Un dépôt est constitué
– D'un ensemble de « versions », identifiées par un « hash »
– D'un ensemble de « références » : branches et étiquettes
● Localement, un dépôt distant est identifié par un nom
● Une branche b du dépôt distant d est suivie localement par une branche de
suivi d/b
● L'action « fetch » récupère dans le dépôt local les versions disponibles sur
un dépôt distant et met à jour ou crée les branches de suivi
● L'action « pull » fait un « fetch » puis un « merge » dans une branche
locale b à partir de la branche de suivi associée (b/d par défaut)
● L'action « push » transfère la branche locale sur le serveur. Si une branche
de même nom n'existe pas sur le serveur, elle est créée. Sinon, si un « fast-
forward » peut être effectué, la branche sur le serveur est mise à jour.
Sinon, le « push » est refusé.
Bruno Mermet
18
Commencer avec gitlab
● Se rendre sur la page https://www-apps.univ-lehavre.fr/forge
● Se connecter avec le C.A.S. de l’université
→ Crée un groupe personnel
● Ajouter une clé SSH (menu en haut à droite, option « settings » puis
menu à gauche, option « SSH Keys »)
éventuellement, sur sa machine
● ssh-keygen
● Ssh-add
● Configurer la langue (Settings → Profile → Preferred Language)
● Créer éventuellement un ou plusieurs groupe(s) et y ajouter
éventuellement des membres (menu « Groups », bouton
Nouveau Groupe)
● Pour démarrer un projet, créer un dépôt dans le groupe adéquat
Bruno Mermet
19
Créer un projet dans Gitlab (1)
(Projects → New Project)
Nom du dépôt
Nom du groupe
Optionnel… donc
indispensable !
Bruno Mermet
20
Créer un projet dans GitLab (2)
Retour de GitLab (1)
URI SSH ou
HTTPS du dépôt
SSH : pas
d’identifiant à saisir
grâce à la clé SSH
HTTPS : connexion
possible depuis
l’extérieur de
l’université
Bruno Mermet
21
Créer un projet dans GitLab (2)
Retour de GitLab (1)
URI SSH ou
HTTPS du dépôt
Rappels sur la
configuration de git si
ce n’est pas déjà fait
Exemple d’utilisation si
ce dépôt est là pour
héberger un nouveau
projet
Bruno Mermet
22
Créer un projet dans GitLab (2)
Retour de GitLab (2)
Consignes pour
utiliser ce dépôt
pour héberger un
projet qui existe
déjà en local
Consignes pour
utiliser ce dépôt
pour héberger un
projet qui est déjà
hébergé sur un
autre dépôt
Bruno Mermet
23
Démarrer un nouveau projet
1. Cloner le dépôt GitLab
●
git clone [email protected]:mermetb/MonProjet.git
● tree
.
└── MonProjet
├── .git/
● cd MonProjet ; git remote -v
origin
[email protected]:mermetb/MonProjet.git (fetch)
origin
[email protected]:mermetb/MonProjet.git (push)
● git branch
● git log
fatal: bad default revision 'HEAD'
Bruno Mermet
24
Démarrer un nouveau projet
1. Cloner le dépôt GitLab
●
git clone [email protected]:mermetb/MonProjet.git
● tree
.
└── MonProjet
├── .git/
● cd MonProjet ; git remote -v
origin
[email protected]:mermetb/MonProjet.git (fetch)
origin
[email protected]:mermetb/MonProjet.git (push)
● git branch
Origin : nom
attribué (par défaut)
● au
gitdépôt GitLab
log
que l’on vient de
cloner. fatal: bad default revision 'HEAD'
Bruno Mermet
25
Démarrer un nouveau projet
2. Initialiser la branche master
● touch README.md
● git add .
● git commit -m « création fichier ReadMe »
[master (commit racine) 30d9696] creation fichier ReadMe
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.md
● git branch -vv
* master 30d9696 [origin/master: disparue] creation fichier ReadMe
La branche « master » actuelle est
sensée suivre la branche
« master » du dépôt initial, nommé
« origin », mais cette branche
distante n’existe pas encore
Bruno Mermet
26
Démarrer un nouveau projet
3. Transférer une première version sur
le serveur
● git push -u origin master
Nom de la branche devant être
transférée sur le dépôt (si non
spécifié, il s’agit de la branche
courante). Donc inutile ici.
Nom du serveur vers lequel
faire le transfert (si non
spécifié, transfert fait vers le
serveur par défaut ; voir git
remote -v). Donc inutile ici.
Raccourci de « --set-
upstream » : permet de fixer la
branche distante suivi par la
branche locale si ce n’es déjà
fait. Donc inutile ici.
Bruno Mermet
27
Démarrer un nouveau projet
3. Transférer une première version sur
le serveur
● git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 220 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://www-apps.univ-lehavre.fr/forge/mermetb/MonProjet.git
* [new branch] master -> master
● git branch -vv
* master 30d9696 [origin/master] creation fichier ReadMe
Bruno Mermet
28
Page d'accueil d'un projet (après
création d’une première version)
Bruno Mermet
29
Création d’un fichier « .gitignore »
standard
● Depuis la page d’accueil du projet, cliquer sur « Ajouter
un journal des modification »
Bruno Mermet
30
Création d’un fichier « .gitignore »
standard
● Depuis la page d’accueil du projet, cliquer sur « Ajouter
un journal des modification »
Choisir «.gitignore»
Bruno Mermet
31
Création d’un fichier « .gitignore »
standard
● Depuis la page d’accueil du projet, cliquer sur « Ajouter
un journal des modification »
Choisir «.gitignore»
Choisir «Java »
Bruno Mermet
32
Création d’un fichier « .gitignore »
standard
● Depuis la page d’accueil du projet, cliquer sur « Ajouter
un journal des modification »
Choisir «.gitignore»
Choisir «Java »
Cliquer pour valider
Bruno Mermet
33
Création d’un fichier « .gitignore »
standard
● Depuis la page d’accueil du projet, cliquer sur « Ajouter
un journal des modification »
Choisir «.gitignore»
Choisir «Java »
Cliquer pour valider
Bruno Mermet
34
Travailler sur une branche récupérée
depuis le serveur
● emacs Hello.java ; javac Hello.java
● git add Hello.java ; git commit -m ''création Hello''
4e2cf67 (HEAD, master) création Hello
8d46431 (origin/master, origin/HEAD) Initial commit
Bruno Mermet
35
Mise à jour d'une branche sur le serveur
Cas où le nom existe des 2 côtés
● git push
● git log --oneline --decorate
4e2cf67 (HEAD, origin/master, origin/HEAD, master) création Hello
8d46431 Initial commit
Bruno Mermet
36
Mise à jour d'une branche sur le serveur
Branche nouvelle en local (1)
● git checkout -b addition
● emacs Operation.java ; emacs Hello.java ; javac
Hello.java
● git add . ; git commit -m ''ajout Addition''
● git log --decorate --oneline --graph –all
* 1919fe4 (HEAD, addition) ajout Addition
* 4e2cf67 (origin/master, origin/HEAD, master) création Hello
* 8d46431 Initial commit
● git push
fatal: La branche courante addition n'a pas de branche amont.
Pour pousser la branche courante et définir la distante comme amont,
utilisez
git push --set-upstream origin addition
Bruno Mermet
37
Mise à jour d'une branche sur le serveur
Branche nouvelle en local (2)
● git push --set-upstream origin addition
● git log --decorate --oneline --graph --all
* 1919fe4 (HEAD, origin/addition, addition) ajout Addition
* 4e2cf67 (origin/master, origin/HEAD, master) création Hello
* 8d46431 Initial commit
● git config -l
…
remote.origin.url=https://github.com/mermet-iut/intro.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
branch.addition.remote=origin
branch.addition.merge=refs/heads/addition
Bruno Mermet
38
Transfert d'une étiquette locale sur le
serveur
● git tag -a ''v1.0''
● git log --oneline --decorate --graph --all
* 1919fe4 (HEAD, tag: v1.0, origin/addition, addition) ajout Addition
* 4e2cf67 (origin/master, origin/HEAD, master) création Hello
* 8d46431 Initial commit
● git push origin ''v1.0''
Bruno Mermet
39
Récupérer la dernière version
disponible sur le serveur
● Git pull (équivalent de git fetch + merge)
● Permet d'intégrer dans son travail la dernière version
disponible sur le serveur, et donc de prendre en compte
le travail des autres
Bruno Mermet
40
Afficher les branches distantes suivies
par les branches locales
● git branch -vv
● git status
● git status -sb
Bruno Mermet
41
Forks et Merge Requests
Bruno Mermet
42
Fork : Quid ? Cur ?
● Quid ?
Copie d'un dépôt GitLab, sous la forme d'un nouveau
dépôt GitLab
● Cur ?
– Ne pas autoriser n'importe qui à modifier le projet
principal
– Créer un nouveau projet à partir d'un projet existant
– Avoir un meilleur suivi des modifications
Bruno Mermet
43
Fork : Quomodo ?
Cliquer ici !
Bruno Mermet
44
Fork : Quomodo ?
Cliquer sur le
groupe dans
lequel « forker »
le projet
Bruno Mermet
45
Fork : Quomodo ?
Bruno Mermet
46
Fork : travail sur le nouveau dépôt
● cd intro
● emacs Hello.java
● git add .
● git commit -m ''ajout d'un Au Revoir''
● git push
Bruno Mermet
47
Merge Request (1)
● Merge Request : Quid ?
Demande d'intégration du travail fait
● Soit d’un « fork » dans le dépôt principal
● Soit d’une branche vers une autre
● Cur ?
– Prévenir un autre développeur qui validera la demande
de fusion
– Prévenir le propriétaire du dépôt d’origine qu’on a fait un
travail qu’il est susceptible d’intégrer dans son projet
Bruno Mermet
48
Merge Request (2)
Quomodo ?
Cliquer là Puis là !
Bruno Mermet
49
Merge Request (3)
Dépôt de la branche cible
Dépôt de la branche à intégrer
branche cible
branche à intégrer
Messages des derniers commits
Cliquer ici
Bruno Mermet
50
Merge Request (4)
Modification
éventuellement le
titre
Expliquer le but
de la modification
Affecter la tâche
de relecture
éventuellement à
un contributeur
Voir le cours sur la gestion de
précis projet avec GitLab
Pour rendre
automatique la
suppression de la
branche sur le
serveur Cliquer ici
Bruno Mermet
51
Merge Request
Côté destination (1) vs Côté source
Bruno Mermet
52
Merge Request
Côté destination (1) vs Côté source
Cliquer ici
Bruno Mermet
53
Merge Request
Côté destination (1) vs Côté source
Cliquer ici
Bruno Mermet
54
Fork et Pull Request Cliquer ici pour
refuser
Côté destination (2) définitivement !
Cliquer ici si on
est d'accord !
Remplir et cliquer si on
veut d'abord
commenter ou
discuter !
Bruno Mermet
55
Se synchroniser avec les évolutions
faites sur le dépôt commun
● git pull (équivalent à git fetch + merge)
* ae61556 (HEAD, origin/master, origin/HEAD, master) Merge pull request #1 fro
|\
| * a2b0d08 Ajout d'un Au Revoir
|/
| * 1919fe4 (tag: v1.0, origin/addition, addition) ajout Addition
|/
* 4e2cf67 création Hello
* 8d46431 Initial commit
Bruno Mermet
56
Fork : synchroniser la copie avec le
dépôt initial : initialiser le processus
● Possible uniquement via la ligne de commande !
– Depuis le clone du « fork »
– git remote -v
origin https://UrlGitLab/depotFork.git (fetch)
origin https://UrlGitLab/depotFork.git (push)
– git remote add upstream https://github.com/depotInitial.git
– git remote -v ; git branch -a
origin https://UrlGitLab/depotFork.git (fetch)
origin https://UrlGitLab/depotFork.git (push)
upstream https://UrlGitLab/depotInitial.git (fetch)
upstream https://UrlGitLab/depotInitial.git (push)
creationAffectation
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
Bruno Mermet
57
Fork : synchroniser la copie avec le
dépôt initial : effectuer la mise à jour
● git fetch upstream
● git branch -a
creationAffectation
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/upstream/master
● git merge upstream/master
Merge made by the 'recursive' strategy.
TestTrain.java | 9 ++++++++-
train/Train.java | 20 +++++++++++++++++++-
2 files changed, 27 insertions(+), 2 deletions(-)
● git push
Bruno Mermet
58
Et encore plus...
● Git permet de faire beaucoup d'autres choses, à découvrir avec
la documentation indiquée (git help, Pro Git), notamment :
– Le retour en arrière (git reset notamment)
– Complétion du commit précédent fait trop vite (git commit --
amend)
– Le repositionnement d'une branche sur une version quelconque
(git rebase)
– Un stockage temporaire d'un travail non finalisé (git stash)
– Comparer différentes versions (git diff)
– …
● Certaines opérations de Git peuvent être risquées… L'intérêt du
dépôt commun est de pouvoir à tout moment revenir à une
version correcte
Bruno Mermet
59
Pour vos projets
● Le « responsable git »
– Crée le dépôt Github
– Choisit la méthode utilisée pour travailler (via des forks
et des Pull/Merge Requests, ou pas…)
● Pour le développement d'une fonctionnalité
– Créer une branche (à partir du dépôt de base ou d'un
fork)
– Développer, tester, documenter la fonctionnalité, en
récupérant régulièrement la dernière version disponible
sur le dépôt et en la fusionnant dans sa branche
– Lorsque la fonctionnalité est terminée, la ré-intégrer dans
le tronc, supprimer la branche, transférer sur le serveur,
prévenir l'équipe
Bruno Mermet
60
Développement d'une fonctionnalité
sans validation par un tiers : démarche
On part de la dernière version du tronc git checkout master
git pull
On crée la nouvelle branche et on travaille
git checkout -d fonc
dedans
while (!terminé) {
Coder et documenter
On développe la nouvelle fonctionnalité par
Compiler
étapes. On ne fait de « commit » que de
Tester
versions correctes
git commit
On peut utiliser le serveur pour
sauvegarder des phases intermédiaires (Éventuellement, git push)
}
On revient sur le tronc git checkout master
On récupère la dernière version git pull
On intègre dans le tronc la fonctionnalité git merge fonc
On supprime la branche git branch -d fonc
On transfère la modif. sur le serveur git push
Bruno Mermet
61
Développement d'une fonctionnalité
avec validation par un tiers : démarche
On part de la dernière version du tronc git checkout master
git pull
On crée la nouvelle branche et on travaille
git checkout -d fonc
dedans
while (!terminé) {
Coder et documenter
On développe la nouvelle fonctionnalité par
Compiler
étapes. On ne fait de « commit » que de
Tester
versions correctes
git commit
On peut utiliser le serveur pour
sauvegarder des phases intermédiaires (Éventuellement, git push)
}
Créer une pull/merge
Depuis GitHub/GitLab,
request créer une pull/merge request
Validation ou non par le tiers après discussion
Validation ou non par le tiers après discussion éventuelle
éventuelle
On repasse sur le tronc git checkout master
On supprimer la branche git branch -d fonc
On synchronise son tronc git pull
Bruno Mermet