git
à KNP Labs« De tous temps, l’Homme a voulu maîtriser les versions de son code source, tant par rapport au temps qui passe que par rapport à la multiplicité intrinsèque du soi. »
Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
>>> Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
>>> Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
Pourquoi et comment
>>> Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
git cmd opts args
.git
git help cmd
,man git-cmd
(faux barbu).git knp
).cd un_repertoire_de_travail
git init
ls -a
cd .git
ln -s ../.git
git status # 3 f, 2 dirs (et 3 dirs "vides")
git add *[^k] # contenu pour le prochain commit
git status # A -> le .git originel
branches/
config
description
HEAD
hooks/
PS1=':$( [ $? == 0 ] && echo ") " || echo "( " )'
index
stage
, contient le patch qui va être commitéinfo/
objects/
refs/
Pourquoi et comment
>>> Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
Pourquoi et comment
Les commandes, le dotgit
>>> La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
git
pousse à l’intégrité (soft) : « author ».~/.gitconfig
ou .git/config
.git config alias.al "config --get-regexp alias.*"
~/.gitconfig
ou .git/config
une section [user]
name = "mon nom"
email = "mon@email.com"
git
en tapant : git config --global user.name "mon nom"
…git commit # Message dans éditeur.
# Un format normalisé.
git cm # Pour un message d’une ligne.
git sl # sl = short log
git s # s = show, montre le commit
# courant par défaut
git st # st = status, ne montre
# ici que des ajouts:
# (`??` bleus).
Rappel : alias git > alias shell.
working copy
,
# insertion de blabla en tête de fichier
sed -i '1iblabla' ./description
# ajout de blublu en fin de fichier
echo blublu >> ./description
git st
pour voir…A
, M
, ces couleurs… ?Pourquoi et comment
Les commandes, le dotgit
>>> La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
>>> Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
.git/index
(jaune) est l’intermédiairewc
(copie de travail en rouge)repo
(dépôt en vert).git diff
(ou git d
pour les flemmards) diff entre wc
et index
.git diff
montre les modifs de tout à l’heure (./description
).Un commit se fait en trois temps :
git add quelque_chose
: wc
→ index
wc
vers index
au compte-gouttes :git add --patch
(alias git ap
)git diff --cached
(alias git dc
) diff entre index
et repo
.git commit -m
(alias git cm
) pour mettre le message direct,git commit
a tout un tas d’autres options.On peut passer du contenu dans l’autre sens.
index
:git reset
(cpte-gouttes avec -p
)wc
.wc
:git checkout
(cpte-gouttes avec git co -p
)git co
!À vous ! Un petit commit en trois temps.
./description
dans l’index.git add --patch chemin
est interactif, la sous-sous-commande ?
est utile.git st
donne alors deux couleurs à ce fichier, pourquoi ?git d
et git dc
.Encore un effort :
./description
dans l’index,index
,wc
(uniquement avec git bien sûr).Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
>>> Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
>>> Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
./index
et ./COMMIT_EDITMSG
..gitignore
(glob et tout)..gitignore
peut s’auto-ignorer (bof en général, mais là…).
$ echo .gitignore >> .gitignore
$ echo index >> .gitignore
$ echo COMMIT_EDITMSG >> .gitignore
logs
, objects
et refs
et eux seuls dans un même commit.git st
nous permet de voir ce qu’il se passe dans .git lors d’un commit :logs
,refs
.git diff
montre que les logs logguent les états de refs/head/master
.git cat-file -p 1234
pour observer l’objet stocké dans objects/12/34
,
(ou avec les alias : git cf 1234
).git add logs objets refs
, git commit
).gc
.Pour ne pas encombrer git status
, on ignore les objects
.
$ echo objects >> .gitignore
Si plus tard on veut en ajouter,
$ git add objects
The following paths are ignored by one of your .gitignore files:
objects
Use -f if you really want to add them.
fatal: no files added
$ git add objects -f
Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
>>> Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
>>> Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
git commit --amend
(alias git amend
)git commit --amend -C HEAD
(alias git amendc
)Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
>>> Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
>>> Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
git rm --cached chemin
git filter-branch --index-filter \
"git rm -rf --cached --ignore-unmatch $files" HEAD
git filter-branch --index-filter \
'git update-index --remove $file' BAD_SHA1..HEAD
git gc --aggressive --prune
.Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
>>> Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
Bisect
Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
>>> Modifier l’histoire : les rebase
Bisect
objects
que nous avons ignorés.git cherry-pick
(alias git cp
).heads
).heads
, le dépôt semble être dans cet état.git status
.Autre type de rebase, le nettoyage d’une branche.
git rm -r --cached HEAD logs refs
git commit -m "Unversion HEAD, logs and refs."
Réinventons nous une histoire avec histoire.sh :
for i in $(seq 1 $1); do;
echo "# ligne $i" >> test.sh;
git add test.sh;
git commit -m "Commit n°$i pour $2.";
done
Script à conserver dans ../histoire.sh
, puis à lancer avec
sh ../histoire.sh 20 test_rebase
.
Pour contrôler ce qu’il se passe dans logs
et refs
:
cp HEAD old_HEAD
cp -av logs old_logs
cp -av refs old_refs
Pour un rebase plus ou moins interactif :
git rebase --interactive <vieux_SHA-1>
(alias git ri
)e
),s
ou f
).git rebase --continue
(alias git rc
)git rebase --abort
(alias git ra
)git sl
et git show <SHA-1>
pour vérifier.git status
diff old_HEAD HEAD
diff -r old_logs logs
diff -r old_refs refs
head
.Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
>>> Modifier l’histoire : les rebase
Bisect
Pourquoi et comment
Les commandes, le dotgit
La config, mais surtout les alias
Les trois arbres
Les références
Modifier l’histoire : attention
Modifier l’histoire : dé-versionner
Modifier l’histoire : les rebase
>>> Bisect
sh ../histoire.sh 1000 innocent
echo "exit 1" >> test.sh
git commit -am "Commit coupable."
sh ../histoire.sh 100 innocent
git blame test.sh
git bisect start, bad, good HEAD@{1100}
git bisect run sh test.sh
git bisect reset