Vous êtes sur la page 1sur 71

Introduction Git

MARIUS SERENDIP LOMBARD-PLATET SERENDIP@VIA.ECP.FR


QUENTIN DEGEMER MADEC DEGEMER@VIA.ECP.FR

Sommaire
I. Les bases
II. Un peu plus loin
III. Encore plus loin
IV. Annexes
2

Les bases
AU COMMENCEMENT TAIT LE .GIT

Le principe
Travailler plusieurs sur le
mme projet sans se gner
Garder un historique des
versions (commits)

Git : un gestionnaire de version


Dpt central hberg par
Gitlab/Github/Nimporte
quel systme bas sur git

Chaque dveloppeur a son


espace local (sur son
ordinateur)
Git repose sur un systme
de commits

Quentin

Marius

Gertrude

Gitlab

Les commits, c'est quoi ?


Quand un bout de code est Un commit, c'est donc une
satisfaisant, on l'enregistre
version du code un instant
dans un commit
donn

Git sauvegarde alors cette


nouvelle version du code

Cela permet d'annuler


facilement des
modifications, ou de
regarder ce qu'ont fait les
autres.
6

Gitlab
Interface web pour git
Facilite le code-review
Dpts publics/privs
Et quelques plugins
intressants : Issues,
Network,

Une plateforme pour les hberger tous,


Une plateforme pour les forker,
Une plateforme pour les cloner tous,
Et dans les merge requests les lier.

https://gitlab.my.ecp.fr

Identification CAS

Attention : pour utiliser Gitlab, il vous

faudra renseigner une cl SSH


https://gitlab.my.ecp.fr/profile/keys/new

Pour la gnrer :
https://help.github.com/articles/generatingssh-keys

Installation

( faire une seule fois par ordinateur)

Unix
Linux : (sudo) apt-get install git
Mac : http://sourceforge.net/projects/git-osxinstaller/

Lancer un terminal

Windows

Tlcharger Git : http://gitscm.com/download/win


Installer en gardant les options par dfaut
Lancer Git Bash

Utilisateurs de linux : pensez rajouter lautocompltion !


8

Configuration

( faire une seule fois par ordinateur)

Configuration globale

Cration cl ssh

git config --global user.name


"Quentin Madec"

mkdir .ssh

git config --global user.email


quentin.madec@student.ecp.fr

cd .ssh
ssh-keygen -t rsa C
"votreadresse@student.ecp.fr"

Laissez les options par dfaut,


sauf si vous savez ce que vous faites
Mot de passe ? Plus pnible quautre
chose si le projet nest pas sensible

Configuration

( faire une seule fois par ordinateur)

Rcuprer la cl publique
Linux/Mac : cat
Windows :

id_rsa.pub

Rajouter la cl sur Gitlab


Aller dans Profile Settings >
SSH Keys > add SSH key

notepad.exe id_rsa.pub

Coller la clef publique obtenue


prcdemment

10

Crer un projet

( faire pour chaque nouveau projet)

Crer le dpt local


mkdir nom-du-projet

Crer le dpt distant


Sur Gitlab, crez un nouveau projet

cd nom-du-projet
git init

Relier les deux

touch README

Sur votre ordinateur,

git add README

git remote add origin


git@gitlab.my.ecp.fr:loginMyECP
/NomDuProjet.git
(en une ligne)

git commit -m "first commit"

11

Rcuprer un projet

(travailler sur le projet d'un autre)

Demandez rentrer dans le Clonez le dpt


projet :
git clone
Par l'admin du projet, sur la page
Gitlab du projet :
Settings > Members, au moins les
droits Developer pour pouvoir
contribuer

git@gitlab.my.ecp.fr:URIduProjet
.git
(en une ligne)

cd nom-du-projet

12

Add : signaler une modification/cration


git add <fichier>

Signale git la
cration/modification dun
fichier prt tre sauvegard
A faire avant
lenregistrement (le commit)

13

Status : vrifier ltat de son dpt


git status

Vrification de ltat de son


dpt local : quelle branche,
quel commit,
Et surtout quels fichiers ont
t git add

14

Commit : enregistrer une modification


git commit m "Mon super
commit"

Git enregistre les


modifications des fichiers
ayant t git add

modifier

git
commit

git
status

Commits identifis par un


hash SHA1 :
4961019d387f86449d4d2ca8a9ec37
9ed05006c8

git
status

git
add

15

Commit early and often


Git vous aide seulement si vous committez

16

Commit early and often


Git vous aide seulement si vous committez
vite les pertes de donnes

17

Commit early and often


Git vous aide seulement si vous committez
vite les pertes de donnes

Rend la progression plus lisible

18

Commit early and often


Git vous aide seulement si vous committez
vite les pertes de donnes

Rend la progression plus lisible


Possibilit de nettoyer son historique de commits avant le push

19

Commit : encore et toujours


git commit

Git ouvre alors un fichier de


commit avec votre diteur
par dfaut (vim)
git commit -a

git commit tous les fichiers


modifis quil connait
20

Pull : rcuprer les modifications


git pull <remote> <branche>

git pull origin master (par dfaut)

Pull permet de rcuprer


les derniers commits
Attention : risque de conflits
avec vos modifications

Local

git pull

Remote
(Gitlab)

21

Un conflit !
Quand deux personnes
modifient le mme fichier en
mme temps, il y a conflit
Si git ne sait pas le rsoudre,
il faudra le faire la main
dans les fichiers indiqus

22

Rsolution du conflit
Dans le fichier :
Entre <<<<<<< HEAD et =======
se trouve votre code
Entre ======= et >>>>>>>
<hash> celui du dpt distant
Choisissez le bon ! (et
supprimez les >>>>> et autres)

23

Rsolution du conflit (2)


git

add <fichiers
en conflit>

git

commit

24

Push : envoyer ses commits Gitlab


git push <remote> <branche>

git push origin master (par dfaut)

Publie vos commits sur le

dpts central
Pas de retour en arrire !

Les commits publis ne


changeront pas !

25

C'est quoi les <remote> ?


Les <remote> indiquent qu'on s'adresse au dpt distant
(Gitlab)

C'est un alias pour git@gitlab.my.ecp.fr:Login/Projet.git


Par dfaut, cet alias s'appelle origin. L o vous lisez
<remote>, vous devrez donc crire origin.
26

Un peu plus loin


GIT BROTHER IS WATCHING YOU

27

Cycle de vie dun fichier

28

Cycle de vie dun fichier


touch <fichier>
<fichier>

29

Cycle de vie dun fichier


touch <fichier>

git add <fichier>

<fichier>

30

Cycle de vie dun fichier


touch <fichier>

git add <fichier>

<fichier>

git commit m "Mon super


commit"

31

Cycle de vie dun fichier


touch <fichier>

git add <fichier>

<fichier>

git commit m "Mon super


commit"
vim <fichier>

32

Cycle de vie dun fichier


touch <fichier>

git add <fichier>

<fichier>

git commit m "Mon super


commit"
vim <fichier>
git add <fichier>

33

Cycle de vie dun fichier


touch <fichier>

git add <fichier>

<fichier>

git commit m "Mon super


commit"
vim <fichier>
git add <fichier>
git commit m "Such commit"

34

HEAD : mais o suis-je ?

632d4d

496101

40e7cc

f75c1e

35

HEAD : mais o suis-je ?


HEAD

632d4d

496101

40e7cc

f75c1e

Je me trouve l'tat normal (au niveau du dernier commit)


36

HEAD : mais o suis-je ?


HEAD^

632d4d

496101

40e7cc

f75c1e

Je me trouve l'tat du commit prcdent


37

HEAD : mais o suis-je ?


HEAD^^

632d4d

496101

40e7cc

f75c1e

Je me trouve l'tat d'il y a 2 commits


38

HEAD : mais o suis-je ?


HEAD~3

632d4d

496101

40e7cc

f75c1e

Etc. Notez le changement de notation au-del de HEAD^^


39

Log : regarder les derniers commits


git log

Historique de tous les


commits
git log --pretty=oneline

Vue plus rapide des


commits

40

Diff : comparer deux commits


git diff e78ab21 d454de

Comparaison de deux
commits (identifis par leur
SHA)
Montre les
additions/suppressions

Mettre juste le dbut des


SHA des commits
41

Rm/mv : dplacer/supprimer des fichiers


git rm <fichier>

Supprime le fichier et
luntrack
git mv <ancien fichier>
<nouveau fichier>

Git renomme le fichier (le


changement apparaitra dans
le prochain commit)

42

Annuler un git add


git reset HEAD <fichier>

Annule un git add fait


prcdemment

: annule les
modifications du fichier
git reset HEAD --hard <fichier>

43

.gitignore : donnes sensibles ou inutiles


https://github.com/epoch/contact_form_app/blob/33f53bc1a1df88565b46e0d37d55194e05c5
be0c/.env

Crer/modifier le .gitignore la racine du projet


lib.so : le fichier lib.so sera ignor
*.so : tous les fichiers en .so seront ignors
conf/ : tous les fichiers du dossier conf seront ignors
conf/**/*.yml : tous les fichiers .yml de tous les sous-dossiers
de conf/ seront ignors

44

Toujours plus loin


GIT, A VOUS BRANCHE ?

45

Git et les branches : une histoire d'amour


Les branches, kzako ?

Mieux ordonner son espace de dveloppement


Travailler sur plusieurs bouts de code en mme temps, sans
interfrences

46

Git et les branches : une histoire d'amour


Les branches, kzako ?

Mieux ordonner son espace de dveloppement


Travailler sur plusieurs bouts de code en mme temps, sans
interfrences

Exemple :
Une branche de dveloppement (dev), une branche de production
(master)
Plusieurs branches de dveloppement ! Une par fonctionnalit
47

Exemple de branches
dev

Commit
45fa9f8

master

Commit
45fa9f8

tat initial : dev et


master sont dans le
mme tat

48

Exemple de branches
dev

Commit
45fa9f8

master

Commit
45fa9f8

Commit
54ea241

Je fais un commit sur


dev, je pushe pour que
les autres puissent y
avoir accs.
Notez que master ne voit
aucun changement.

49

Exemple de branches
dev

Commit
45fa9f8

master

Commit
45fa9f8

Commit
54ea241

Commit
8ed65ab

Idem

50

Exemple de branches
dev

Commit
45fa9f8

master

Commit
45fa9f8

Commit
54ea241

Commit
8ed65ab

Merge
branch

Mes modifications sont


prtes tres mises en
prod, je mets la branche
master jour.
A ce moment, master
contient les
modifications faites sur
dev.

51

Exemple de branches
nouvellefonctionnalit

master

Commit
5d6b287

Commit
45fa9f8

Commit
54ea241

Je suis en train de
dvelopper une nouvelle
fonctionnalit, je suis sur
la branche nouvellefonctionnalit.
Mon code n'est pas
encore destin tre mis
en prod.

52

Exemple de branches
nouvellefonctionnalit

master

idee-cool

Commit
5d6b287

Commit
54ea241

Quand soudain, me vient


une ide super cool.
Ni une ni deux, je cre
une nouvelle branche
partir de master.

Commit
45fa9f8

Commit
5d6b287

53

Exemple de branches
nouvellefonctionnalit

master

idee-cool

Commit
5d6b287

Commit
45fa9f8

Commit
54ea241

Je commence
dvelopper dessus, sans
me soucier des
modifications faites sur
nouvellefonctionnalit.

Commit
5d6b287
8e2a2af

54

Exemple de branches
nouvellefonctionnalit

master

idee-cool

Commit
5d6b287

Commit
54ea241

Commit
c4ea241

Je peux me dplacer et
commiter sur chacune de
ces branches, qui sont
compltement
indpendantes.

Commit
45fa9f8

Commit
5d6b287
8e2a2af

Commit
85ea2bd

55

Exemple de branches
nouvellefonctionnalit

master

idee-cool

Commit
5d6b287

Commit
54ea241

Merge
branch

Commit
45fa9f8

Commit
5d6b287
8e2a2af

Commit
c4ea241

Commit
85ea2bd

Tout se passe alors


comme dans le cas
prcdent : quand une
branche est prte, je la
passe sur master.
Ici, master contient les
modifications faites sur
idee-cool mais pas
nouvelle-fonctionnalite.

56

Les branches, en vrai


Pour ceux qui ont trouv cette explication un peu floue,
sachez qu'en ralit, les branches sont des pointeurs vers un
commit

Pour en savoir plus : http://git-scm.com/book/fr/Lesbranches-avec-Git-Ce-qu-est-une-branche


Mais ce n'est pas primordial.
57

Naviguer de branche en branche


Voir les branches :
git branch

Voir aussi les branches


distantes :
git branch -a

58

Naviguer de branche en branche


Changer de branche :
Assurez-vous de tout avoir bien
commit
git checkout <branche>
Vous pouvez laisser des fichiers
non commits Mais c'est
dconseill

59

Crer une nouvelle branche


partir de la branche
courante :
git

checkout b <branche>

d'une branche distante


(mieux) :

git checkout b <branche>


origin/<branche distante>

60

Supprimer des branches

git branch d <branche>

C'est irrversible !

Forcer la suppression :
Quand des commits seront
perdus
git branch -D <branche>

61

Synchroniser sa branche
Se mettre jour avec la
branche distante :
git pull <remote> <branche
distante>

Mettre jour la branche


distante :

git push <remote> <branche


distante>

62

Un conflit ! (bis)
Que faire ?
Lire le message d'erreur.
Conflit lorsque des fichiers
n'ont pas t commits

Solutions :
Commiter les fichiers en
question ;
Ou annuler leur modifications
(git checkout <fichier>) ;
Ou stash (utilisation plus
avance).

63

Merger des branches


Comment appliquer les commits de ma branche de dev ma branche de prod ?

En ligne de commande :
git checkout master
git merge dev

Autre solution : utiliser


Gitlab et les merge request.

64

Un conflit ! (ter)
Le git merge ne se fait pas lorsqu'un fichier est sur les deux
branches

Il va donc falloir rgler le conflit comme lors d'un git pull


(ne pas oublier de commiter une fois le conflit rsolu !)
65

git commit -m "C'est fini"


Des questions ?

66

Annexes
CI-GT CE QUI N'A PAS PU TRE PLAC DANS LA FORMATION

Modifier son dernier commit


Pour rajouter des fichiers son dernier commit :
git add <fichier>
git commit --amend m "Message de commit"

Ne pas le faire si le commit en question a dj


t push. Cela pourrait crer de gros conflits d'historique.

68

Git stash
Permet de sauvegarder temporairement un travail (pour
passer dans une autre branche par exemple)
git stash

commit

: sauvegarde et remet la branche dans l'tat du dernier

git stash apply

: applique le dernier stash (sans le supprimer de

la pile des stash)


git stash pop : applique le dernier stash (et le supprime de la pile)
git stash clear : vide la pile des stash
(regarder la doc)

69

Rsoudre les conflits proactivement


git checkout --theirs <fichier> pour garder le fichier distant
(celui qu'on pull ou qu'on merge)

git

checkout --ours <fichier>

pour l'inverse

Bien sr, ne pas oublier de commiter la fin.

70

RTFM !
Plein de documentations un peu partout :
http://git-scm.com/book/fr la doc officielle, et en franais ;
http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/fr/index.html un autre

tuto, trs complet lui aussi, en franais galement ;


http://sethrobertson.github.io/GitBestPractices/ comment avoir un workflow
efficace ;
En encore plein d'autres sur Google !

71