From 191b803bb345a554ff572188079134ad737c9976 Mon Sep 17 00:00:00 2001
From: Philippe Dosch <Philippe.Dosch@loria.fr>
Date: Sat, 4 Jan 2014 21:43:38 +0100
Subject: [PATCH] Main part decomposition into thematic parts

---
 basegit.tex      |  242 +++++++++
 collabowork.tex  |  146 +++++
 config.tex       |  103 ++++
 gitmain.tex      | 1323 +---------------------------------------------
 intro.tex        |  153 ++++++
 maincommands.tex |  515 ++++++++++++++++++
 moregit.tex      |  149 ++++++
 7 files changed, 1314 insertions(+), 1317 deletions(-)
 create mode 100644 basegit.tex
 create mode 100644 collabowork.tex
 create mode 100644 config.tex
 create mode 100644 intro.tex
 create mode 100644 maincommands.tex
 create mode 100644 moregit.tex

diff --git a/basegit.tex b/basegit.tex
new file mode 100644
index 0000000..15b3d76
--- /dev/null
+++ b/basegit.tex
@@ -0,0 +1,242 @@
+%======================================================================
+
+\section{Les bases de Git}
+
+%======================================================================
+
+\subsection{Principes liés à Git}
+
+%======================================================================
+
+\frame{\frametitle{Possibilités}
+  \begin{itemize}
+  \item
+    Les VCS travaillent principalement sur les fichiers texte
+    (\ex{.txt}, \ex{.c}, \ex{.java}, \ex{.xml}...)
+  \item
+    Les fichiers binaires (\ex{.jpg}, \ex{.doc}, \ex{.pdf}...) peuvent
+    également être intégrés mais ne peuvent prétendre qu'au
+    versionage, pas à l'édition collaborative
+  \item
+    Que faut-il stocker dans un dépôt ?
+    \begin{itemize}
+    \item
+      \textbf{toutes} les ressources nécessaires à la construction
+      d'un projet...
+    \item 
+      ...\textbf{à l'exception} de celles qui sont générées
+      automatiquement (\ex{.o} en C, \ex{.class} en Java...)
+    \end{itemize}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Usages}
+  \begin{itemize}
+  \item
+    Utiliser un VCS suppose que les développeurs travaillent en
+    concertation~! 
+  \item
+    Les VCS supposent que les développeurs ne modifient pas la même
+    partie d'un même fichier
+  \item
+    Les VCS peuvent fusionner deux modifications relatives à un même
+    fichier si elles concernent des parties différentes
+  \item
+    Dans le cas contraire, un \emph{conflit} est généré et doit être
+    réglé manuellement (par les développeurs)
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Principe de fonctionnement d'un dépôt}
+  \begin{itemize}
+  \item
+    Création d'un dépôt (\emph{repository}) vide
+  \item
+    Alimentation du dépôt par l'intermédiaire de \emph{commits}
+    \begin{itemize}
+    \item
+      ensemble de modifications de données, suite aux manipulations
+      des fichiers du projet (création, édition, suppression,
+      renommage...)
+    \item
+      \emph{log} associé : commentaire sur la nature des modifications
+    \item
+      méta-informations : identifiant de \emph{commit}, auteur, date
+    \end{itemize}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Différents niveaux de stockage}
+  \begin{center}
+    \includegraphics[height=5cm]{couches-git.eps}
+  \end{center}
+}
+
+%======================================================================
+
+\frame{\frametitle{Différents niveaux de stockage}
+  \begin{itemize}
+  \item
+    \emph{Répertoire de travail}
+    \begin{itemize}
+    \item
+      contient la copie locale des sources du projet
+    \item
+      contient, à sa racine, le répertoire \ex{.git} de configuration
+    \end{itemize}
+  \item
+    \emph{Index}
+    \begin{itemize}
+    \item
+      espace temporaire utilisé pour préparer la transition de données
+      entre le répertoire de travail et le dépôt local
+    \item
+      permet de choisir quel sous-ensemble de modifications, présentes
+      dans le répertoire de travail, répercuter dans le dépôt local
+      lors d'un \emph{commit}
+    \end{itemize}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Différents niveaux de stockage}
+  \begin{itemize}
+  \item
+    \emph{Dépôt local}
+    \begin{itemize}
+    \item
+      contient la totalité de toutes les versions de tous les fichiers
+      du projet, par l'intermédiaire des \emph{commits}
+    \item
+      contient toutes les méta-informations : historique, \emph{logs},
+      \emph{tags}...
+    \item
+      propre à un utilisateur donné
+    \end{itemize}
+  \item
+    \emph{Dépôt distant}
+    \begin{itemize}
+    \item 
+      est intrinsèquement similaire à un dépôt local
+    \item
+      configuré et déployé pour pouvoir être partagé entre
+      utilisateurs
+    \end{itemize}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Principe de fonctionnement intrinsèque}
+  \begin{itemize}
+  \item
+    Contrairement à d'autres VCS, Git s'intéresse aux
+    \textbf{contenus}, pas aux fichiers en tant que tels
+  \item
+    Les noms de fichiers, les dates de modification, n'interviennent
+    donc pas directement pour déterminer les modifications réalisées
+    depuis un \emph{commit} donné
+  \item
+    Git calcule pour chaque fichier une \emph{signature} SHA-1 lui
+    permettant de détecter des changements de contenu
+  \item
+    Les noms de fichiers, les dates associées, ne sont considérées que
+    comme des méta-informations
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{SHA-1}
+  \framesubtitle{Définition}
+  \begin{itemize}
+  \item
+    Fonction de hachage cryptographique conçue par la NSA
+    \begin{itemize}
+    \item
+      prend en entrée un texte de longueur maximale $2^{64}$ bits,
+      soit environ $2.3 \times 10^{18}$ caractères ($\sim 2.3$~Eo)
+    \item
+      produit une signature sur $160$~bits, soit $20$~octets, soit
+      $40$~caractères hexadécimaux ($\sim 1.5 \times 10^{48}$
+      possibilités)
+    \end{itemize}
+  \item
+    Exemples\\
+    \mygit{echo salut | sha1sum}{salut.sha1}
+    \mygit{echo Salut | sha1sum}{Salut.sha1}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{SHA-1}
+  \framesubtitle{Signatures, aspects mathématiques}
+  \begin{itemize}
+  \item
+    Un \emph{même} contenu fournit toujours la \emph{même} signature
+  \item
+    D'un point de vue mathématique, il est possible que deux
+    contenus différents génèrent une même signature (une
+    \emph{collision})
+  \item
+    Mais en pratique, la probabilité est infinitésimale et peut être
+    ignorée sans risque
+  \item
+    D'ailleurs, les 7 ou 8 premiers caractères d'une signature sont
+    quasi systématiquement suffisants pour désigner sans ambiguïté un
+    contenu...
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{SHA-1}
+  \framesubtitle{Collisions et probabilités}
+  \begin{itemize}
+  \item
+    Il faudrait que $10$ milliards de programmeurs fassent $1$
+    \emph{commit} par seconde pendant presque $4$ millions d'années
+    pour qu'il y ait 50\% de chance qu'une collision se produise
+  \item
+    «~\emph{Il y a plus de chances que tous les membres d'une équipe
+    soient attaqués et tués par des loups dans des incidents sans
+    relation la même nuit}~»
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Usage des signatures SHA-1}
+  \begin{itemize}
+  \item
+    Sous Git, les signatures SHA-1 permettent d'identifier les
+    contenus
+    \begin{itemize}
+    \item
+      de fichiers
+    \item
+      de versions d'un projet (à travers ses fichiers)
+    \item
+      de \emph{commits} (en y associant des infos relatives à leur
+      auteur)
+    \end{itemize}
+  \item
+    À chaque fois, la signature obtenue est supposée unique et
+    constitue un identifiant fiable
+  \item
+    Cette gestion de signatures est à l'origine des performances
+    de Git
+  \item 
+    Elle lui permet aussi de garantir l'intégrité d'un projet dans un
+    contexte distribué
+  \end{itemize}
+}
+
diff --git a/collabowork.tex b/collabowork.tex
new file mode 100644
index 0000000..fa6c42f
--- /dev/null
+++ b/collabowork.tex
@@ -0,0 +1,146 @@
+%======================================================================
+
+\subsection{Exemples de travail collaboratif}
+
+%======================================================================
+
+% Initialisation du dépôt :
+
+%  - Création (distant, bare)...
+%  - git clone dessus ou git remote add origin git@github.com:loirotte/zefezgfze.git
+%  - git push -u origin master
+
+
+\frame{\frametitle{Introduction}
+  \begin{itemize}
+  \item
+    Si les modifications de différents contributeurs portent sur des
+    fichiers différents, la situation ne pose pas de problème...
+  \item
+    Si les modifications sont relatives à un même fichier
+    \begin{itemize}
+    \item 
+      si les portions modifiées sont différentes, il n'y a toujours
+      pas de problème
+    \item 
+      si une même portion a été modifiée par plusieurs contributeurs,
+      il y a un \emph{conflit} (à résoudre manuellement)
+    \end{itemize}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Cas idéal}
+  \begin{center}
+    \includegraphics[width=9cm]{edit-coll.eps}
+  \end{center}
+}
+
+%======================================================================
+
+\frame{\frametitle{Cas idéal}
+  \framesubtitle{Du côté de chez Alice...}
+  \mygitpromptplus{alice}{emacs README}\\
+  \mygitpromptplus{alice}{git add README}\\
+  \mygitprompt{alice}{git commit -m "Minor updates"}{gitcomalic.txt}
+  \mygitprompt{alice}{git push}{gitpushconf.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Cas idéal}
+  \framesubtitle{Du côté de chez Bob...}
+  \mygitpromptplus{bob}{emacs README}\\
+  \mygitpromptplus{bob}{git add README}\\
+  \mygitprompt{bob}{git commit -m "Bug fixed"}{gitcombob.txt}
+  \mygitprompt{bob}{git push}{gitpushcoll.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Cas idéal}
+  \framesubtitle{Du côté de chez Bob...}
+  \mygitprompt{bob}{git pull}{gitpullok.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Cas idéal}
+  \framesubtitle{Du côté de chez Bob...}
+  \mygitprompt{bob}{git push}{gitpushok.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Conflit}
+  \begin{center}
+    \includegraphics[width=9cm]{edit-conflit.eps}
+  \end{center}
+}
+
+%======================================================================
+
+\frame{\frametitle{Conflit}
+  \framesubtitle{Du côté de chez Alice...}
+  \mygitpromptplus{alice}{emacs README}\\
+  \mygitpromptplus{alice}{git add README}\\
+  \mygitprompt{alice}{git commit -m "Minor updates"}{gitcomalic.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Conflit}
+  \framesubtitle{Du côté de chez Bob...}
+  \mygitpromptplus{bob}{emacs README}\\
+  \mygitpromptplus{bob}{git add README}\\
+  \mygitprompt{bob}{git commit -m "Bug fixed"}{gitcombob.txt}
+  \mygitprompt{bob}{git pull}{gitpullconflit.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Conflit}
+  \framesubtitle{Du côté de chez Bob...}
+  \begin{itemize}
+  \item
+    Si la même portion de code est modifiée de part et d'autres, un
+    conflit est généré
+  \item
+    Le fichier en cause contient une zone délimitée par des chevrons
+  \end{itemize}
+  
+  \mygit{cat README}{gitconflit.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Conflit}
+  \framesubtitle{Du côté de chez Bob...}
+  \begin{itemize}
+  \item
+    Il faut alors éditer la zone en question, supprimer les chevrons,
+    la ligne séparatrice (composée de \ex{=})
+  \item
+    Il faut ensuite répercuter le changement et on peut au final se
+    synchroniser avec le dépôt distant
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Conflit}
+  \framesubtitle{Du côté de chez Bob...}
+  \mygitpromptplus{bob}{git add README}\\
+  \mygitprompt{bob}{git commit -m "Conflict fixed"}{gitconffix.txt}
+  \mygitprompt{bob}{git push}{gitpushconf.txt}
+}
+
+%======================================================================
+
+% \frame{\frametitle{Conflit}
+%   \begin{itemize}
+%   \item
+%   \end{itemize}
+% }
+
diff --git a/config.tex b/config.tex
new file mode 100644
index 0000000..874b91d
--- /dev/null
+++ b/config.tex
@@ -0,0 +1,103 @@
+%======================================================================
+
+\subsection{Configuration de Git}
+
+%======================================================================
+
+\frame{\frametitle{Fichiers de configuration}
+  \begin{itemize}
+  \item
+    \emph{Au niveau projet}\\
+    Fichier \ex{.git/config} à la racine du projet
+  \item
+    \emph{Au niveau utilisateur}\\
+    Fichier \ex{\textasciitilde/.gitconfig}
+  \item
+    \emph{Au niveau système}\\
+    Fichier \ex{/etc/gitconfig} (rarement utilisé)
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Configuration utilisateur}
+
+  \emph{\small À faire une fois sur tout nouveau compte informatique,
+    valable ensuite pour tous les projets édités à partir de ce
+    compte}
+
+  \begin{itemize}
+  \item
+    Positionnement du nom utilisateur\\
+    \ex{git config --global user.name "Philippe Dosch"}
+  \item
+    Positionnement de l'adresse mail\\
+    \ex{git config --global user.email "dosch@loria.fr"}
+  \item 
+    Sorties en couleurs\\
+    \ex{git config --global color.ui "auto"}
+  \item
+    Politique de synchronisation des branches lors de \ex{push}\\
+    \ex{git config --global push.default simple}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Fichiers à ignorer}
+  \begin{itemize}
+  \item
+    Lors de commandes du type \ex{git status} affiche des
+    avertissements sur les fichiers qui n'ont jamais été indexés
+  \item
+    Et certains fichiers ne sont jamais intégrés dans un projet (les
+    fichiers temporaires, les résultats de compilation, les
+    sauvegardes...)
+  \item
+    Il est possible d'indiquer à Git d'ignorer ces fichiers
+    \begin{enumerate}
+    \item
+      par un fichier \ex{.gitignore}, à placer à la racine du projet :
+      ce fichier pourra être suivi et partagé avec les autres membres
+      du projet (\emph{généralement plus intéressant})
+    \item 
+      grâce du fichier \ex{.git/info/exclude} : fichier propre au
+      projet, mais qui ne sera pas partagé avec les autres membres du
+      projet
+    \end{enumerate}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Fichiers à ignorer}
+  \begin{itemize}
+  \item
+    Quel que soit le fichier utilisé, la syntaxe est la même
+  \item
+    On peut y placer des noms de fichiers (un par ligne)
+  \item
+    Le caractère \ex{*} est autorisé, permettant de désigner
+    facilement des familles de fichiers (typiquement sur l'extension)
+  \end{itemize}
+}
+
+%======================================================================
+
+% http://stackoverflow.com/questions/7229885/gitignore-vs-gitkeep 
+
+\frame{\frametitle{Répertoires vides}
+  \begin{itemize}
+  \item
+    Il arrive dans certains cas que l'on souhaite ajouter un
+    répertoire vide (sans contenu) dans un dépôt
+  \item
+    Problème : Git ne gère que les contenus de fichiers, ce type de
+    répertoire n'a pas de fichier et ne peut donc pas être géré en
+    l'état
+  \item
+    Une convention : définir un fichier vide nommé \ex{.gitkeep} dans
+    le répertoire pour qu'il puisse être pris en compte
+  \end{itemize}
+}
+
diff --git a/gitmain.tex b/gitmain.tex
index 10c6a81..02614db 100644
--- a/gitmain.tex
+++ b/gitmain.tex
@@ -33,1322 +33,11 @@
 
 %======================================================================
 
-\section{Introduction}
+\include{intro}
+\include{basegit}
+\include{maincommands}
+\include{collabowork}
+\include{config}
+\include{moregit}
 
-%======================================================================
-
-\frame{\frametitle{Problématiques générales}
-  \begin{itemize}
-  \item
-    Comment gérer l'\impt{historique des fichiers sources} d'un
-    projet~?
-    \begin{itemize}
-    \item
-      archivage
-    \item
-      comparaison de la version courante par rapport à une ancienne
-    \item
-      récupération d'une ancienne version
-    \end{itemize}
-  \item
-    Comment gérer les \impt{différentes versions d'un projet} ?
-    \begin{itemize}
-    \item
-      version 1, version 2... : une version est un ensemble de
-      fichiers dans un état donné
-    \item
-      développements parallèles : version stable, de correction de
-      bugs, d'ajout de fonctionnalités...
-    \end{itemize}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Problématiques spécifiques au travail en groupe}
-  \begin{itemize}
-  \item 
-    Comment \impt{partager} du code source ?
-  \item
-    Comment travailler \impt{à plusieurs} sur des sources ?
-  \item
-    Comment travailler \impt{au même moment} sur des sources ?
-  \item
-    Comment \impt{réconcilier les changements} de contributeurs ?
-  \item
-    Comment \impt{ne pas perdre} de travail ?
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{La solution : les systèmes de gestion de version (VCS)}
-  Ensemble de méthodes et d'outils qui maintiennent les différentes
-  versions d'un projet à travers tous les fichiers qui le composent
-  \begin{itemize}
-  \item
-    permet le développement \impt{collaboratif} et \impt{simultané}
-  \item
-    permet de garder tout l'\impt{historique} de tous les fichiers
-  \item
-    permet le \impt{développement parallèle} : version stable, de
-    développement, introduction de fonctionnalités, correction de
-    bugs...
-  \item
-    permet de savoir pourquoi, quand et par qui une portion spécifique
-    de code a été introduite
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Systèmes de gestion de version centralisés (CVCS)}
-  \begin{center}
-    \includegraphics[height=2.5cm]{centralise.eps}
-  \end{center}
-  \begin{itemize}
-  \item
-    Le serveur détient tout l'historique du projet
-  \item
-    Les utilisateurs possèdent seulement une copie des fichiers
-    correspondant au code
-  \item
-    Toutes les opérations sont réalisées par l'intermédiaire du
-    serveur (\emph{i.e. online})
-  \item
-    Les échanges de code sont obligatoirement effectués grâce au
-    serveur
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Systèmes de gestion de version décentralisés (DVCS)}
-  \begin{center}
-    \includegraphics[height=2.5cm]{distribue.eps}
-  \end{center}
-  \begin{itemize}
-  \item
-    Chaque utilisateur possède un \emph{dépôt} local complet,
-    contenant tout l'historique du projet
-  \item
-    Les opérations sont réalisées localement (\emph{i.e. offline})
-  \item
-    Des serveurs \emph{peuvent} assurer les échanges de code
-  \item
-    Du code \emph{peut} aussi être échangé avec d'autres utilisateurs
-    sans serveur centralisé (SSH ou mail typiquement)
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Historique des systèmes de gestion de version}
-  \begin{itemize}
-  \item
-    Systèmes de gestion de version \emph{centralisés}
-    \begin{itemize}
-    \item
-      CVS (\emph{Concurrent Versions System}), 1990
-    \item
-      SVN (\emph{Subversion}), 2004
-    \end{itemize}
-  \item 
-    Systèmes de gestion de version \emph{décentralisés}
-    \begin{itemize}
-    \item
-      BitKeeper, 1998
-    \item
-      Mercurial, 2005
-    \item
-      Git, 2005
-    \item
-      et d'autres : GNU Arch, Bazaar, Monotone, Darcs... 
-    \end{itemize}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Git}
-  \begin{itemize}
-  \item
-    Créé en 2005 par Linus Torvalds pour la gestion des sources de
-    Linux, en remplacement de BitKeeper
-  \item
-    Part de marché parfois estimée à 90\% sur le segment des DVCS
-    utilisés par la communauté logiciel libre
-  \item
-    Exemples de projets gérés : Linux (!), Gnome, Eclipse, KDE, X.org,
-    Qt, Perl, Debian, Android, Facebook, Twitter, Google...
-  \end{itemize}
-}
-
-%======================================================================
-
-\section{Les bases de Git}
-
-%======================================================================
-
-\subsection{Principes liés à Git}
-
-%======================================================================
-
-\frame{\frametitle{Possibilités}
-  \begin{itemize}
-  \item
-    Les VCS travaillent principalement sur les fichiers texte
-    (\ex{.txt}, \ex{.c}, \ex{.java}, \ex{.xml}...)
-  \item
-    Les fichiers binaires (\ex{.jpg}, \ex{.doc}, \ex{.pdf}...) peuvent
-    également être intégrés mais ne peuvent prétendre qu'au
-    versionage, pas à l'édition collaborative
-  \item
-    Que faut-il stocker dans un dépôt ?
-    \begin{itemize}
-    \item
-      \textbf{toutes} les ressources nécessaires à la construction
-      d'un projet...
-    \item 
-      ...\textbf{à l'exception} de celles qui sont générées
-      automatiquement (\ex{.o} en C, \ex{.class} en Java...)
-    \end{itemize}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Usages}
-  \begin{itemize}
-  \item
-    Utiliser un VCS suppose que les développeurs travaillent en
-    concertation~! 
-  \item
-    Les VCS supposent que les développeurs ne modifient pas la même
-    partie d'un même fichier
-  \item
-    Les VCS peuvent fusionner deux modifications relatives à un même
-    fichier si elles concernent des parties différentes
-  \item
-    Dans le cas contraire, un \emph{conflit} est généré et doit être
-    réglé manuellement (par les développeurs)
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Principe de fonctionnement d'un dépôt}
-  \begin{itemize}
-  \item
-    Création d'un dépôt (\emph{repository}) vide
-  \item
-    Alimentation du dépôt par l'intermédiaire de \emph{commits}
-    \begin{itemize}
-    \item
-      ensemble de modifications de données, suite aux manipulations
-      des fichiers du projet (création, édition, suppression,
-      renommage...)
-    \item
-      \emph{log} associé : commentaire sur la nature des modifications
-    \item
-      méta-informations : identifiant de \emph{commit}, auteur, date
-    \end{itemize}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Différents niveaux de stockage}
-  \begin{center}
-    \includegraphics[height=5cm]{couches-git.eps}
-  \end{center}
-}
-
-%======================================================================
-
-\frame{\frametitle{Différents niveaux de stockage}
-  \begin{itemize}
-  \item
-    \emph{Répertoire de travail}
-    \begin{itemize}
-    \item
-      contient la copie locale des sources du projet
-    \item
-      contient, à sa racine, le répertoire \ex{.git} de configuration
-    \end{itemize}
-  \item
-    \emph{Index}
-    \begin{itemize}
-    \item
-      espace temporaire utilisé pour préparer la transition de données
-      entre le répertoire de travail et le dépôt local
-    \item
-      permet de choisir quel sous-ensemble de modifications, présentes
-      dans le répertoire de travail, répercuter dans le dépôt local
-      lors d'un \emph{commit}
-    \end{itemize}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Différents niveaux de stockage}
-  \begin{itemize}
-  \item
-    \emph{Dépôt local}
-    \begin{itemize}
-    \item
-      contient la totalité de toutes les versions de tous les fichiers
-      du projet, par l'intermédiaire des \emph{commits}
-    \item
-      contient toutes les méta-informations : historique, \emph{logs},
-      \emph{tags}...
-    \item
-      propre à un utilisateur donné
-    \end{itemize}
-  \item
-    \emph{Dépôt distant}
-    \begin{itemize}
-    \item 
-      est intrinsèquement similaire à un dépôt local
-    \item
-      configuré et déployé pour pouvoir être partagé entre
-      utilisateurs
-    \end{itemize}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Principe de fonctionnement intrinsèque}
-  \begin{itemize}
-  \item
-    Contrairement à d'autres VCS, Git s'intéresse aux
-    \textbf{contenus}, pas aux fichiers en tant que tels
-  \item
-    Les noms de fichiers, les dates de modification, n'interviennent
-    donc pas directement pour déterminer les modifications réalisées
-    depuis un \emph{commit} donné
-  \item
-    Git calcule pour chaque fichier une \emph{signature} SHA-1 lui
-    permettant de détecter des changements de contenu
-  \item
-    Les noms de fichiers, les dates associées, ne sont considérées que
-    comme des méta-informations
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{SHA-1}
-  \framesubtitle{Définition}
-  \begin{itemize}
-  \item
-    Fonction de hachage cryptographique conçue par la NSA
-    \begin{itemize}
-    \item
-      prend en entrée un texte de longueur maximale $2^{64}$ bits,
-      soit environ $2.3 \times 10^{18}$ caractères ($\sim 2.3$~Eo)
-    \item
-      produit une signature sur $160$~bits, soit $20$~octets, soit
-      $40$~caractères hexadécimaux ($\sim 1.5 \times 10^{48}$
-      possibilités)
-    \end{itemize}
-  \item
-    Exemples\\
-    \mygit{echo salut | sha1sum}{salut.sha1}
-    \mygit{echo Salut | sha1sum}{Salut.sha1}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{SHA-1}
-  \framesubtitle{Signatures, aspects mathématiques}
-  \begin{itemize}
-  \item
-    Un \emph{même} contenu fournit toujours la \emph{même} signature
-  \item
-    D'un point de vue mathématique, il est possible que deux
-    contenus différents génèrent une même signature (une
-    \emph{collision})
-  \item
-    Mais en pratique, la probabilité est infinitésimale et peut être
-    ignorée sans risque
-  \item
-    D'ailleurs, les 7 ou 8 premiers caractères d'une signature sont
-    quasi systématiquement suffisants pour désigner sans ambiguïté un
-    contenu...
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{SHA-1}
-  \framesubtitle{Collisions et probabilités}
-  \begin{itemize}
-  \item
-    Il faudrait que $10$ milliards de programmeurs fassent $1$
-    \emph{commit} par seconde pendant presque $4$ millions d'années
-    pour qu'il y ait 50\% de chance qu'une collision se produise
-  \item
-    «~\emph{Il y a plus de chances que tous les membres d'une équipe
-    soient attaqués et tués par des loups dans des incidents sans
-    relation la même nuit}~»
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Usage des signatures SHA-1}
-  \begin{itemize}
-  \item
-    Sous Git, les signatures SHA-1 permettent d'identifier les
-    contenus
-    \begin{itemize}
-    \item
-      de fichiers
-    \item
-      de versions d'un projet (à travers ses fichiers)
-    \item
-      de \emph{commits} (en y associant des infos relatives à leur
-      auteur)
-    \end{itemize}
-  \item
-    À chaque fois, la signature obtenue est supposée unique et
-    constitue un identifiant fiable
-  \item
-    Cette gestion de signatures est à l'origine des performances
-    de Git
-  \item 
-    Elle lui permet aussi de garantir l'intégrité d'un projet dans un
-    contexte distribué
-  \end{itemize}
-}
-
-%======================================================================
-
-\subsection{Commandes essentielles de Git}
-
-%======================================================================
-
-\frame{\frametitle{Principales commandes, par thème}
-  \framesubtitle{\gitall}
-  \begin{center}
-    \includegraphics[height=6cm]{commandes-thematiques.eps}
-  \end{center}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git init}}
-  \framesubtitle{\gitcrea}
-  \begin{itemize}
-  \item
-    Création d'un dépôt local vide
-  \item
-    Peut suffire pour gérer l'historique d'un projet pour un seul
-    utilisateur...
-  \item
-    Crée une \emph{branche} par défaut, appelée \ex{master}
-  \item
-    Penser à ajouter un fichier \ex{README} décrivant succinctement le
-    projet
-  \end{itemize}
-
-  \mygit{git init}{gitinit.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git clone}}
-  \framesubtitle{\gitcrea}
-  \begin{itemize}
-  \item
-    Création d'un dépôt local à partir d'un dépôt existant (local ou
-    distant)
-  \item
-    Met à jour la configuration du dépôt local pour garder une
-    référence vers le dépôt distant
-  \item
-    Permet ensuite la communication entre les deux dépôts, typiquement
-    par le biais des commandes \ex{git push} et \ex{git pull}
-  \end{itemize}
-  
-  \mygit{git clone git@github.com:dosch/test.git}{gitclone.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Index et commandes Git}
-  \begin{center}
-    \includegraphics[width=10cm]{princindex.eps}
-  \end{center}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git add}}
-  \framesubtitle{\gitajout}
-  \begin{itemize}
-  \item
-    Indexe le \emph{contenu} des fichiers du répertoire courant passés
-    en paramètre
-  \item
-    Rappel : Git travaille sur les contenus, pas sur les fichiers
-  \item
-    Conséquence : si des fichiers sont modifiés après leur indexation,
-    c'est la version indexée qui sera répercutée dans le dépôt (et
-    donc pas celle du répertoire courant)
-  \item
-    Un fichier qui a été indexé au moins une fois est ensuite suivi
-    par Git (typiquement par \ex{git status})
-  \item
-    Mais l'indexation de chaque nouvelle version de ce fichier doit
-    être réalisée par un nouveau \ex{git add}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git add}}
-  \framesubtitle{\gitajout}
-  \begin{itemize}
-  \item 
-    Il n'est pas nécessaire d'indexer en seule fois tous les
-    changements d'un projet 
-  \item
-    On peut donc typiquement utiliser \ex{git add} sur un
-    sous-ensemble des fichiers concernés
-  \item
-    Cela permet de créer par la suite des \emph{commits} séparés
-  \item 
-    Typiquement : un \emph{commit} = ensemble atomique de
-    modifications
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git commit}}
-  \framesubtitle{\gitajout}
-  \begin{itemize}
-  \item
-    Répercute le contenu de l'index dans le dépôt local
-  \item
-    L'index est ainsi complètement vidé suite au \emph{commit}
-  \item
-    Un message de \emph{commit} doit obligatoirement être défini à
-    cette occasion
-    \begin{itemize}
-    \item
-      \ex{git commit} : un éditeur externe sera lancé pour la saisie
-      du message
-    \item
-      \ex{git commit -m "xxx"} : le message est fourni en ligne de
-      commande
-    \end{itemize}
-  \end{itemize}
-  
-  \mygitplus{git add README}\\
-  \mygit{git commit -m "New feature described"}{gitcommit.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Que mettre dans un log ?}
-  \framesubtitle{Techniquement...}
-  \begin{itemize}
-  \item
-    Une première ligne (obligatoire)
-    \begin{itemize}
-    \item
-      synthétise les changements
-    \item
-      apparaît comme description courte du \emph{commit}
-    \end{itemize}
-  \item
-    Une ligne vide (facultative si pas de description longue)
-  \item
-    Une description longue (facultative), de taille arbitraire
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Que mettre dans un log ?}
-  \framesubtitle{Et dans l'intention...}
-  \begin{itemize}
-  \item
-    Fondamentalement, doit expliquer le «~pourquoi~» d'un
-    \emph{commit}
-  \item
-    Trouver un «~bon~» message de log s'apparente à un exercice de
-    style, presque un art...
-  \item
-    Intuitivement, doit être proche d'un résumé ($\sim$ une phrase)
-    que l'on pourrait faire à un \emph{collègue} (initié donc~!)
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Que mettre dans un log ?}
-  \framesubtitle{Et dans l'intention...}
-  \begin{itemize}
-  \item
-    Recommandations supplémentaires (bonnes pratiques)
-    \begin{itemize}
-    \item
-      S'en tenir à 1 phrase pour la description courte
-    \item
-      Utiliser une majuscule en début de phrase
-    \item
-      Utiliser la forme impérative («~corrige le bug...~» plutôt que
-      «~bug... corrigé~» ou «~correction du bug...~»)
-    \end{itemize}
-  \item
-    Exemples
-    \begin{itemize}
-    \item
-      Remplace les conditionnelles imbriquées en switch pour
-      améliorer la lisibilité (\textit{exemple de
-      \textit{refactoring}})
-    \item
-      Supprime la fonctionnalité DDFD\_08 entravant la stabilité
-      du code (\textit{exemple d'ajout de fonctionnalité})
-    \end{itemize}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git commit}}
-  \framesubtitle{\gitajout}
-  \begin{itemize}
-  \item
-    La commande \ex{git commit -a} permet
-    \begin{enumerate}
-    \item
-      d'indexer automatiquement tous les fichiers qui ont déjà été
-      indexés au moins une fois
-    \item
-      de répercuter l'index dans le dépôt local
-    \end{enumerate}
-  \item
-    Les fichiers qui n'ont jamais été indexés (typiquement, les
-    nouveaux fichiers du projet) ne peuvent donc pas être concernés
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git log}}
-  \framesubtitle{\gitinter}
-  \begin{itemize}
-  \item
-    Affiche l'historique des \emph{commits} du projet dans l'ordre
-    chronologique inverse
-  \item
-    Affiche, pour chaque \emph{commit}, son identifiant, l'auteur, la
-    date et la première ligne du log
-  \item
-    \ex{git log commit1...commit2} : affiche les logs entre 2
-    \emph{commits} spécifiques (le premier \emph{commit} fourni doit
-    être le plus récent)
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git log}}
-  \framesubtitle{\gitinter}
-  \mygit{git log}{gitlog.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git show}}
-  \framesubtitle{\gitinter}
-  \begin{itemize}
-  \item
-    Affiche le détail d'un \emph{commit} (ou d'autres entités Git)
-  \item
-    L'identifiant (court\,/\,long) correspondant doit être fourni en
-    paramètre, sinon c'est le dernier \emph{commit} qui est
-    considéré
-  \item
-    Sur un \emph{commit}, \ex{git show} affiche en particulier la
-    différence de contenu avec le \emph{commit} précédent
-    \begin{itemize}
-    \item
-      \textcolor{green}{lignes ajoutées} : préfixées par un \ex{+}
-    \item
-      \textcolor{red}{lignes supprimées} : préfixées par un \ex{-}
-    \end{itemize}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git show}}
-  \framesubtitle{\gitinter}
-  \mygit{git show}{gitshow.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git status}}
-  \framesubtitle{\gitinter}
-  \begin{itemize}
-  \item
-    Affiche des informations sur l'état du répertoire de travail et de
-    l'index
-  \item
-    Permet de savoir ce que contient l'index (et donc ce qui sera
-    concerné par le prochain \emph{commit})
-  \item
-    Permet de savoir quels fichiers sont suivis par Git et quels sont
-    ceux qui ne le sont pas
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git status}}
-  \framesubtitle{\gitinter}
-  \mygit{git status}{gitstatus.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git diff}}
-  \framesubtitle{\gitinter}
-  \begin{itemize}
-  \item
-    Sans paramètre, affiche les différences de contenu entre le
-    répertoire de travail et l'index
-  \item
-    \ex{git diff commit1...commit2} : affiche les changements de
-    contenus entre 2 \emph{commits} spécifiques (le premier
-    \emph{commit} fourni doit être le plus récent)
-  \item
-    \ex{git diff --cached} : différences entre l'index et le dernier
-    \emph{commit}
-  \item
-    \ex{git diff HEAD} : différences entre le répertoire de travail et
-    le dernier \emph{commit}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git diff}}
-  \framesubtitle{\gitinter}
-  \mygitti{git diff}{gitdiff.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git tag}}
-  \framesubtitle{\gitop}
-  \begin{itemize}
-  \item
-    Associe une balise (une étiquette textuelle) à un \emph{commit}
-  \item
-    \ex{git tag xxx} : associe le tag \ex{xxx} au dernier
-    \emph{commit} réalisé
-  \item
-    \ex{git tag} : liste tous les tags existants
-  \item
-    Intérêt : identifier un \emph{commit} particulier plus facilement
-    qu'à partir de sa signature SHA-1
-  \item 
-    Exemples typiques de balises : v1.0, prod2.0, final4.4...
-  \end{itemize}
-}
-
-% Attention, par défaut les tags ne sont pas transférés vers les
-% serveurs distants. Il faut les envoyer explicitement, comme indiqué à
-% la fin de http://git-scm.com/book/fr/Les-bases-de-Git-Balisage
-
-%======================================================================
-
-\frame{\frametitle{\ext{git reset}}
-  \framesubtitle{\gitop}
-  \begin{itemize}
-  \item
-    Supprime des modifications effectuées dans l'index ou le dépôt
-    local
-  \item
-    À utiliser avec précaution, certaines suppressions deviennent
-    irrévocables...
-  \item
-    Peut souvent être remplacé avantageusement par un nouveau
-    \emph{commit}...
-  \item
-    Un exemple utile toutefois pour rétablir l'état du répertoire de
-    travail au dernier \emph{commit} effectué (et supprimer ainsi
-    toutes les opérations effectuées depuis)\\
-    \ex{git reset --hard}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git mv}}
-  \framesubtitle{\gitop}
-  \begin{itemize}
-  \item
-    Permet de déplacer ou de renommer un fichier ou répertoire
-  \item
-    L'historique de la ressource concernée est alors conservé
-  \item
-    À utiliser plutôt qu'un simple \ex{mv} système qui ne permet pas
-    la conservation de l'historique
-  \item
-    Le changement est répercuté dans l'index (et nécessite ensuite
-    d'être répercuté par un \emph{commit})
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git rm}}
-  \framesubtitle{\gitop}
-  \begin{itemize}
-  \item
-    Efface un fichier ou un répertoire physiquement, ainsi qu'au
-    niveau du suivi Git
-  \item
-    À utiliser plutôt qu'un simple \ex{rm} système qui n'informerait
-    pas Git de la suppression
-  \item
-    Le changement est répercuté dans l'index (et nécessite ensuite
-    d'être répercuté par un \emph{commit})
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{\ext{git pull}}
-  \framesubtitle{\gitsync}
-  \begin{itemize}
-  \item
-    Récupère les changements du dépôt distant et les fusionne dans le
-    dépôt local et le répertoire de travail
-  \item
-    Peut d'ailleurs être utilisé pour récupérer des changements de
-    n'importe quel dépôt distant...
-  \item
-    À utiliser avant de propager les changements du dépôt local vers
-    le dépôt distant (\ex{git push}) s'il y eu des changements sur le
-    dépôt distant
-  \end{itemize}
-}
-
-%======================================================================
-
-% À propos de 'git pull' : par défaut, cette commande effectue un fetch,
-% suivi d'un merge. L'effet de bord le plus notable est que le pull
-% conduit à un nouveau commit si le dépôt local contient des
-% modifications non poussées (et non poussables si le pull est
-% nécessaire).
-
-% Une manière d'éviter ce nouveau commit est de passer par un 
-% 'git pull --rebase' à la place du simple 'git pull'. Dans ce cas, un
-% fetch sera aussi effectué, et un rebase « intelligent » par la
-% suite. À noter, comme rebase effectue une modification de l'historique
-% (ce qui n'est jamais bon dès qu'on dépasse le stade local), ce genre
-% de manipulations ne doit pas être effectué dans certaines
-% configurations. Il semble que les architectures à base d'un unique
-% dépôt central ne soit pas concernée, mais ce n'est pas le cas des
-% architectures où plusieurs dépôt distants sont utilisés. Dans ce cas,
-% cette variante à base de 'rebase' est à proscrire.
-
-% Des détails en particulier sur :
-% http://stackoverflow.com/questions/6284887/whats-the-difference-between-git-fetch-then-git-rebase-and-git-pull-reb/11531502#11531502
-
-%======================================================================
-
-\frame{\frametitle{\ext{git push}}
-  \framesubtitle{\gitsync}
-  \begin{itemize}
-  \item
-    Propage les changements du dépôt local vers le distant
-  \item
-    Précision : deux stratégies de mises à jour existent (voir le
-    transparent sur la configuration utilisateur)
-    \begin{itemize}
-    \item
-      \ex{simple} : seule la branche courante est concernée
-      (conseillé)
-    \item
-      \ex{matching} : toutes les branches locales sont concernées
-      % si elles existent sur le serveur
-    \end{itemize}
-  \end{itemize}
-  
-  \mygit{git push}{gitpush.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Récapitulatif des commandes fréquentes}
-  \begin{itemize}
-  \item
-    \ex{git init} : création d'un dépôt local vide
-  \item
-    \ex{git clone} : création d'un dépôt local à partir d'un dépôt
-    existant (local ou distant)
-  \item
-    \ex{git add} : «~indexe~» des fichiers en prévision d'un
-    \emph{commit}
-  \item
-    \ex{git commit} : répercute les changements de l'index dans le
-    dépôt local, sous forme d'un \emph{commit}
-  \item
-    \ex{git log} : examine l'historique du projet
-  \item
-    \ex{git show} : affiche un objet (un \emph{commit} par exemple)
-  \item
-    \ex{git status} : affiche le status du répertoire de travail
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Récapitulatif des commandes fréquentes}
-  \begin{itemize}
-  \item
-    \ex{git diff} : affiche les différences entre le répertoire de
-    travail et l'index
-  \item
-    \ex{git tag} : associe une balise à un \emph{commit}
-  \item
-    \ex{git reset} : supprime des modifications effectuées dans
-    l'index ou le dépôt local
-  \item
-    \ex{git mv} : déplace des fichiers
-  \item
-    \ex{git rm} : supprime des fichiers
-  \item
-    \ex{git pull} : répercute les changements du dépôt distant vers le
-    dépôt local
-  \item
-    \ex{git push} : répercute les changements du dépôt local vers le
-    dépôt distant
-  \end{itemize}
-}
-
-%======================================================================
-
-\subsection{Exemples de travail collaboratif}
-
-%======================================================================
-
-% Initialisation du dépôt :
-
-%  - Création (distant, bare)...
-%  - git clone dessus ou git remote add origin git@github.com:loirotte/zefezgfze.git
-%  - git push -u origin master
-
-
-\frame{\frametitle{Introduction}
-  \begin{itemize}
-  \item
-    Si les modifications de différents contributeurs portent sur des
-    fichiers différents, la situation ne pose pas de problème...
-  \item
-    Si les modifications sont relatives à un même fichier
-    \begin{itemize}
-    \item 
-      si les portions modifiées sont différentes, il n'y a toujours
-      pas de problème
-    \item 
-      si une même portion a été modifiée par plusieurs contributeurs,
-      il y a un \emph{conflit} (à résoudre manuellement)
-    \end{itemize}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Cas idéal}
-  \begin{center}
-    \includegraphics[width=9cm]{edit-coll.eps}
-  \end{center}
-}
-
-%======================================================================
-
-\frame{\frametitle{Cas idéal}
-  \framesubtitle{Du côté de chez Alice...}
-  \mygitpromptplus{alice}{emacs README}\\
-  \mygitpromptplus{alice}{git add README}\\
-  \mygitprompt{alice}{git commit -m "Minor updates"}{gitcomalic.txt}
-  \mygitprompt{alice}{git push}{gitpushconf.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Cas idéal}
-  \framesubtitle{Du côté de chez Bob...}
-  \mygitpromptplus{bob}{emacs README}\\
-  \mygitpromptplus{bob}{git add README}\\
-  \mygitprompt{bob}{git commit -m "Bug fixed"}{gitcombob.txt}
-  \mygitprompt{bob}{git push}{gitpushcoll.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Cas idéal}
-  \framesubtitle{Du côté de chez Bob...}
-  \mygitprompt{bob}{git pull}{gitpullok.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Cas idéal}
-  \framesubtitle{Du côté de chez Bob...}
-  \mygitprompt{bob}{git push}{gitpushok.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Conflit}
-  \begin{center}
-    \includegraphics[width=9cm]{edit-conflit.eps}
-  \end{center}
-}
-
-%======================================================================
-
-\frame{\frametitle{Conflit}
-  \framesubtitle{Du côté de chez Alice...}
-  \mygitpromptplus{alice}{emacs README}\\
-  \mygitpromptplus{alice}{git add README}\\
-  \mygitprompt{alice}{git commit -m "Minor updates"}{gitcomalic.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Conflit}
-  \framesubtitle{Du côté de chez Bob...}
-  \mygitpromptplus{bob}{emacs README}\\
-  \mygitpromptplus{bob}{git add README}\\
-  \mygitprompt{bob}{git commit -m "Bug fixed"}{gitcombob.txt}
-  \mygitprompt{bob}{git pull}{gitpullconflit.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Conflit}
-  \framesubtitle{Du côté de chez Bob...}
-  \begin{itemize}
-  \item
-    Si la même portion de code est modifiée de part et d'autres, un
-    conflit est généré
-  \item
-    Le fichier en cause contient une zone délimitée par des chevrons
-  \end{itemize}
-  
-  \mygit{cat README}{gitconflit.txt}
-}
-
-%======================================================================
-
-\frame{\frametitle{Conflit}
-  \framesubtitle{Du côté de chez Bob...}
-  \begin{itemize}
-  \item
-    Il faut alors éditer la zone en question, supprimer les chevrons,
-    la ligne séparatrice (composée de \ex{=})
-  \item
-    Il faut ensuite répercuter le changement et on peut au final se
-    synchroniser avec le dépôt distant
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Conflit}
-  \framesubtitle{Du côté de chez Bob...}
-  \mygitpromptplus{bob}{git add README}\\
-  \mygitprompt{bob}{git commit -m "Conflict fixed"}{gitconffix.txt}
-  \mygitprompt{bob}{git push}{gitpushconf.txt}
-}
-
-%======================================================================
-
-% \frame{\frametitle{Conflit}
-%   \begin{itemize}
-%   \item
-%   \end{itemize}
-% }
-
-% %======================================================================
-
-%\section{Environnement de Git}
-
-%======================================================================
-
-\subsection{Configuration de Git}
-
-%======================================================================
-
-% \frame{\frametitle{}
-%   \begin{itemize}
-%   \item
-%   \end{itemize}
-% }
-
-%======================================================================
-
-\frame{\frametitle{Fichiers de configuration}
-  \begin{itemize}
-  \item
-    \emph{Au niveau projet}\\
-    Fichier \ex{.git/config} à la racine du projet
-  \item
-    \emph{Au niveau utilisateur}\\
-    Fichier \ex{\textasciitilde/.gitconfig}
-  \item
-    \emph{Au niveau système}\\
-    Fichier \ex{/etc/gitconfig} (rarement utilisé)
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Configuration utilisateur}
-
-  \emph{\small À faire une fois sur tout nouveau compte informatique,
-    valable ensuite pour tous les projets édités à partir de ce
-    compte}
-
-  \begin{itemize}
-  \item
-    Positionnement du nom utilisateur\\
-    \ex{git config --global user.name "Philippe Dosch"}
-  \item
-    Positionnement de l'adresse mail\\
-    \ex{git config --global user.email "dosch@loria.fr"}
-  \item 
-    Sorties en couleurs\\
-    \ex{git config --global color.ui "auto"}
-  \item
-    Politique de synchronisation des branches lors de \ex{push}\\
-    \ex{git config --global push.default simple}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Fichiers à ignorer}
-  \begin{itemize}
-  \item
-    Lors de commandes du type \ex{git status} affiche des
-    avertissements sur les fichiers qui n'ont jamais été indexés
-  \item
-    Et certains fichiers ne sont jamais intégrés dans un projet (les
-    fichiers temporaires, les résultats de compilation, les
-    sauvegardes...)
-  \item
-    Il est possible d'indiquer à Git d'ignorer ces fichiers
-    \begin{enumerate}
-    \item
-      par un fichier \ex{.gitignore}, à placer à la racine du projet :
-      ce fichier pourra être suivi et partagé avec les autres membres
-      du projet (\emph{généralement plus intéressant})
-    \item 
-      grâce du fichier \ex{.git/info/exclude} : fichier propre au
-      projet, mais qui ne sera pas partagé avec les autres membres du
-      projet
-    \end{enumerate}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Fichiers à ignorer}
-  \begin{itemize}
-  \item
-    Quel que soit le fichier utilisé, la syntaxe est la même
-  \item
-    On peut y placer des noms de fichiers (un par ligne)
-  \item
-    Le caractère \ex{*} est autorisé, permettant de désigner
-    facilement des familles de fichiers (typiquement sur l'extension)
-  \end{itemize}
-}
-
-%======================================================================
-
-% http://stackoverflow.com/questions/7229885/gitignore-vs-gitkeep 
-
-\frame{\frametitle{Répertoires vides}
-  \begin{itemize}
-  \item
-    Il arrive dans certains cas que l'on souhaite ajouter un
-    répertoire vide (sans contenu) dans un dépôt
-  \item
-    Problème : Git ne gère que les contenus de fichiers, ce type de
-    répertoire n'a pas de fichier et ne peut donc pas être géré en
-    l'état
-  \item
-    Une convention : définir un fichier vide nommé \ex{.gitkeep} dans
-    le répertoire pour qu'il puisse être pris en compte
-  \end{itemize}
-}
-
-%======================================================================
-
-\section{Git : et encore...}
-
-%======================================================================
-
-\subsection{Outils liés à Git}
-
-%======================================================================
-
-\frame{\frametitle{Outils liés à Git}
-  \begin{itemize}
-  \item
-    \ex{gitk} : un navigateur graphique de dépôt Git (\emph{i.e.}
-    lecture)
-  \item
-    \ex{git gui} : un \emph{front-end} graphique pour dépôt Git
-    (\emph{i.e.} lecture et écriture)
-  \item
-    \ex{gitstats} : un outil de génération de statistiques pour dépôt
-    Git
-  \item
-    \ex{gitg} : un outil (Linux) permettant de naviguer facilement
-    dans l'intégralité des sources des différentes versions d'un dépôt
-  \end{itemize}
-}
-
-%======================================================================
-
-\subsection{Autres commandes intéressantes}
-
-%======================================================================
-
-\frame{\frametitle{Autres commandes intéressantes}
-  \begin{itemize}
-  \item
-    \ex{git checkout} : rétablit le projet dans un de ses états
-    antérieurs (commit, branche, tag...)
-  \item
-    \ex{git blame} : affiche l'auteur et la révision de chaque ligne
-    d'un fichier
-  \item
-    \ex{git remote} : gestion des dépôts distants (centraux ou
-    d'autres utilisateurs)
-  \item
-    \ex{git bisect} : permet de localiser par dichotomie un commit
-    ayant introduit un bug
-  \item
-    \ex{git gc} : compacte le dépôt Git (à utiliser de temps en temps
-    pour gagner de la place)
-  \item
-    \ex{git grep} : recherche d'expression régulière dans les fichiers
-    suivis par Git
-  \end{itemize}
-}
-
-%======================================================================
-
-% Et encore :
-
-%  - Des commandes comme 'git rebase -i' permettent de réécrire une
-%    partie de l'historique interactivement, ce qui peut être très
-%    pratique avant une publication pour supprimer/réécrire/fusionner
-%    des commits qui ne font que des corrections mineures par rapport à
-%    des commits ayant eu lieu juste avant. À proscrire naturellement si
-%    l'historique sur lequel on veut travailler a déjà été publié.
-%    -> très pratique !!
-%  - Si on utilise des 'git pull' de base, effectuant donc des merge et
-%    pas des rebase, générant ainsi beaucoup de message de merge dans
-%    les logs, une commande comme 'git log --no-merges' peut être utile
-
-%======================================================================
-
-\subsection{Trucs et astuces}
-
-%======================================================================
-
-\frame{\frametitle{Trucs et astuces}
-  \begin{itemize}
-  \item
-    Première propagation d'un dépôt local vers un dépôt central
-    distant\\
-    \ex{git remote add origin \emph{url}}\\
-    \ex{git push -u origin master}
-  \item
-    Indexation partielle de fichiers (pour répartir les modifications
-    d'un fichier sur plusieurs commits)\\
-    \ex{git add -p}
-  \item
-    Suppression de tous les fichiers non suivis et ignorés\\
-    \ex{git clean -fx}
-  \item
-    Suppression d'un fichier de l'index (il ne participera donc pas
-    au prochain commit)\\
-    \ex{git -r --cached \emph{fichier}}
-  \end{itemize}
-}
-
-%======================================================================
-
-\frame{\frametitle{Trucs et astuces}
-  \begin{itemize}
-  \item
-    Restaurer un seul fichier à partir du dernier commit\\
-    \ex{git checkout HEAD \emph{fichier}}
-  \item
-    Quelles modifications depuis les 15 derniers jours ?\\
-    \ex{git whatchanged --since="2 weeks ago"}
-  \item
-    Changer le commentaire du dernier commit\\
-    \ex{git commit --amend -m "Le nouveau commentaire."}
-  \item
-    Compter le nombre de commits par contributeur\\
-    \ex{git shortlog -sn}
-  \item
-    Créer une archive ZIP de son projet\\
-    \ex{git archive --format=zip HEAD > projet.zip}
-  \end{itemize}
-}
-
-%======================================================================
-
-%\subsection{Liens}
-
-%======================================================================
-
-\frame{\frametitle{Liens}
-  \begin{itemize}
-  \item
-    \emph{Homepage} : \url{http://git-scm.com/}
-  \item
-    \emph{Livre en français} : \url{http://git-scm.com/book/fr}
-  \item
-    \emph{Github} (hébergement de projets) : \url{https://github.com/}
-  \item
-    \emph{Bitbucket} (hébergement de projets) : \url{https://bitbucket.org/}
-  \item
-    \emph{Git interactif} :
-    \url{http://ndpsoftware.com/git-cheatsheet.html}
-  \item
-    \emph{LearnGitBranching} (pour apprendre à gérer des branches)~:
-    \url{http://pcottle.github.io/learnGitBranching/}
-  \item
-    \emph{Gource} (visualisation 3D d'un projet sous forme d'arbre)~:
-    \url{https://github.com/acaudwell/Gource}
-  \end{itemize}
-}
-
-%======================================================================
 \end{document}
diff --git a/intro.tex b/intro.tex
new file mode 100644
index 0000000..1ad35ae
--- /dev/null
+++ b/intro.tex
@@ -0,0 +1,153 @@
+%======================================================================
+
+\section{Introduction}
+
+%======================================================================
+
+\frame{\frametitle{Problématiques générales}
+  \begin{itemize}
+  \item
+    Comment gérer l'\impt{historique des fichiers sources} d'un
+    projet~?
+    \begin{itemize}
+    \item
+      archivage
+    \item
+      comparaison de la version courante par rapport à une ancienne
+    \item
+      récupération d'une ancienne version
+    \end{itemize}
+  \item
+    Comment gérer les \impt{différentes versions d'un projet} ?
+    \begin{itemize}
+    \item
+      version 1, version 2... : une version est un ensemble de
+      fichiers dans un état donné
+    \item
+      développements parallèles : version stable, de correction de
+      bugs, d'ajout de fonctionnalités...
+    \end{itemize}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Problématiques spécifiques au travail en groupe}
+  \begin{itemize}
+  \item 
+    Comment \impt{partager} du code source ?
+  \item
+    Comment travailler \impt{à plusieurs} sur des sources ?
+  \item
+    Comment travailler \impt{au même moment} sur des sources ?
+  \item
+    Comment \impt{réconcilier les changements} de contributeurs ?
+  \item
+    Comment \impt{ne pas perdre} de travail ?
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{La solution : les systèmes de gestion de version (VCS)}
+  Ensemble de méthodes et d'outils qui maintiennent les différentes
+  versions d'un projet à travers tous les fichiers qui le composent
+  \begin{itemize}
+  \item
+    permet le développement \impt{collaboratif} et \impt{simultané}
+  \item
+    permet de garder tout l'\impt{historique} de tous les fichiers
+  \item
+    permet le \impt{développement parallèle} : version stable, de
+    développement, introduction de fonctionnalités, correction de
+    bugs...
+  \item
+    permet de savoir pourquoi, quand et par qui une portion spécifique
+    de code a été introduite
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Systèmes de gestion de version centralisés (CVCS)}
+  \begin{center}
+    \includegraphics[height=2.5cm]{centralise.eps}
+  \end{center}
+  \begin{itemize}
+  \item
+    Le serveur détient tout l'historique du projet
+  \item
+    Les utilisateurs possèdent seulement une copie des fichiers
+    correspondant au code
+  \item
+    Toutes les opérations sont réalisées par l'intermédiaire du
+    serveur (\emph{i.e. online})
+  \item
+    Les échanges de code sont obligatoirement effectués grâce au
+    serveur
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Systèmes de gestion de version décentralisés (DVCS)}
+  \begin{center}
+    \includegraphics[height=2.5cm]{distribue.eps}
+  \end{center}
+  \begin{itemize}
+  \item
+    Chaque utilisateur possède un \emph{dépôt} local complet,
+    contenant tout l'historique du projet
+  \item
+    Les opérations sont réalisées localement (\emph{i.e. offline})
+  \item
+    Des serveurs \emph{peuvent} assurer les échanges de code
+  \item
+    Du code \emph{peut} aussi être échangé avec d'autres utilisateurs
+    sans serveur centralisé (SSH ou mail typiquement)
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Historique des systèmes de gestion de version}
+  \begin{itemize}
+  \item
+    Systèmes de gestion de version \emph{centralisés}
+    \begin{itemize}
+    \item
+      CVS (\emph{Concurrent Versions System}), 1990
+    \item
+      SVN (\emph{Subversion}), 2004
+    \end{itemize}
+  \item 
+    Systèmes de gestion de version \emph{décentralisés}
+    \begin{itemize}
+    \item
+      BitKeeper, 1998
+    \item
+      Mercurial, 2005
+    \item
+      Git, 2005
+    \item
+      et d'autres : GNU Arch, Bazaar, Monotone, Darcs... 
+    \end{itemize}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Git}
+  \begin{itemize}
+  \item
+    Créé en 2005 par Linus Torvalds pour la gestion des sources de
+    Linux, en remplacement de BitKeeper
+  \item
+    Part de marché parfois estimée à 90\% sur le segment des DVCS
+    utilisés par la communauté logiciel libre
+  \item
+    Exemples de projets gérés : Linux (!), Gnome, Eclipse, KDE, X.org,
+    Qt, Perl, Debian, Android, Facebook, Twitter, Google...
+  \end{itemize}
+}
+
diff --git a/maincommands.tex b/maincommands.tex
new file mode 100644
index 0000000..468c1ae
--- /dev/null
+++ b/maincommands.tex
@@ -0,0 +1,515 @@
+%======================================================================
+
+\subsection{Commandes essentielles de Git}
+
+%======================================================================
+
+\frame{\frametitle{Principales commandes, par thème}
+  \framesubtitle{\gitall}
+  \begin{center}
+    \includegraphics[height=6cm]{commandes-thematiques.eps}
+  \end{center}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git init}}
+  \framesubtitle{\gitcrea}
+  \begin{itemize}
+  \item
+    Création d'un dépôt local vide
+  \item
+    Peut suffire pour gérer l'historique d'un projet pour un seul
+    utilisateur...
+  \item
+    Crée une \emph{branche} par défaut, appelée \ex{master}
+  \item
+    Penser à ajouter un fichier \ex{README} décrivant succinctement le
+    projet
+  \end{itemize}
+
+  \mygit{git init}{gitinit.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git clone}}
+  \framesubtitle{\gitcrea}
+  \begin{itemize}
+  \item
+    Création d'un dépôt local à partir d'un dépôt existant (local ou
+    distant)
+  \item
+    Met à jour la configuration du dépôt local pour garder une
+    référence vers le dépôt distant
+  \item
+    Permet ensuite la communication entre les deux dépôts, typiquement
+    par le biais des commandes \ex{git push} et \ex{git pull}
+  \end{itemize}
+  
+  \mygit{git clone git@github.com:dosch/test.git}{gitclone.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Index et commandes Git}
+  \begin{center}
+    \includegraphics[width=10cm]{princindex.eps}
+  \end{center}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git add}}
+  \framesubtitle{\gitajout}
+  \begin{itemize}
+  \item
+    Indexe le \emph{contenu} des fichiers du répertoire courant passés
+    en paramètre
+  \item
+    Rappel : Git travaille sur les contenus, pas sur les fichiers
+  \item
+    Conséquence : si des fichiers sont modifiés après leur indexation,
+    c'est la version indexée qui sera répercutée dans le dépôt (et
+    donc pas celle du répertoire courant)
+  \item
+    Un fichier qui a été indexé au moins une fois est ensuite suivi
+    par Git (typiquement par \ex{git status})
+  \item
+    Mais l'indexation de chaque nouvelle version de ce fichier doit
+    être réalisée par un nouveau \ex{git add}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git add}}
+  \framesubtitle{\gitajout}
+  \begin{itemize}
+  \item 
+    Il n'est pas nécessaire d'indexer en seule fois tous les
+    changements d'un projet 
+  \item
+    On peut donc typiquement utiliser \ex{git add} sur un
+    sous-ensemble des fichiers concernés
+  \item
+    Cela permet de créer par la suite des \emph{commits} séparés
+  \item 
+    Typiquement : un \emph{commit} = ensemble atomique de
+    modifications
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git commit}}
+  \framesubtitle{\gitajout}
+  \begin{itemize}
+  \item
+    Répercute le contenu de l'index dans le dépôt local
+  \item
+    L'index est ainsi complètement vidé suite au \emph{commit}
+  \item
+    Un message de \emph{commit} doit obligatoirement être défini à
+    cette occasion
+    \begin{itemize}
+    \item
+      \ex{git commit} : un éditeur externe sera lancé pour la saisie
+      du message
+    \item
+      \ex{git commit -m "xxx"} : le message est fourni en ligne de
+      commande
+    \end{itemize}
+  \end{itemize}
+  
+  \mygitplus{git add README}\\
+  \mygit{git commit -m "New feature described"}{gitcommit.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Que mettre dans un log ?}
+  \framesubtitle{Techniquement...}
+  \begin{itemize}
+  \item
+    Une première ligne (obligatoire)
+    \begin{itemize}
+    \item
+      synthétise les changements
+    \item
+      apparaît comme description courte du \emph{commit}
+    \end{itemize}
+  \item
+    Une ligne vide (facultative si pas de description longue)
+  \item
+    Une description longue (facultative), de taille arbitraire
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Que mettre dans un log ?}
+  \framesubtitle{Et dans l'intention...}
+  \begin{itemize}
+  \item
+    Fondamentalement, doit expliquer le «~pourquoi~» d'un
+    \emph{commit}
+  \item
+    Trouver un «~bon~» message de log s'apparente à un exercice de
+    style, presque un art...
+  \item
+    Intuitivement, doit être proche d'un résumé ($\sim$ une phrase)
+    que l'on pourrait faire à un \emph{collègue} (initié donc~!)
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Que mettre dans un log ?}
+  \framesubtitle{Et dans l'intention...}
+  \begin{itemize}
+  \item
+    Recommandations supplémentaires (bonnes pratiques)
+    \begin{itemize}
+    \item
+      S'en tenir à 1 phrase pour la description courte
+    \item
+      Utiliser une majuscule en début de phrase
+    \item
+      Utiliser la forme impérative («~corrige le bug...~» plutôt que
+      «~bug... corrigé~» ou «~correction du bug...~»)
+    \end{itemize}
+  \item
+    Exemples
+    \begin{itemize}
+    \item
+      Remplace les conditionnelles imbriquées en switch pour
+      améliorer la lisibilité (\textit{exemple de
+      \textit{refactoring}})
+    \item
+      Supprime la fonctionnalité DDFD\_08 entravant la stabilité
+      du code (\textit{exemple d'ajout de fonctionnalité})
+    \end{itemize}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git commit}}
+  \framesubtitle{\gitajout}
+  \begin{itemize}
+  \item
+    La commande \ex{git commit -a} permet
+    \begin{enumerate}
+    \item
+      d'indexer automatiquement tous les fichiers qui ont déjà été
+      indexés au moins une fois
+    \item
+      de répercuter l'index dans le dépôt local
+    \end{enumerate}
+  \item
+    Les fichiers qui n'ont jamais été indexés (typiquement, les
+    nouveaux fichiers du projet) ne peuvent donc pas être concernés
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git log}}
+  \framesubtitle{\gitinter}
+  \begin{itemize}
+  \item
+    Affiche l'historique des \emph{commits} du projet dans l'ordre
+    chronologique inverse
+  \item
+    Affiche, pour chaque \emph{commit}, son identifiant, l'auteur, la
+    date et la première ligne du log
+  \item
+    \ex{git log commit1...commit2} : affiche les logs entre 2
+    \emph{commits} spécifiques (le premier \emph{commit} fourni doit
+    être le plus récent)
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git log}}
+  \framesubtitle{\gitinter}
+  \mygit{git log}{gitlog.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git show}}
+  \framesubtitle{\gitinter}
+  \begin{itemize}
+  \item
+    Affiche le détail d'un \emph{commit} (ou d'autres entités Git)
+  \item
+    L'identifiant (court\,/\,long) correspondant doit être fourni en
+    paramètre, sinon c'est le dernier \emph{commit} qui est
+    considéré
+  \item
+    Sur un \emph{commit}, \ex{git show} affiche en particulier la
+    différence de contenu avec le \emph{commit} précédent
+    \begin{itemize}
+    \item
+      \textcolor{green}{lignes ajoutées} : préfixées par un \ex{+}
+    \item
+      \textcolor{red}{lignes supprimées} : préfixées par un \ex{-}
+    \end{itemize}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git show}}
+  \framesubtitle{\gitinter}
+  \mygit{git show}{gitshow.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git status}}
+  \framesubtitle{\gitinter}
+  \begin{itemize}
+  \item
+    Affiche des informations sur l'état du répertoire de travail et de
+    l'index
+  \item
+    Permet de savoir ce que contient l'index (et donc ce qui sera
+    concerné par le prochain \emph{commit})
+  \item
+    Permet de savoir quels fichiers sont suivis par Git et quels sont
+    ceux qui ne le sont pas
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git status}}
+  \framesubtitle{\gitinter}
+  \mygit{git status}{gitstatus.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git diff}}
+  \framesubtitle{\gitinter}
+  \begin{itemize}
+  \item
+    Sans paramètre, affiche les différences de contenu entre le
+    répertoire de travail et l'index
+  \item
+    \ex{git diff commit1...commit2} : affiche les changements de
+    contenus entre 2 \emph{commits} spécifiques (le premier
+    \emph{commit} fourni doit être le plus récent)
+  \item
+    \ex{git diff --cached} : différences entre l'index et le dernier
+    \emph{commit}
+  \item
+    \ex{git diff HEAD} : différences entre le répertoire de travail et
+    le dernier \emph{commit}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git diff}}
+  \framesubtitle{\gitinter}
+  \mygitti{git diff}{gitdiff.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git tag}}
+  \framesubtitle{\gitop}
+  \begin{itemize}
+  \item
+    Associe une balise (une étiquette textuelle) à un \emph{commit}
+  \item
+    \ex{git tag xxx} : associe le tag \ex{xxx} au dernier
+    \emph{commit} réalisé
+  \item
+    \ex{git tag} : liste tous les tags existants
+  \item
+    Intérêt : identifier un \emph{commit} particulier plus facilement
+    qu'à partir de sa signature SHA-1
+  \item 
+    Exemples typiques de balises : v1.0, prod2.0, final4.4...
+  \end{itemize}
+}
+
+% Attention, par défaut les tags ne sont pas transférés vers les
+% serveurs distants. Il faut les envoyer explicitement, comme indiqué à
+% la fin de http://git-scm.com/book/fr/Les-bases-de-Git-Balisage
+
+%======================================================================
+
+\frame{\frametitle{\ext{git reset}}
+  \framesubtitle{\gitop}
+  \begin{itemize}
+  \item
+    Supprime des modifications effectuées dans l'index ou le dépôt
+    local
+  \item
+    À utiliser avec précaution, certaines suppressions deviennent
+    irrévocables...
+  \item
+    Peut souvent être remplacé avantageusement par un nouveau
+    \emph{commit}...
+  \item
+    Un exemple utile toutefois pour rétablir l'état du répertoire de
+    travail au dernier \emph{commit} effectué (et supprimer ainsi
+    toutes les opérations effectuées depuis)\\
+    \ex{git reset --hard}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git mv}}
+  \framesubtitle{\gitop}
+  \begin{itemize}
+  \item
+    Permet de déplacer ou de renommer un fichier ou répertoire
+  \item
+    L'historique de la ressource concernée est alors conservé
+  \item
+    À utiliser plutôt qu'un simple \ex{mv} système qui ne permet pas
+    la conservation de l'historique
+  \item
+    Le changement est répercuté dans l'index (et nécessite ensuite
+    d'être répercuté par un \emph{commit})
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git rm}}
+  \framesubtitle{\gitop}
+  \begin{itemize}
+  \item
+    Efface un fichier ou un répertoire physiquement, ainsi qu'au
+    niveau du suivi Git
+  \item
+    À utiliser plutôt qu'un simple \ex{rm} système qui n'informerait
+    pas Git de la suppression
+  \item
+    Le changement est répercuté dans l'index (et nécessite ensuite
+    d'être répercuté par un \emph{commit})
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{\ext{git pull}}
+  \framesubtitle{\gitsync}
+  \begin{itemize}
+  \item
+    Récupère les changements du dépôt distant et les fusionne dans le
+    dépôt local et le répertoire de travail
+  \item
+    Peut d'ailleurs être utilisé pour récupérer des changements de
+    n'importe quel dépôt distant...
+  \item
+    À utiliser avant de propager les changements du dépôt local vers
+    le dépôt distant (\ex{git push}) s'il y eu des changements sur le
+    dépôt distant
+  \end{itemize}
+}
+
+%======================================================================
+
+% À propos de 'git pull' : par défaut, cette commande effectue un fetch,
+% suivi d'un merge. L'effet de bord le plus notable est que le pull
+% conduit à un nouveau commit si le dépôt local contient des
+% modifications non poussées (et non poussables si le pull est
+% nécessaire).
+
+% Une manière d'éviter ce nouveau commit est de passer par un 
+% 'git pull --rebase' à la place du simple 'git pull'. Dans ce cas, un
+% fetch sera aussi effectué, et un rebase « intelligent » par la
+% suite. À noter, comme rebase effectue une modification de l'historique
+% (ce qui n'est jamais bon dès qu'on dépasse le stade local), ce genre
+% de manipulations ne doit pas être effectué dans certaines
+% configurations. Il semble que les architectures à base d'un unique
+% dépôt central ne soit pas concernée, mais ce n'est pas le cas des
+% architectures où plusieurs dépôt distants sont utilisés. Dans ce cas,
+% cette variante à base de 'rebase' est à proscrire.
+
+% Des détails en particulier sur :
+% http://stackoverflow.com/questions/6284887/whats-the-difference-between-git-fetch-then-git-rebase-and-git-pull-reb/11531502#11531502
+
+%======================================================================
+
+\frame{\frametitle{\ext{git push}}
+  \framesubtitle{\gitsync}
+  \begin{itemize}
+  \item
+    Propage les changements du dépôt local vers le distant
+  \item
+    Précision : deux stratégies de mises à jour existent (voir le
+    transparent sur la configuration utilisateur)
+    \begin{itemize}
+    \item
+      \ex{simple} : seule la branche courante est concernée
+      (conseillé)
+    \item
+      \ex{matching} : toutes les branches locales sont concernées
+      % si elles existent sur le serveur
+    \end{itemize}
+  \end{itemize}
+  
+  \mygit{git push}{gitpush.txt}
+}
+
+%======================================================================
+
+\frame{\frametitle{Récapitulatif des commandes fréquentes}
+  \begin{itemize}
+  \item
+    \ex{git init} : création d'un dépôt local vide
+  \item
+    \ex{git clone} : création d'un dépôt local à partir d'un dépôt
+    existant (local ou distant)
+  \item
+    \ex{git add} : «~indexe~» des fichiers en prévision d'un
+    \emph{commit}
+  \item
+    \ex{git commit} : répercute les changements de l'index dans le
+    dépôt local, sous forme d'un \emph{commit}
+  \item
+    \ex{git log} : examine l'historique du projet
+  \item
+    \ex{git show} : affiche un objet (un \emph{commit} par exemple)
+  \item
+    \ex{git status} : affiche le status du répertoire de travail
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Récapitulatif des commandes fréquentes}
+  \begin{itemize}
+  \item
+    \ex{git diff} : affiche les différences entre le répertoire de
+    travail et l'index
+  \item
+    \ex{git tag} : associe une balise à un \emph{commit}
+  \item
+    \ex{git reset} : supprime des modifications effectuées dans
+    l'index ou le dépôt local
+  \item
+    \ex{git mv} : déplace des fichiers
+  \item
+    \ex{git rm} : supprime des fichiers
+  \item
+    \ex{git pull} : répercute les changements du dépôt distant vers le
+    dépôt local
+  \item
+    \ex{git push} : répercute les changements du dépôt local vers le
+    dépôt distant
+  \end{itemize}
+}
+
diff --git a/moregit.tex b/moregit.tex
new file mode 100644
index 0000000..cbc90bf
--- /dev/null
+++ b/moregit.tex
@@ -0,0 +1,149 @@
+%======================================================================
+
+\section{Git : et encore...}
+
+%======================================================================
+
+\subsection{Outils liés à Git}
+
+%======================================================================
+
+\frame{\frametitle{Outils liés à Git}
+  \begin{itemize}
+  \item
+    \ex{gitk} : un navigateur graphique de dépôt Git (\emph{i.e.}
+    lecture)
+  \item
+    \ex{git gui} : un \emph{front-end} graphique pour dépôt Git
+    (\emph{i.e.} lecture et écriture)
+  \item
+    \ex{gitstats} : un outil de génération de statistiques pour dépôt
+    Git
+  \item
+    \ex{gitg} : un outil (Linux) permettant de naviguer facilement
+    dans l'intégralité des sources des différentes versions d'un dépôt
+  \end{itemize}
+}
+
+%======================================================================
+
+\subsection{Autres commandes intéressantes}
+
+%======================================================================
+
+\frame{\frametitle{Autres commandes intéressantes}
+  \begin{itemize}
+  \item
+    \ex{git checkout} : rétablit le projet dans un de ses états
+    antérieurs (commit, branche, tag...)
+  \item
+    \ex{git blame} : affiche l'auteur et la révision de chaque ligne
+    d'un fichier
+  \item
+    \ex{git remote} : gestion des dépôts distants (centraux ou
+    d'autres utilisateurs)
+  \item
+    \ex{git bisect} : permet de localiser par dichotomie un commit
+    ayant introduit un bug
+  \item
+    \ex{git gc} : compacte le dépôt Git (à utiliser de temps en temps
+    pour gagner de la place)
+  \item
+    \ex{git grep} : recherche d'expression régulière dans les fichiers
+    suivis par Git
+  \end{itemize}
+}
+
+%======================================================================
+
+% Et encore :
+
+%  - Des commandes comme 'git rebase -i' permettent de réécrire une
+%    partie de l'historique interactivement, ce qui peut être très
+%    pratique avant une publication pour supprimer/réécrire/fusionner
+%    des commits qui ne font que des corrections mineures par rapport à
+%    des commits ayant eu lieu juste avant. À proscrire naturellement si
+%    l'historique sur lequel on veut travailler a déjà été publié.
+%    -> très pratique !!
+%  - Si on utilise des 'git pull' de base, effectuant donc des merge et
+%    pas des rebase, générant ainsi beaucoup de message de merge dans
+%    les logs, une commande comme 'git log --no-merges' peut être utile
+
+%======================================================================
+
+\subsection{Trucs et astuces}
+
+%======================================================================
+
+\frame{\frametitle{Trucs et astuces}
+  \begin{itemize}
+  \item
+    Première propagation d'un dépôt local vers un dépôt central
+    distant\\
+    \ex{git remote add origin \emph{url}}\\
+    \ex{git push -u origin master}
+  \item
+    Indexation partielle de fichiers (pour répartir les modifications
+    d'un fichier sur plusieurs commits)\\
+    \ex{git add -p}
+  \item
+    Suppression de tous les fichiers non suivis et ignorés\\
+    \ex{git clean -fx}
+  \item
+    Suppression d'un fichier de l'index (il ne participera donc pas
+    au prochain commit)\\
+    \ex{git -r --cached \emph{fichier}}
+  \end{itemize}
+}
+
+%======================================================================
+
+\frame{\frametitle{Trucs et astuces}
+  \begin{itemize}
+  \item
+    Restaurer un seul fichier à partir du dernier commit\\
+    \ex{git checkout HEAD \emph{fichier}}
+  \item
+    Quelles modifications depuis les 15 derniers jours ?\\
+    \ex{git whatchanged --since="2 weeks ago"}
+  \item
+    Changer le commentaire du dernier commit\\
+    \ex{git commit --amend -m "Le nouveau commentaire."}
+  \item
+    Compter le nombre de commits par contributeur\\
+    \ex{git shortlog -sn}
+  \item
+    Créer une archive ZIP de son projet\\
+    \ex{git archive --format=zip HEAD > projet.zip}
+  \end{itemize}
+}
+
+%======================================================================
+
+%\subsection{Liens}
+
+%======================================================================
+
+\frame{\frametitle{Liens}
+  \begin{itemize}
+  \item
+    \emph{Homepage} : \url{http://git-scm.com/}
+  \item
+    \emph{Livre en français} : \url{http://git-scm.com/book/fr}
+  \item
+    \emph{Github} (hébergement de projets) : \url{https://github.com/}
+  \item
+    \emph{Bitbucket} (hébergement de projets) : \url{https://bitbucket.org/}
+  \item
+    \emph{Git interactif} :
+    \url{http://ndpsoftware.com/git-cheatsheet.html}
+  \item
+    \emph{LearnGitBranching} (pour apprendre à gérer des branches)~:
+    \url{http://pcottle.github.io/learnGitBranching/}
+  \item
+    \emph{Gource} (visualisation 3D d'un projet sous forme d'arbre)~:
+    \url{https://github.com/acaudwell/Gource}
+  \end{itemize}
+}
+
+%======================================================================
-- 
GitLab