Git Repositories

Astuces
authorCyrille Pontvieux <jrd@enialis.net>
Tue, 24 May 2016 23:31:32 +0000 (01:31 +0200)
committerCyrille Pontvieux <jrd@enialis.net>
Tue, 24 May 2016 23:31:32 +0000 (01:31 +0200)
supports/advanced/slides_git_advanced.md

index 81fef04..9e9b76b 100644 (file)
@@ -121,7 +121,7 @@ C'est ce qui permet de calculer le hash (sha1, 14 digits hexa) du commit.
     "b65ee2e"        -> "df5ec3f"
     "df5ec3f"        -> "ca8c5ad" [style=invis]
     "ca8c5ad"        -> "feature-1" [style=invis]
-    "feature-1"     -> "remote/feature-1" [style=invis]
+    "feature-1"      -> "remote/feature-1" [style=invis]
     "df5ec3f"        -> "c5a1b04"
     "ca8c5ad"        -> "c5a1b04"
     "v1.0"           -> "c5a1b04" [style=invis]
@@ -361,23 +361,144 @@ Nommage :
 
 ---
 
-# Rebase -i exemple
+# Rebase -i 1440adc^, Exemple
 
-TODO fichier texte
+<div>
+AVANT édition<br/>
+<div style="background-color: black; font-family: monospace; font-size: 12pt;">
+<span style="color: yellow">pick </span> <span style="color: cyan">1440adc</span> <span style="color: magenta">Story 35 - gestion des comptes utilisateur</span><br/>
+<span style="color: yellow">pick </span> <span style="color: cyan">246f0ed</span> <span style="color: magenta">Story 36 - gestion des droits</span><br/>
+<span style="color: yellow">pick </span> <span style="color: cyan">9bf41da</span> <span style="color: magenta">Story 35 - oops l'administrateur n'était pas géré</span><br/>
+<span style="color: yellow">pick </span> <span style="color: cyan">55d44ab</span> <span style="color: magenta">Story 37 - nouveau mot de passe si perdu</span><br/>
+<span style="color: yellow">pick </span> <span style="color: cyan">30e45aa</span> <span style="color: magenta">Story 37 - validation par lien dans email</span><br/>
+</div>
+</div>
+<div>
+APRÈS édition
+<div style="background-color: black; font-family: monospace; font-size: 12pt;">
+<span style="color: yellow">pick </span> <span style="color: cyan">1440adc</span> <span style="color: magenta">Story 35 - gestion des comptes utilisateur</span><br/>
+<span style="color: red">fixup</span> <span style="color: cyan">9bf41da</span> <span style="color: magenta">Story 35 - oops l'administrateur n'était pas géré</span><br/>
+<span style="color: yellow">pick </span> <span style="color: cyan">246f0ed</span> <span style="color: magenta">Story 36 - gestion des droits</span><br/>
+<span style="color: yellow">pick </span> <span style="color: cyan">55d44ab</span> <span style="color: magenta">Story 37 - nouveau mot de passe si perdu</span><br/>
+<span style="color: green">squash</span> <span style="color: cyan">30e45aa</span> <span style="color: magenta">Story 37 - validation par lien dans email</span><br/>
+</div>
+</div>
+
+- Ordre inhabituel, du haut vers le bas ↓
+- Au final, il ne restera **que 3 commits**
+
+#Presenter Notes
+- Les deux commits concernant la **story 35** seront fusionnés en un seul et seul le message du premier commit sera gardé
+- Le commit de la **story 36** a été déplacé pour se trouvé après la **story 35**
+- Les deux commits concernant la **story 37** seront fusionnés en un seul et un éditeur sera lancé une fois cette édition validée contenant les deux messages de commit pour les fusionner à la main
 
 ---
 
 # Rebase branch1 branch2
+
+Change la base de `branch2` pour la faire partir de `branch1`
+
 - Raccourci pour ne pas *checkouter* `branch2` avant de la rebaser sur `branch1`
 - Permet de chaîner les rebases puisque tout se fait en une seule commande
-- Attention, la branche d'origine n'est pas restaurée après le rebase
+- Attention, la branche d'origine **n'est pas restaurée (*checkout*)** après le rebase
 
 ---
 
 # Rebase --onto
+<div>
+`rebase --onto f1 origin/f1 f2`
+
 - Permet de rebaser une portion de branche
 - Utile quand on veut rebaser une branche qui part d'une branche qui a elle-même été rebasée
-- TODO Schéma
+
+</div>
+<div style="display: flex; flex-direction: row; justify-content: space-around;">
+{% dot rebase-onto1.dot.png
+  digraph G {
+    graph [splines=false overlap=false bgcolor=transparent size=4]
+    node [shape=plaintext margin=0 fontcolor=gray30 fontsize=14 fixedsize=true]
+    edge [color=blue]
+
+    "origin/f1" [shape=cds style="filled" fillcolor=lightsalmon fontcolor=purple4 peripheries=0 width=1.1 orientation=90]
+    "origin/f2" [shape=cds style="filled" fillcolor=lightsalmon fontcolor=purple4 peripheries=0 width=1.1 orientation=90]
+    "(f1)" [shape=cds style="filled" fillcolor=palegreen fontcolor=black peripheries=0 width=0.8 orientation=90]
+    "f1"   [shape=cds style="filled" fillcolor=green fontcolor=black peripheries=0 width=0.8 orientation=0]
+    "f2"   [shape=cds style="filled" fillcolor=green fontcolor=black peripheries=0 width=0.8 orientation=90]
+    "develop" [shape=cds style="filled" fillcolor=green fontcolor=black peripheries=0 width=0.8 orientation=0]
+    "03ff0d3"
+    "ace6322"
+    "b65ee2e"
+    "df5ec3f"
+    "ca8c5ad"
+    "c5a1b04" [label=<<B>c5a1b04</B>>]
+    "c7f521a" [label=<<B>c7f521a</B>>]
+
+    "develop"        -> "03ff0d3" [style=invis]
+    "ace6322"        -> "03ff0d3"
+    "b65ee2e"        -> "ace6322"
+    "f1"             -> "b65ee2e" [style=invis]
+    "df5ec3f"        -> "03ff0d3"
+    "ca8c5ad"        -> "df5ec3f"
+    "ca8c5ad"        -> "(f1)" [style=invis]
+    "(f1)"           -> "origin/f1" [style=invis]
+    "c5a1b04"        -> "ca8c5ad"
+    "c7f521a"        -> "c5a1b04"
+    "c7f521a"        -> "f2" [style=invis]
+    "f2"             -> "origin/f2" [style=invis]
+
+    {rank=same; "develop" "03ff0d3"}
+    {rank=same; "ace6322" "df5ec3f"}
+    {rank=same; "f1" "b65ee2e" "ca8c5ad" "(f1)" "origin/f1"}
+    {rank=same; "c7f521a" "f2" "origin/f2"}
+  }
+%}
+ Vers 
+{% dot rebase-onto2.dot.png
+  digraph G {
+    graph [splines=false overlap=false bgcolor=transparent size=4]
+    node [shape=plaintext margin=0 fontcolor=gray30 fontsize=14 fixedsize=true]
+    edge [color=blue]
+
+    "origin/f1" [shape=cds style="filled" fillcolor=lightsalmon fontcolor=purple4 peripheries=0 width=1.1 orientation=90]
+    "origin/f2" [shape=cds style="filled" fillcolor=lightsalmon fontcolor=purple4 peripheries=0 width=1.1 orientation=90]
+    "(f1)" [shape=cds style="filled" fillcolor=palegreen fontcolor=black peripheries=0 width=0.8 orientation=90]
+    "(f2)" [shape=cds style="filled" fillcolor=palegreen fontcolor=black peripheries=0 width=0.8 orientation=90]
+    "f1"   [shape=cds style="filled" fillcolor=green fontcolor=black peripheries=0 width=0.8 orientation=0]
+    "f2"   [shape=cds style="filled" fillcolor=green fontcolor=black peripheries=0 width=0.8 orientation=0]
+    "develop" [shape=cds style="filled" fillcolor=green fontcolor=black peripheries=0 width=0.8 orientation=0]
+    "03ff0d3"
+    "ace6322"
+    "b65ee2e"
+    "df5ec3f"
+    "ca8c5ad"
+    "c5a1b04"
+    "c7f521a"
+    "1b04c5a" [label=<<B>1b04c5a</B>>]
+    "521ac7f" [label=<<B>521ac7f</B>>]
+
+    "develop"        -> "03ff0d3" [style=invis]
+    "ace6322"        -> "03ff0d3"
+    "b65ee2e"        -> "ace6322"
+    "f1"             -> "b65ee2e" [style=invis]
+    "1b04c5a"        -> "b65ee2e"
+    "521ac7f"        -> "1b04c5a"
+    "f2"             -> "521ac7f" [style=invis]
+    "df5ec3f"        -> "03ff0d3"
+    "ca8c5ad"        -> "df5ec3f"
+    "ca8c5ad"        -> "(f1)" [style=invis]
+    "(f1)"           -> "origin/f1" [style=invis]
+    "c5a1b04"        -> "ca8c5ad"
+    "c7f521a"        -> "c5a1b04"
+    "c7f521a"        -> "(f2)" [style=invis]
+    "(f2)"           -> "origin/f2" [style=invis]
+
+    {rank=same; "develop" "03ff0d3"}
+    {rank=same; "ace6322" "df5ec3f"}
+    {rank=same; "f1" "b65ee2e" "ca8c5ad" "(f1)" "origin/f1"}
+    {rank=same; "f2" "521ac7f" "c7f521a" "(f2)" "origin/f2"}
+  }
+%}
+</div>
 
 ---
 
@@ -386,22 +507,69 @@ TODO fichier texte
 
 ---
 
-# Astuces
-- update-index --assume-changed
-- autosetuprebase
-- autosquash
-- rerere (*Reuse Recorded Resolution*)
-- Gestion des binaires :
-  - git LFS
-  - git diff sur odt ou docx
-- TODO couper ça en plusieurs slides
+# Fichiers modifiés à ne pas versionner
+- `update-index --assume-unchanged file`
+- `update-index --no-assume-unchanged file`
+
+Git ne vera plus les modifications faites sur `file`.
+
+Très utile avec un fichier de conf local qui contient des **chemins locaux** ou des **mots de passes**
+
+---
+
+# Pull en rebase sur toutes les nouvelles branches
+
+- Pour passer une branche `b` existante à utiliser la stratégie **rebase** sur un **pull**, il faut faire :<br>
+`git config branch.b.rebase true`
+- Pour que chaque **nouvelle** branche soit configurée comme telle :<br>
+`git config branch.autosetuprebase always`<br>
+On peut ajouter `--global` pour que ce soit le cas sur tous les dépôts.
+
+---
+
+# Squash automatique sur rebase interractif
+
+- Quand on fait un rebase interractif, il faut indiquer explicitement les commits qu'on veut **squasher** ou **fixer**
+- On peut aussi demander à git de nous aider :
+    - Lors du commit, si on sais à l'avance qu'il faudra squasher ou fixer avec un autre commit :<br>
+    `git commit --squash=commit-à-squasher`<br>
+    `git commit -n --fixup=commit-à-fixer`
+    - Quand on rebase ensuite, il suffit de dire :<br>
+    `git rebase -i --autosquash`
+- Il est conseillé de mettre en place des alias
 # Presenter Notes
-- autosquash :
 ```
 fixup = "!sh -c 'git commit -n --fixup=$1' -"
 squash = "!sh -c 'git commit -n --squash=$1' -"
 ri = rebase --interactive --autosquash
 ```
+
+---
+
+# Reuse Recorded Resolution
+
+- Une option intéressante de git, c'est de lui dire d'enregistrer la **manière dont on résout** un conflit. Ainsi, si on a besoin, plus tard, de résoudre à nouveau le même conflit, il **réutilisera la même résolution** et ne nous demandera pas une nième fois.
+- Très utile sur une branche de longue vie que l'on rebase/merge plusieurs fois
+- `git --global rerere.enabled true` et plus de soucis
+
+---
+
+# Gestion des binaires : git LFS
+- **Extension** de git pour permettre de gérer le contenu de gros binaires en dehors du dépôt
+- Même système de **sha1** mais le fichier n'est pas stocké dans git
+- On peut récupérer le contenu à tout moment avec une commande spécifique
+- Utile sur des fichiers nécessaires pour une compilation mais **trop gros**, qui **changent peu**
+
+---
+
+# Gestion des binaires : git diff
+- `git diff` sur **odt** ou **docx** :
+    - Git propose de définir des **convertisseurs** pour certains fichiers afin de les comparer
+    - Une approche possible est d'utiliser **LibreOffice** en **headless** pour lui dire de convertir *en texte*
+    - On peut donc **très facilement** comparer deux versions d'un fichier *Word*
+    - Ne permet pas de comparer les styles, forcément, mais en général ce n'est pas nécessaire
+- On peut aussi utiliser cette mécanique pour comparer des fichiers `zip` ou `tar` avec un listing par exemple
+# Presenter Notes
 - git diff LibreOffice :
 ```
 $ cat ~/.config/git/attributes
@@ -459,3 +627,8 @@ $ git config --global diff.lo.textconv 'soffice -env:UserInstallation=file:///tm
 
 # gitlab gitblit
 TODO
+
+---
+
+# Passons à la pratique…
+.fx: last-slide