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