Vous êtes sur la page 1sur 61

Introduction git

Yann Sionneau
int lab;

16 juin 2011

1/61

Commandes basiques

Usages un peu plus avancs

Usages experts

2/61

Plan
Commandes basiques git init git add git commit git add le retour git log git rm git checkout En rsum Usages un peu plus avancs git clone git branch git checkout le retour git stash git merge git push git pull En rsum Usages experts git add la rsurction git rebase git remote git bisect
3/61

git init

On cr le dpot git

4/61

git init

yann@obiwan : /git-tuto$ git init Initialized empty Git repository in /home/yann/git-tuto/.git/

5/61

git add

On rajoute des chiers dans une zone tampon (ou index) Le contenu de cette zone sera inclu dans le prochain commit Git traquera dornavent les modications sur ces chiers

6/61

git add

yann@obiwan : /git-tuto$ echo ceci est le README > README yann@obiwan : /git-tuto$ echo apprendre git > TODO

7/61

git add
yann@obiwan : /git-tuto$ git status # On branch master # # Initial commit # # Untracked les : # (use git add <le>... to include in what will be committed) # # README # TODO # nothing added to commit but untracked les present (use git add to track)

8/61

git add

yann@obiwan : /git-tuto$ git add TODO README

9/61

git add
yann@obiwan : /git-tuto$ git status # On branch master # # Initial commit # # Changes to be committed : # (use git rm --cached <le>... to unstage) # # new le : README # new le : TODO #

10/61

git commit

Sauvegarde le contenu de la zone tampon (ou index ou stagging area) Elle est insre dans l'historique de la branche Chaque commit a un identiant (hash SHA1)

11/61

git commit

yann@obiwan : /git-tuto$ git commit -m commit initial [master (root-commit) 6d52464] commit initial 2 les changed, 2 insertions(+), 0 deletions(-) create mode 100644 README create mode 100644 TODO

12/61

git add le retour

git add met les chiers dans le tampon (l'index) On choisi ainsi les chiers inclure dans le prochain commit

13/61

git add le retour

yann@obiwan : /git-tuto$ echo modif   TODO yann@obiwan : /git-tuto$ echo modif   README

14/61

git add le retour


yann@obiwan : /git-tuto$ git status # On branch master # Changes not staged for commit : # (use git add <le>... to update what will be committed) # (use git checkout -- <le>... to discard changes in working directory) # # modied : README # modied : TODO # no changes added to commit (use git add and/or git commit -a)

15/61

git add le retour


yann@obiwan : /git-tuto$ git add TODO yann@obiwan : /git-tuto$ git status # On branch master # Changes to be committed : # (use git reset HEAD <le>... to unstage) # # modied : TODO # # Changes not staged for commit : # (use git add <le>... to update what will be committed) # (use git checkout -- <le>... to discard changes in working directory) # # modied : README #
16/61

git add le retour

yann@obiwan : /git-tuto$ git commit -m modication du TODO [master 4345e06] modication du TODO 1 les changed, 1 insertions(+), 0 deletions(-)

17/61

git add le retour

yann@obiwan : /git-tuto$ git status # On branch master # Changes not staged for commit : # (use git add <le>... to update what will be committed) # (use git checkout -- <le>... to discard changes in working directory) # # modied : README # no changes added to commit (use git add and/or git commit -a)

18/61

git log

Ache l'historique des commits de la branche courante Il donne les hash, auteurs, descriptions, dates ...

19/61

git log
yann@obiwan : /git-tuto$ git log commit 4345e065bac5941f54e521cec9338c136c3583b8 Author : Yann Sionneau <yann@minet.net> Date : Fri Jun 10 13 :58 :19 2011 +0200 modication du TODO commit 6d5246480668c1bb87e9bf764b7605e6e3b33060 Author : Yann Sionneau <yann@minet.net> Date : Fri Jun 10 12 :06 :50 2011 +0200 commit initial

20/61

git rm

Supprime un chier du dossier courant Le chier n'est plus suivi par git Le prochain commit contiendra l'instruction de suppression

21/61

git checkout

Permet de modier l'tat du rpertoire de travail On peut demander qu'un ou plusieurs chiers reviennent une version antrieure On peut se placer sur le dernier commit (HEAD) d'une branche

22/61

git checkout

yann@obiwan : /git-tuto$ cat TODO apprendre git modif yann@obiwan : /git-tuto$ git checkout 6d52464806 TODO yann@obiwan : /git-tuto$ cat TODO apprendre git

23/61

En rsum
git add/commit workow

24/61

En rsum
git checkout workow

25/61

git clone

Cr un dpot local Rcupre la branche master d'un dpot distant L'enregistre en tant que branche master locale Rcupre tout l'historique des commits de cette branche Checkout la tte (HEAD) de la branche master Cr un (dpot) remote nomm origin avec l'adresse du clone Congure la branche master locale pour suivre la branche master du remote origin

26/61

git branch

Cr une branche qui drive de la tte de la branche courante. Utile pour dvelopper une nouvelle fonctionnalit Utile pour gnrer des patchs Utile pour rcuprer les changements d'une personne...
avant de les merger (ou pas) dans sa branche personnelle

27/61

git branch

yann@obiwan : /git-tuto$ git branch testing yann@obiwan : /git-tuto$ git branch * master testing yann@obiwan : /git-tuto$ git branch -D testing Deleted branch testing (was 4345e06).

28/61

git branch

git branch liste les branches (une * est devant la branche actuelle) git branch -D supprime une branche git branch NOM cr la branche NOM a partir de la tte de la branche courante git checkout NOM permet de se placer sur la branche NOM
Ne fonctionne que si le rpertoire de travail est propre Il ne doit contenir aucun changement non commit Utiliser git stash si vous voulez mettre de ct temporairement vos modications

29/61

git checkout le retour

git checkout permet aussi de changer de branche

30/61

git checkout le retour

yann@obiwan : /git-tuto$ git branch testing yann@obiwan : /git-tuto$ git branch * master testing yann@obiwan : /git-tuto$ git checkout testing Switched to branch 'testing' yann@obiwan : /git-tuto$ git branch master * testing

31/61

git stash

C'est la solution au problme suivant : yann@obiwan : /git-tuto$ git checkout master error : Your local changes to the following les would be overwritten by checkout : test Please, commit your changes or stash them before you can switch branches. Aborting

32/61

git stash

Il sauvegarde les changements du rpertoire de travail Il sauvegarde aussi les choses qui sont dans l'index Tout ca est sauvegard dans une pile
git stash [save] git stash (apply | drop) git stash list git stash show git stash clear

33/61

git stash

yann@obiwan : /git-tuto$ git stash Saved working directory and index state WIP on testing : d5e11f6 test HEAD is now at d5e11f6 test yann@obiwan : /git-tuto$ git checkout master Switched to branch 'master'

34/61

git stash
yann@obiwan : /git-tuto$ git checkout testing Switched to branch 'testing' yann@obiwan : /git-tuto$ git stash apply # On branch testing # Changes not staged for commit : # (usegit add <le>... to update what will be committed) # (use git checkout -- <le>... to discard changes in working directory) # # modied : test # no changes added to commit (use git add and/or git commit -a)

35/61

git stash

yann@obiwan : /git-tuto$ git stash list stash@{0} : WIP on testing : d5e11f6 test yann@obiwan : /git-tuto$ git stash drop Dropped refs/stash@{0} (3d469d192651230f39f88610838fbf5071a041)

36/61

git merge

Fusionne une branche avec la branche courante ATTENTION : peut gnrer des conits

37/61

git merge

yann@obiwan : /git-tuto$ git branch testing yann@obiwan : /git-tuto$ git checkout testing Switched to branch 'testing' yann@obiwan : /git-tuto$ echo experimentation 1  README yann@obiwan : /git-tuto$ echo experimentation 2  TODO yann@obiwan : /git-tuto$ echo experimentation > nouveau_chier

38/61

git merge

yann@obiwan : /git-tuto$ git add nouveau_chier yann@obiwan : /git-tuto$ git commit -a -m experimentation dans la branche de test [testing aae119d] experimentation dans la branche de test 3 les changed, 3 insertions(+), 0 deletions(-) create mode 100644 nouveau_chier yann@obiwan : /git-tuto$ git checkout master Switched to branch 'master' yann@obiwan : /git-tuto$ cat nouveau_chier cat : nouveau_chier : No such le or directory

39/61

git merge

yann@obiwan : /git-tuto$ git merge testing Updating 4345e06..aae119d Fast-forward README | 1 + TODO | 1 + nouveau_chier | 1 + 3 les changed, 3 insertions(+), 0 deletions(-) create mode 100644 nouveau_chier yann@obiwan : /git-tuto$ cat nouveau_chier experimentation

40/61

git push

git push <dpot_distant> src[ :dst] Envoie des commits dans l'historique d'une branche d'un dpot distant En bref : on envoie nos changements quelqu'un d'autre Le dpot distant doit tre bare Dans le monde de kernel.org on pull plutt que de push

41/61

git push

yann@obiwan : $ git clone --bare /home/yann/git-tuto/ copie-centrale Cloning into bare repository copie-centrale... done. yann@obiwan : $ git clone copie-centrale/ copie Cloning into copie... done. yann@obiwan : $ cd copie

42/61

git push

yann@obiwan : /copie$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/testing yann@obiwan : /copie$ git remote -v show origin /home/yann/copie-centrale/ (fetch) origin /home/yann/copie-centrale/ (push)

43/61

git push
yann@obiwan : /copie$ echo lolilol  TODO yann@obiwan : /copie$ git commit -a -m ahah [master 5984a87] ahah 1 les changed, 1 insertions(+), 0 deletions(-) yann@obiwan : /copie$ git push Counting objects : 5, done. Delta compression using up to 16 threads. Compressing objects : 100% (2/2), done. Writing objects : 100% (3/3), 349 bytes, done. Total 3 (delta 0), reused 0 (delta 0) Unpacking objects : 100% (3/3), done. To /home/yann/copie-centrale/ aae119d..5984a87 master -> master

44/61

git pull

git pull <dpot_distant> <branche_distante> Equivalent git fetch suivi de git merge Tlcharge l'historique d'une branche distante Puis eectue le merge avec la branche courante Peut donc gnrer des conits

45/61

git pull
yann@obiwan : /copie$ cd ../git-tuto/ yann@obiwan : /git-tuto$ git remote add origin ../copie-centrale yann@obiwan : /git-tuto$ git pull origin master remote : Counting objects : 5, done. remote : Compressing objects : 100% (2/2), done. remote : Total 3 (delta 0), reused 0 (delta 0) Unpacking objects : 100% (3/3), done. From ../copie-centrale * branch master -> FETCH_HEAD Updating aae119d..5984a87 Fast-forward TODO | 1 + 1 les changed, 1 insertions(+), 0 deletions(-)

46/61

En rsum
git stash workow

47/61

git add la rsurction

Git add peut avoir une granularit infrieure au chier On peut choisir de ne rajouter qu'un bout de modication/patch dans l'index Pour ca : git add -p <chier> ou git add patch <chier>

48/61

git add la rsurction


yann@obiwan : /git-tuto$ git add -p lol.c di git a/lol.c b/lol.c index 5e5f109..c5d469b 100644 --- a/lol.c +++ b/lol.c @@ -1,3 +1,4 @@ +1 #include <stdio.h> #include <stdlib.h> #include <string.h> Stage this hunk [y,n,q,a,d,/,j,J,g,e, ?] ? y @@ -13,3 +14,4 @@ int main(void) { return 0 ; } +2 Stage this hunk [y,n,q,a,d,/,K,g,e, ?] ? n
49/61

git rebase

Git rebase est magique Permet de modier l'historique de la branche Permet de rordonner, dcouper, fusionner des commits Deux use cases pincipaux :
Maintenir nos changement locaux au dessus` de la branche principale Fusionner des commits

50/61

git rebase
Use case 1 : Maintenir nos changement locaux au dessus de la branche principale

>

>

51/61

git rebase

git rebase <upstream> [branch] yann@obiwan : /git-tuto$ git rebase master newfeature First, rewinding head to replay your work on top of it... Applying : nouveaute Applying : encore du nouveau

52/61

git rebase

Use case 2 : Fusionner des commits

>

53/61

git rebase

yann@obiwan : /git-tuto$ git rebase -i HEAD 2 [detached HEAD 8389617] nouveaute 1 les changed, 2 insertions(+), 0 deletions(-) create mode 100644 newfeature.c Successfully rebased and updated refs/heads/newfeature.

54/61

git remote

Permet de grer la liste des dpots distant connus de git Ces dpots distant ont un rapport avec notre dpot Il s'agit par exemple du dpot d'origine (origin) d'ou on a cln le notre Ou du dpot d'un autre contributeur au projet Permet de donner un nom raccourci l'url d'un dpot distant Pour simplier les git pull et git push

55/61

git bisect

Permet d'eectuer une recherche dichotomique dans une branche Permet de trouver LE commit qui introduit un bug/une regression Permet d'aller vite et d'automatiser le processus Explication par l'exemple ...

56/61

git bisect
yann@obiwan :/git-tuto$ git bisect start yann@obiwan :/git-tuto$ cat chier.c | grep LOL LOL yann@obiwan :/git-tuto$ git bisect bad yann@obiwan :/git-tuto$ git bisect good debut Bisecting : 5 revisions left to test after this (roughly 3 steps) [26d702f2f05f3321c9d707bd809ae406b82d0190] commit 7 yann@obiwan :/git-tuto$ cat chier.c | grep LOL LOL yann@obiwan :/git-tuto$ git bisect bad Bisecting : 2 revisions left to test after this (roughly 2 steps) [5338dca0d46062ea01225092210c729d2a7cb202] commit 4

57/61

git bisect

yann@obiwan :/git-tuto$ cat chier.c | grep LOL yann@obiwan :/git-tuto$ git bisect good Bisecting : 0 revisions left to test after this (roughly 1 step) [8bd8458ac7509a0f424067fc4582fb1ba74d5328] commit 6 yann@obiwan :/git-tuto$ cat chier.c | grep LOL LOL yann@obiwan :/git-tuto$ git bisect bad Bisecting : 0 revisions left to test after this (roughly 0 steps) [1f3133cc11782d3d3546f2c2e16d60da359717] commit 5 yann@obiwan :/git-tuto$ cat chier.c | grep LOL LOL

58/61

git bisect

yann@obiwan :/git-tuto$ git bisect bad 1f3133cc11782d3d3546f2c2e16d60da359717 is the rst bad commit commit 1f3133cc11782d3d3546f2c2e16d60da359717 Author : Yann Sionneau <yann@minet.net> Date : Mon Jun 13 17 :18 :38 2011 +0200 commit 5 :100644 100644 83fb967dd33eda43d453080986f695f2848f7a99 55dd01cd5cacb1eba809c00974c8fef8adb4c882 M chier.c

59/61

git bisect
yann@obiwan :/git-tuto$ git show 1f3133 commit 1f3133cc11782d3d3546f2c2e16d60da359717 Author : Yann Sionneau <yann@minet.net> Date : Mon Jun 13 17 :18 :38 2011 +0200 commit 5 di --git a/chier.c b/chier.c index 83fb967..55dd01c 100644 --- a/chier.c +++ b/chier.c @@ -2,3 +2,4 @@ ligne ligne ligne ligne +LOL
60/61

git bisect

yann@obiwan :/git-tuto$ git bisect reset Previous HEAD position was 1f3133c... commit 5 Switched to branch 'master'

61/61