diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a6ea8d6 --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +TARGET=cours_git + +all: pdf + +# If there is no bibliography comment the bibtext dependency +pdf: #bibtex + pdflatex $(TARGET).tex + pdflatex $(TARGET).tex + +pdf-lazy: + pdflatex $(TARGET).tex + +bibtex: pdf-lazy + bibtex $(TARGET) + +clean: + rm -f *.dvi *.aux *.bbl *.blg $(TARGET).ps *.toc *.ind *.out *.brf *.ilg *.idx *.log *.bcf *.nav *.run.xml *.snm *.vrb *.backup tex/*.backup *~ + +clean_all: clean + rm -f $(TARGET).pdf diff --git a/cours_git.tex b/cours_git.tex index 79530c4..c0e80df 100644 --- a/cours_git.tex +++ b/cours_git.tex @@ -13,8 +13,7 @@ % Put table of contents at the beginning of each section \AtBeginSection[] { - \begin{frame} - \frametitle{} + \begin{frame}[noframenumbering]{} \tableofcontents[currentsection] \end{frame} } @@ -36,24 +35,25 @@ \begin{frame}[fragile] \frametitle{Prerequis} +Prérequis pour suivre ce cours: \begin{itemize} \item Savoir lire la signature d'une commande \verb#command -a [-b] [-c | -d] --long-arg PARAM1 PARAMS2...# - \item Savoir lire. Git affiche des messages et il faut les lire. + \item Savoir lire des messages affichés dans la console. Git affiche plein de messages utiles, il faut les lire. \end{itemize} \end{frame} \section{Présentation de git} \begin{frame} \frametitle{C'est quoi git} - \begin{columns}[T] + \begin{columns}[c] \column{0.5\textwidth} \begin{block}{} Git est un logiciel de versioning. \end{block} - - Crée par notre modèle spirituel, Linus Torvalds en 2005. - - Le logiciel de versioning qui était utilisé pour le dév du noyau Linux est devenu propriétaire, donc il en a développé un autre. + \begin{itemize} + \item Crée par notre modèle spirituel, Linus Torvalds en 2005. + \item Le logiciel de versioning utilisé pour le noyau Linux est devenu propriétaire, donc il en a développé un autre. + \end{itemize} \column{0.5\textwidth} \begin{center} @@ -70,13 +70,20 @@ \item Travailler à plusieurs \item Pouvoir donner la faute d'un bug à un collègue (on sait qui a codé quoi) \end{itemize} - - Git n'est pas un processus qui tourne en permanence: chaque commande est un processus rapide. Tout est enregistré dans des fichiers: il est possible d'interrompre le travail à tout moment. + + \vspace{2\baselineskip} + + \begin{itemize} + \item Git n'est pas un logiciel qui tourne en permanence: chaque commande est un petit processus. + \item Tout est enregistré dans des fichiers + \begin{itemize} + \item Possible d'interrompre le travail à tout moment + \end{itemize} + \end{itemize} \begin{alertblock}{} Git fonctionne très mal avec les fichiers binaires \end{alertblock} - \end{frame} \section{Le commit} @@ -91,8 +98,8 @@ \item Un ensemble de changements (sur un ou plusieurs fichiers) \item Une date \item Un auteur - \item \textbf{Un message} - \item Un pointeur vers sont parent + \item \textbf{Un message}: il peut être sur plusieurs lignes! + \item \textbf{Un pointeur vers sont parent} \item \textbf{Un hash unique} basé sur tout ça (plus ou moins). \end{itemize} @@ -104,14 +111,14 @@ \begin{frame} \frametitle{Un historique git} \begin{columns}[c] - \column{0.5\textwidth} + \column{0.3\textwidth} \begin{center} \includegraphics[height=0.7\textheight]{img/gitrepo} \end{center} - \column{0.5\textwidth} + \column{0.7\textwidth} \begin{itemize} - \item Un projet git c'est une suite de commits (et un pointeur sur le dernier). - \item Le contenu d'un fichier existe comme suite de modifications. + \item Historique git: suite de commits (+ pointeur sur dernier). + \item Un fichier existe seulement comme suite de modifications. \item Un commit non pointé est un commit perdu. \end{itemize} \end{columns} @@ -127,6 +134,7 @@ \item Créer un commit: \verb|git commit| \item Voir l'historique: \verb|git log| \item Voir le log en plus joli: \verb|git log --all --graph --decorate --oneline| + \item Afficher un commit plus en détail: \verb|git show COMMIT_HASH| \end{itemize} \end{frame} @@ -136,22 +144,30 @@ \frametitle{Ça sert à quoi?} \begin{itemize} \item Travailler à plusieurs. - \item Faire plusieurs choses au même temps (nouvelle fonctionnalité, correction de bugs). + \item Faire plusieurs choses au même temps (nouvelle fonctionnalité, correction de bugs, ...). \item Essayer des nouvelles choses en parallèle sans impacter le projet: modifications indépendantes sur une même base. - \item Il est très facile de basculer de l'une à l'autre: git modifie les fichiers automatiquement. + \end{itemize} + + \vspace{2\baselineskip} + + \begin{itemize} + \item Très facile de basculer de l'une à l'autre: git modifie les fichiers automatiquement. \end{itemize} \end{frame} \begin{frame} \frametitle{C'est quoi?} \begin{columns}[c] - \column{0.5\textwidth} + \column{0.4\textwidth} \begin{center} \includegraphics[height=0.7\textheight]{img/branches} \end{center} - \column{0.5\textwidth} + \column{0.6\textwidth} + \begin{itemize} + \item Branche: pointeur sur un commit + \end{itemize} + \vspace{\baselineskip} \begin{itemize} - \item Littéralement un pointeur sur un commit \item Une histoire qui diverge à partir d'un certain commit \item En se positionnant sur un pointeur ou sur un autre on voit des choses différentes \end{itemize} @@ -178,7 +194,7 @@ \begin{frame} \frametitle{Les conflits de merge :(} - Parfois il est impossible de fusionner proprement: si les deux branches ont modifié le même bout de code. + Parfois impossible de fusionner automatiquement: si les deux branches ont modifié le même bout de code. \begin{block}{} Le commit de merge peut introduire des modifications: utilisé pour résoudre les conflits @@ -197,37 +213,53 @@ \end{block} \end{frame} +\begin{frame}{Le merge ``fast-forward''} + \begin{columns} + \column{0.5\textwidth} + \begin{center} + \includegraphics[width=\textwidth]{img/fast-forward} + \end{center} + + \column{0.5\textwidth} + \begin{itemize} + \item Quand il n'y a pas de modifications à fusionner + \item Le pointeur de branche est simplement modifié + \end{itemize} + \end{columns} +\end{frame} + + \subsection*{Les commandes des branches} \begin{frame}[fragile] \frametitle{Les commandes des branches} \begin{itemize} - \item Créer une branche avec comme base le commit courant: \verb|git branch NAME| - \item Bouger entre les branches: \verb|git checkout BRANCH| + \item Créer une branche avec comme base le commit courant: \verb|git branch NOM| + \item Créer une branche avec comme base un commit spécifique: \verb|git checkout -b BRANCHE COMMIT| + \item Bouger entre les branches: \verb|git checkout BRANCHE| \item Fusionner une branche: \verb|git merge ORIGINE [DESTINATION]| \item En cas de conflit: \begin{itemize} \item Modifier les fichiers à la main \item \verb|git add FICHIERS...| - \item \verb|git commit| ou \verb|git merge --continue| + \item \verb|git commit| \end{itemize} - \item Il est aussi possible d'abandonner la fusion pendant un conflit: \verb|git merge --abort| + \item Abandonner la fusion pendant un conflit: \verb|git merge --abort| \end{itemize} \end{frame} \section{Dépôts distants (remotes)} \subsection{Explication} -\begin{frame} +\begin{frame}[fragile] \frametitle{Les dépôts distants} Chaque développeur a toujours une \textit{copie intégrale} du projet. - Il est possible d'avoir une copie du projet sur un serveur pour mettre en commun le travail. + Il est possible d'avoir une telle copie du projet sur un serveur pour mettre en commun le travail. \begin{block}{} - La copie d'un branche hébergée sur le serveur n'est qu'une branche. Elle peut être inspectée comme toute branche locale (il faut la récupérer avant). + Une copie de chaque branche du serveur est gardée en local pour pouvoir être inspectée (\verb|origin/branche|). \end{block} - \end{frame} \begin{frame} @@ -245,32 +277,40 @@ \begin{frame} \frametitle{Historique commun} - Sur git il est possible de modifier l'historique (réorganiser les commits, les modifier, ...). Même si on ne verra pas comment faire, il faut toujours retenir: + Sur git il est possible de modifier l'historique (réorganiser les commits, les modifier, ...). On ne verra pas comment faire, mais il faut toujours retenir: \begin{alertblock}{} - Il ne faut jamais modifier l'historique commun!!! + \textbf{Il ne faut jamais modifier l'historique commun!!!} \end{alertblock} - - Tout ce qui a été poussé sur un dépôt distant est commun. - - Il ne faut modifier rien qui puisse être atteint à partir d'un commit présent sur le dépôt commun. + + \vspace{\baselineskip} + + \begin{itemize} + \item Tout ce qui est sur le dépôt distant est commun. + \item Il ne faut modifier rien qui puisse être atteint à partir d'un commit présent sur le dépôt distant. + \end{itemize} \end{frame} \subsection{Les commandes} \begin{frame}[fragile] \frametitle{Les commande des remotes} \begin{itemize} - \item Récupère les modifications de la branche remote sans les intégrer à la branche courante (= met à jour les branches \verb|origin/*|): \verb|git fetch| + \item Mettre à jour la copie locale de la branche remote (commande non-destructive): \verb|git fetch| \item Récupère les modifications de la branche remote et les ajoute dans la branche courante: \verb#git pull [ --merge | --rebase ]# \item Pousse les modifications de la branche courante sur le remote: \verb|git push|. \begin{itemize} - \item Dans le cas que la branche remote n'existe pas (elle va être crée): \verb|git push -u origin NAME| + \item Il faut avoir fait un pull avant + \item Dans le cas que la branche remote n'existe pas (elle sera crée): \verb|git push -u origin NOM| \end{itemize} \end{itemize} \end{frame} \subsection{Les techniques de pull} +\begin{frame}[noframenumbering]{} + \tableofcontents[currentsection,currentsubsection] +\end{frame} + \begin{frame} \frametitle{Pull merge (default)} \begin{columns}[T] @@ -299,6 +339,24 @@ \end{columns} \end{frame} +\begin{frame}[fragile]{Merge vs Rebase} + \begin{itemize} + \item Merge: la résolution de tous les conflits est dans le commit de merge. Rebase: chaque commit est modifié pour résoudre ses conflits + \begin{itemize} + \item Rebase modifie directement les conflits (comme s'il y en avait pas eu) plutôt que d'ajouter un commit de ``solution'' + \end{itemize} + \item Rebase: ``triche'' sur la façon de raconter l'historique + \item Rebase: historique propre + \begin{itemize} + \item Le seuls merge présents dans l'historique c'est ceux qui signifient quelque chose (e.g. une nouvelle fonctionnalité ajoutée) + \end{itemize} + \end{itemize} + + \vspace{2\baselineskip} + Faire un pull rebase par défaut: \verb|git config [--global] pull.rebase true| +\end{frame} + + \section{Pointeurs avancés} \begin{frame}[fragile] @@ -308,12 +366,19 @@ \item Il pointe normalement sur la branche courante \item \verb|git checkout COMMIT_HASH| permet de bouger HEAD à un autre point de l'histoire: les fichiers auront alors le contenu qu'ils avaient à ce moment là. \end{itemize} + \vspace{2\baselineskip} + \begin{itemize} + \item Rappel: si un commit n'est pas pointé par quelque chose, il est détruit + \end{itemize} + \end{frame} \begin{frame}[fragile] \frametitle{Le soft reset} \verb|git reset COMMIT_HASH| permet de bouger la tête de la branche sur un commit particulier. Il n'y a plus rien qui pointe sur les commits plus récents, \textbf{ils sont alors oubliés}. - + + \vspace{\baselineskip} + Les fichiers ne sont par contre pas modifiés. \end{frame} @@ -322,10 +387,29 @@ \verb|git reset --hard COMMIT_HASH| permet de bouger la tête de la branche sur un commit particulier, \textbf{en écrasant toutes les modifications faites depuis}. \begin{block}{} - \verb|git reset --hard HEAD| supprime toutes les modifications faites depuis le dernier commit (donc juste les modifications pas enregistrées dans un commit). + \verb|git reset --hard HEAD| supprime toutes les modifications faites depuis le dernier commit (modifications pas enregistrées dans un commit). \end{block} \end{frame} +\section{Conclusion} + +\begin{frame}{Git bash} + Affiche des informations sur les dépôt git dans le terminal. + + \vspace{2\baselineskip} + + \url{https://github.com/magicmonty/bash-git-prompt} +\end{frame} + +\begin{frame}[fragile]{Pas vu dans ce cours} + \begin{itemize} + \item Rebase: comment modifier l'historique (très puissant et très dangereux) + \item Comment bouger les commits d'une branche à une autre + \item \verb|git reflog|: historique des actions effectuées + \item \verb|git bisect|: recherche interactive de bug par dichotomie + \end{itemize} +\end{frame} + \frame{\titlepage} \end{document} diff --git a/img/fast-forward.dia b/img/fast-forward.dia new file mode 100644 index 0000000..63bb9ec Binary files /dev/null and b/img/fast-forward.dia differ diff --git a/img/fast-forward.png b/img/fast-forward.png new file mode 100644 index 0000000..a49255e Binary files /dev/null and b/img/fast-forward.png differ diff --git a/img/gitrepo.dia b/img/gitrepo.dia index 840cd2e..90a2ff0 100644 Binary files a/img/gitrepo.dia and b/img/gitrepo.dia differ diff --git a/img/gitrepo.png b/img/gitrepo.png index 49d47c4..1056c02 100644 Binary files a/img/gitrepo.png and b/img/gitrepo.png differ diff --git a/img/pull.dia b/img/pull.dia index c94d8ae..a86ae26 100644 Binary files a/img/pull.dia and b/img/pull.dia differ diff --git a/img/pull_before.png b/img/pull_before.png index 04f1536..a4c435b 100644 Binary files a/img/pull_before.png and b/img/pull_before.png differ diff --git a/img/pull_merge.png b/img/pull_merge.png index 3698b87..bc8e089 100644 Binary files a/img/pull_merge.png and b/img/pull_merge.png differ diff --git a/img/pull_rebase.png b/img/pull_rebase.png index 1c3c00e..9807d7e 100644 Binary files a/img/pull_rebase.png and b/img/pull_rebase.png differ diff --git a/img/remotes.dia b/img/remotes.dia index 766f2b2..cfcdb65 100644 Binary files a/img/remotes.dia and b/img/remotes.dia differ diff --git a/img/remotes_diverging.png b/img/remotes_diverging.png index c29de21..48cefcb 100644 Binary files a/img/remotes_diverging.png and b/img/remotes_diverging.png differ diff --git a/img/remotes_non_diverging.png b/img/remotes_non_diverging.png index 9883d1f..91b1fbd 100644 Binary files a/img/remotes_non_diverging.png and b/img/remotes_non_diverging.png differ