Guide Git pour Développeurs
Guide Git pour Développeurs
Gestionnaires de versions
Thomas Ropars
[Link]@[Link]
2022
1
Agenda
Introduction
GIT
Utilisation de Git
2
Agenda
Introduction
GIT
Utilisation de Git
3
Motivations
4
Motivations
4
Ce qu’on y stocke
Ce qu’on y met
• Fichier sources (.java, .c, .html, etc)
• Certains fichiers binaires non dérivés des sources (images)
• Fichiers de configuration, compilation (Makefile)
5
diff & patch
diff
• Comparaison de fichiers ligne par ligne
• Indique les lignes ajoutées ou supprimées
• Peut ignorer les casses, les tabulations, les espaces
patch
• Utilise la différence entre deux fichiers pour passer d’une
version à l’autre
6
diff & patch
Illustration
• Sauvegarder dans un patch les modifications d’un fichier
$ diff toto.c toto-orig.c > [Link]
7
La notion d’historique
A B C
D E
8
La notion d’historique
A B C
D E
8
Historique: les merges
A B C D G H
E F
9
Historique: les merges
A B C D G H
E F
9
Gestion des accès concurrents
Gestion pessimiste
• Un seul contributeur à accès en écriture à un fichier
• Pas de conflits
• Pas pratique
Gestion optimiste
• Chaque développeur peut modifier sa copie locale en parallèle
• Risques de conflits
▶ Modifications concurrentes de la même zone de texte
• Tous les VCS actuels ont une approche optimiste
10
Agenda
Introduction
GIT
Utilisation de Git
11
Avant de commencer . . .
Warning
Remarque introductive, présentation de GIT @ Google par Linus
Torvalds, 2007.
[Linus] is a guy who delights being cruel to people. His
latest cruel act is to create a revision control system which
is expressly designed to make you feel less intelligent than
you thought you were. [...] So Linus is here today to
explain to us why on earth he wrote a software tool which,
eh, only he is smart enough to know how to use.
12
Fondé sur une fonction de hachage
SHA-1
• Secure Hash Algorithm (cryptographie)
• Génère une empreinte des données d’entrée
▶ Contenu du fichier
▶ en-tête
• Propriétés:
▶ Hash de 160 bits
▶ Très faible probabilité de collision
• Identifie de manière unique chaque objet
Exemple
$ echo a > toto
$ sha1sum toto
3f786850e387550fdab836ed7e6dc881de23001b toto
$ echo b >> toto
05dec960e24d918b8a73a1c53bcbbaac2ee5c2e0 toto
13
Les objets dans Git
• Blobs
• Tree
• Commit
• Tag
14
Blob
Définition
On appelle Blob, l’élément de base qui permet de stocker le
contenu d’un fichier.
• Chaque Blob est identifié de manière unique par sa clé
• À chaque révision du fichier correspond un nouveau Blob
• Le Blob ne dépend pas du nom ou de l’emplacement :
▶ Si un fichier est renommé, pas de nouveau Blob
▶ Si un fichier est déplacé, pas de nouveau Blob
• Le contenu du Blob est compressé avec zlib. Il contient:
▶ Le type d’objet (blob)
▶ La taille du fichier initial
▶ Le contenu du fichier
15
Tree
Définition
Un Tree stocke la liste des fichiers d’un répertoire.
• Un Tree est un ensemble de pointeurs vers des Blobs et
d’autres Trees.
• Un Tree associe un nom de fichier (resp. répertoire) à chacun
des pointeurs de Blobs (resp. Trees).
• Un ensemble de Trees permet de décrire l’état d’une
hiérarchie de répertoires à un moment donné.
16
Tree et Blob: Exemple
tree
654b. . .
t bl
.tx a. oth
l e1 tx
t erD
i
fi r
[Link]
c09a. . . f371. . .
zzzz
cd82. . .
17
Tree et Blob: Exemple
tree
654b. . .
t bl
.tx a. oth
l e1 tx
t erD
i
fi r
[Link]
c09a. . . f371. . .
zzzz
cd82. . .
17
Tree et Blob: Exemple
tree
654b. . .
t bl
.tx a. oth
l e1 tx
t erD
i
fi r
[Link]
c09a. . . f371. . .
zzzz
cd82. . .
17
Commit
Définition
Un Commit stocke l’état d’une partie du dépôt à un instant donné.
Il contient :
• Un pointeur vers un Tree (arbre racine) dont on souhaite
sauver l’état.
• Un pointeur vers un ou plusieurs autres Commits pour
constituer un historique.
• Les informations sur l’auteur du Commit.
• Une description sous forme d’une chaı̂ne de caractères.
18
Exemple avec Commit
tree commit 1
654b. . . 89ad. . .
t bl
.tx a.t oth
1 xt erD
le i
fi r
[Link]
c09a. . . f371. . .
zzzz
cd82. . .
19
Exemple avec Commit: modification de [Link]
xt blatxt
bla
.t . .t oth ot
e1 e1 xt he
.tx
l l erD rD
fi ir
fi ir
t
ABcd abcd 1234 tree
a00a. . .
[Link]
3321. . . c09a. . . f371. . .
zzzz
cd82. . .
20
Exemple avec Commit: modification de [Link]
xt blatxt
bla
.t . .t oth ot
e1 e1 xt he
.tx
l l erD rD
fi ir
fi ir
t
ABcd abcd 1234 tree
a00a. . .
[Link]
3321. . . c09a. . . f371. . .
zzzz
cd82. . .
20
Exemple avec Commit: modification de [Link]
xt blatxt
bla
.t . .t oth ot
e1 e1 xt he
.tx
l l erD rD
fi ir
fi ir
t
ABcd abcd 1234 tree
a00a. . .
[Link]
3321. . . c09a. . . f371. . .
zzzz
cd82. . .
20
Les Tags
Définition
Un Tag permet d’identifier un des objets précédents à l’aide d’un
nom.
• Il contient un pointeur vers un Blob, un Tree ou un Commit.
• Typiquement utilisé pour identifier l’état du dépot au moment
d’une release.
21
Agenda
Introduction
GIT
Utilisation de Git
22
Les commandes
Exemple
23
Création d’un dépôt
24
Création d’un dépôt
Initialisation d’un dépôt
$ cd myproject
$ git init
$ git add .
$ git commit -m ’initial commit’
$ git remote add origin git@gitserver:/XX/XX/[Link]
$ git push origin master
Cloner un dépôt
$ git clone URL
26
Le cycle de vie d’un fichier
Versionné
27
Le cycle de vie d’un fichier
Versionné
27
Le cycle de vie d’un fichier
Versionné
27
Le cycle de vie d’un fichier
Versionné
27
Le cycle de vie d’un fichier
Versionné
27
Le cycle de vie d’un fichier
Versionné
27
Quelques commandes
28
Exemple de commit
Commit
$ echo "coucou" >[Link]
$ git add [Link]
$ git commit -m "description du commit"
29
État courant de votre répertoire de travail
$ git status
30
Les branches
Dans Git
• Une branche est un pointeur sur un commit
• Chaque commit pointe vers son prédécesseur
• La variable HEAD pointe sur la branche sur laquelle on
travaille actuellement.
31
Branche : les commandes.
branch : liste les branches avec une * pour la branche active.
branch <nom> : crée une nouvelle branche <nom>.
branch -m : permet de renommer une branche.
branch -d : permet de supprimer une branche.
checkout : change (ou/et crée) de branche active.
show-branch : affiche les branches et leurs commits.
Exemple
$ git branch
* master
$ git branch maBranche
$ git branch
maBranche
* master
$ git checkout maBranche
$ git branch
* maBranche
master
32
Branche : structure interne des commits.
ls
[Link] dir
head
master a4407
7126f
45463
ls
[Link] dir
head
7126f
45463
ls
[Link] dir
head
7126f
45463
ls
[Link] dir
touch [Link]
ls head
dir [Link] [Link]
git add [Link]
git commit -m "Add [Link]" 15e12 maBranche
master a4407
7126f
45463
ls
[Link] dir
touch [Link]
ls
dir [Link] [Link]
git add [Link]
git commit -m "Add [Link]" head 15e12 maBranche
7126f
45463
ls
[Link] dir
touch [Link]
ls
master maBranche
dir [Link] [Link]
git add [Link]
git commit -m "Add [Link]"
25b06 15e12
git checkout master
ls
a4407
dir [Link]
touch [Link]
git add [Link] 7126f
git commit -m "Add [Link]"
45463
ls
dir [Link] [Link]
master maBranche
25b06 15e12
a4407
7126f
45463
ls
dir [Link] [Link]
a4407
7126f
45463
head
ls
dir [Link] [Link]
master
git checkout maBranche
ls maBranche
dir [Link] [Link] 57669
45463
head
ls
dir [Link] [Link]
master
git checkout maBranche
ls
dir [Link] [Link] 57669
45463
• D’autres manières
▶ HEAD@yesterday
▶ [email protected]
33
Rebase
34
Rebase vs Merge.
head head
Commit 2 Commit 2
Commit 1 Commit 1
head
Commit 2 Commit 2
Commit 1 Commit 1
35
A propos de git checkout
36
Revenir en arrière
37
Amend : modification du dernier commit.
ls
[Link] dir head
master 15e12
a4407
7126f
45463
head
ls
[Link] dir master 4a439
touch [Link]
git commit -m "Ajou d’un fichier." 15e12
a4407
7126f
45463
head
ls
[Link] dir master 4a439
25b06 4a439
touch [Link]
git commit -m "Ajou d’un fichier." 15e12
45463
head
master Commit 3
Commit 2
Commit 1
Commit 2
Commit 1
38
Les différents type de reset.
ls -R ls -R ls -R
.: [Link] .: [Link] .: [Link]
dir: [Link] dir: [Link] dir: [Link]
head head
head
master master
master
ls -R ls -R ls -R
.: [Link] .: [Link] .: [Link]
dir: [Link] dir: [Link] dir: [Link]
git reset --hard 4546
ls -R
.: [Link]
head
head head
master
master master
Blob Blob
8983... 4f55...
Blob Blob Blob Blob
8983... 4f55... 8983... 4f55... [Link] [Link] v2
ls -R ls -R ls -R
.: [Link] .: [Link] .: [Link]
dir: [Link] dir: [Link] dir: [Link]
git reset --hard 4546 git reset 4546
ls -R ls -R
.: [Link] .: [Link]
dir: [Link]
head
head head
master
master master
ls -R ls -R ls -R
.: [Link] .: [Link] .: [Link]
dir: [Link] dir: [Link] dir: [Link]
git reset --hard 4546 git reset 4546 git reset --soft 4546
ls -R ls -R ls -R
.: [Link] .: [Link] .: [Link]
dir: [Link] dir: [Link]
39
Consulter des changements
40
Supprimer des fichiers
41
Agenda
Introduction
GIT
Utilisation de Git
42
Configurer git
43
Modifications d’un historique public
Règle générale
Ne jamais réécrire un historique publiquement accessible
• Attention à l’utilisation des commandes rebase et reset
• Ne pas utiliser push --force à moins de vraiment savoir ce
que vous faı̂tes
• Nettoyer son historique avant de le pousser si confus
44
Nettoyer son historique
Amend
La commande git commit --amend permet de modifier le dernier
commit et son message
Rebase interactif
$ git rebase -i CommitID
45
Ignorer des fichiers: gitignore
gitignore spécifie les fichiers non versionnés que git doit ignorer:
• Les fichiers déjà versionnés ne sont pas affectés.
• Définition à l’aide de patterns
46
Ignorer des fichiers: gitignore
47
Messages de commit
Le plus important
Décrire quoi et pourquoi et pas comment
• Ne pas décrire les modifications qui sont faites (informations
disponibles avec un diff)
• Décrire les fonctionnalités ajoutées
Exemple
• Bad: Modifie la fonction f pour tester la variable a
• Good: Vérifie les droits de l’utilisateur avant d’exécuter
l’action X
48
Messages de commit
49
Interface graphique
50
Agenda
Introduction
GIT
Utilisation de Git
51
Centralisé vs Distribué
Modèle centralisé
• Un serveur gère l’intégralité des version (le dépôt)
• Les utilisateurs y ajoutent leurs modifications
• Les utilisateurs y récupèrent les modifications des autres
Modèle distribué
• Chaque utilisateur possède un dépôt entier
• Les dépôts peuvent s’échanger des modifications
52
Modèle distribué
53
Branches distantes et branches locales
Définition
On appelle branche locale, une branche propre au dépôt local.
Pour être envoyées, les données d’une telle branche doivent être
fusionnées avec une branche distante.
54
Modèle distribué
git push
git commit
git pull
55
Modèle distribué
git push
git commit
git pull
55
Modèle distribué
git push
git commit
git pull
55
Modèle distribué
git push
git commit
git pull
55
Dépôts distants et gestion de la concurrence.
r
ste
ma
C1
git init
git add ...
git commit
r
ste
ste
/m
ma
ma
gin
ori
C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C2
C1 C1 C1
git commit
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C2 C2
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C2 C2 C2
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C2 C2 C2
C1 C1 C1
git merge
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C3
C2 C2 C2
C1 C1 C1
git commit
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C3 C4
C2 C2 C2
C1 C1 C1
git commit
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C4 C4
C3
C2 C2 C2
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C4 C4 C4
C3
C2 C2 C2
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C5
C4 C4 C4
C3
C2 C2 C2
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C5 C5
C4 C4 C4
C3 C3
C2 C2 C2
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
ma
ma
ma
gin
gin
ori
ori
C5 C5 C5
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
foo
ma
ma
ma
gin
gin
ori
ori
C5 C5 C5
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
foo
ma
ma
ma
gin
gin
ori
ori
C6
C5 C5 C5
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
git commit
ter
as
as
r
r
ste
ste
st e
/m
/m
foo
ma
ma
ma
gin
gin
ori
ori
C6 C7
C5 C5 C5
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
git commit
ter
as
as
r
r
ste
ste
st e
/m
/m
foo
ma
ma
ma
gin
gin
ori
ori
C7 C7
C6
C5 C5 C5
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
ter
as
as
r
r
ste
ste
st e
/m
/m
foo
foo
ma
ma
ma
gin
gin
ori
ori
C7 C7
C6 C6
C5 C5 C5
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
ter
o
as
as
/fo
r
r
ste
ste
st e
/m
/m
foo
foo
gin
ma
ma
ma
gin
gin
or i
ori
ori
C7 C7 C7
C6 C6
C5 C5 C5
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
ter
o
o
as
as
/fo
/fo
r
r
ste
ste
st e
/m
/m
foo
foo
gin
gin
ma
ma
ma
gin
gin
or i
or i
ori
ori
C7 C7 C7
C6 C6 C6
C5 C5 C5
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
ter
o
o
as
as
/fo
/fo
r
r
ste
ste
st e
/m
/m
r
foo
foo
gin
gin
ba
ma
ma
ma
gin
gin
or i
or i
ori
ori
C7 C7 C7
C6 C6 C6
C5 C5 C5
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
ter
o
o
as
as
/fo
/fo
r
r
ste
ste
st e
/m
/m
r
foo
foo
gin
gin
ba
ma
ma
ma
gin
gin
or i
or i
ori
ori
C7 C7 C7
C6 C6 C6
C5 C5 C5
C8
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
git commit
ter
r
o
o
ba
as
as
/fo
/fo
r
r
ste
ste
st e
ib/
/m
/m
r
foo
foo
gin
gin
ba
ma
ma
ma
ntr
gin
gin
or i
or i
co
ori
ori
C7 C7 C7
C6 C6 C6
C5 C5 C5
C8 C8
C4 C4 C4
C3 C3 C3
C2 C2 C2
C1 C1 C1
• [Link]
• [Link]
cours/01-Git/[Link]
• [Link]
[Link]
• [Link]
56
Références
• Notes de D. Donsez
• Notes de J. Sopena
• Notes de B. Goglin
• Notes de B. Florat
57
Plus de slides ...
58
Étude des objets générés par un exemple simple.
head
mkdir project
cd project master
git init
Index
mkdir project
cd project master
git init
Index
Blob
7a35...
[Link]
mkdir project
cd project master
git init
Blob
7a35...
[Link]
mkdir project
cd project master
git init
Blob Tree
7a35... 9a99...
[Link] dir
Blob
8983...
[Link]
mkdir project
cd project master
git init
[Link] dir
Blob
8983...
[Link]
mkdir project
cd project master
git init
Blob Blob
8983... 4f55...
[Link] [Link] v2
mkdir project
cd project master
git init
[Link] [Link] v2
mkdir project
cd project master
git init
[Link] [Link] v2
59
Merge : exemple sur un historique unique.
ls
[Link] dir
head
master a4407
7126f
45463
head
7126f
45463
head
7126f
45463
master a4407
7126f
45463
7126f
45463