-
Philippe Dosch authoredPhilippe Dosch authored
basegit.tex 7.72 KiB
%======================================================================
\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}
\item
Un \emph{commit} contient
\begin{itemize}
\item
un ensemble de modifications de données, suite aux manipulations
des fichiers du projet (création, édition, suppression,
renommage...)
\item
un \emph{log} associé : commentaire sur la nature des modifications
\item
des 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} (configuration du
projet)
\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 \textbf{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(s) distant(s)}
\begin{itemize}
\item
est intrinsèquement similaire à un dépôt local
\item
peut être
\begin{itemize}
\item
le dépôt local d'un autre utilisateur
\item
un dépôt centralisé dédié : il est alors configuré et déployé
pour pouvoir être partagé entre utilisateurs
\end{itemize}
\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)
\item
très bonne répartition des hashs (signatures) produits
\end{itemize}
\item
Exemples
\begin{codebox}
\mygit{echo salut | sha1sum}{salut.sha1}
\mygit{echo Salut | sha1sum}{Salut.sha1}
\end{codebox}
\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}~»\\
{\tiny \hfill \emph{Documentation officielle Git,
\url{http://git-scm.com/book}}}
\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}
}