Révision partielle de formations EOLE
This commit is contained in:
10
content/outils/scm/git/exercices/exercice_01.tex
Normal file
10
content/outils/scm/git/exercices/exercice_01.tex
Normal file
@ -0,0 +1,10 @@
|
||||
\begin{frame}
|
||||
\frametitle{Exercices}
|
||||
\framesubtitle{Configuration globale de git}
|
||||
Les paramètres de l'application git peuvent être globaux ou propres à un dépôt.
|
||||
|
||||
L'ergonomie, l'identité, les alias sont souvent les mêmes pour tous les dépôts.
|
||||
La première étape consiste généralement à renseigner ces paramètres.
|
||||
|
||||
Le premier exercice consiste donc à renseigner un minimum de ces variables globales.
|
||||
\end{frame}
|
38
content/outils/scm/git/exercices/exercice_01/steps.tex
Normal file
38
content/outils/scm/git/exercices/exercice_01/steps.tex
Normal file
@ -0,0 +1,38 @@
|
||||
\begin{frame}
|
||||
\frametitle{Mise en place}
|
||||
\framesubtitle{Identité de l'utilisateur}
|
||||
\begin{itemize}
|
||||
\item \commande{git config --global user.name "<nom de l'utilisateur>"}
|
||||
\item \commande{git config --global user.email "<courriel de l'utilisateur>"}
|
||||
\end{itemize}
|
||||
\begin{exampleblock}{En cas d'oubli}
|
||||
\commande{git} émet un avertissement lors du premier commit si ces variables ne sont pas renseignées.
|
||||
Il est possible de corriger cet oubli facilement si les commit n'ont pas encore été partagés.
|
||||
\end{exampleblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Mise en place}
|
||||
\framesubtitle{Ergonomie}
|
||||
\begin{itemize}
|
||||
\item \commande{git config --global color.ui auto}
|
||||
\item \commande{git config --global core.editor "<éditeur de texte à utiliser>"}
|
||||
\item \commande{git config --global core.pager "<pager>"}
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Mise en place}
|
||||
\framesubtitle{Ergonomie (GNU/Linux)}
|
||||
\begin{minted}{bash}
|
||||
source ~/.git-prompt.sh
|
||||
GIT_PS1_SHOWDIRTYSTATE=1
|
||||
GIT_PS1_SHOWSTASHSTATE=1
|
||||
GIT_PS1_SHOWUNTRACKEDFILES=1
|
||||
GIT_PS1_SHOWUPSTREAM="auto"
|
||||
PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
|
||||
\end{minted}
|
||||
\begin{exampleblock}{git-prompt}
|
||||
git-prompt.sh est un script définissant la fonction \_\_git\_ps1 permettant d'afficher des informations pertinentes sur l'état du dépôt git dans l'invite de commande.
|
||||
\end{exampleblock}
|
||||
\end{frame}
|
14
content/outils/scm/git/exercices/exercice_02.tex
Normal file
14
content/outils/scm/git/exercices/exercice_02.tex
Normal file
@ -0,0 +1,14 @@
|
||||
\begin{frame}
|
||||
\frametitle{Exercices}
|
||||
\framesubtitle{Initialiser un dépôt}
|
||||
Un dépôt git peut être amorcé de différentes façons selon le contexte.
|
||||
\begin{itemize}
|
||||
\item le dépôt existe déjà en \emph{distant} :
|
||||
\begin{itemize}
|
||||
\item le dépôt distant est déjà au format git ;
|
||||
\item le dépôt distant est géré par un autre scm ;
|
||||
\end{itemize}
|
||||
\item un répertoire local doit être converti en dépôt git ;
|
||||
\end{itemize}
|
||||
L'exercice propose la création d'un dépôt suivant ces différents contextes.
|
||||
\end{frame}
|
21
content/outils/scm/git/exercices/exercice_02/steps.tex
Normal file
21
content/outils/scm/git/exercices/exercice_02/steps.tex
Normal file
@ -0,0 +1,21 @@
|
||||
\begin{frame}
|
||||
\frametitle{Initialiser le dépôt}
|
||||
\framesubtitle{Récupérer le dépôt git distant en ssh}
|
||||
Le serveur de dépôt de test propose un dépôt par groupe.
|
||||
|
||||
\commande{git clone ssh://gogs@<adresse\_serveur>/formation/<groupe>}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Initialiser le dépôt}
|
||||
\framesubtitle{Récupérer le dépôt git distant en https}
|
||||
L'accès au serveur est aussi permis en http(s)
|
||||
|
||||
\commande{git clone http://<adresse\_serveur>:3000/formation/<groupe>}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Initialiser le dépôt}
|
||||
\framesubtitle{Convertir le dossier local en dépôt git}
|
||||
N'importe quelle répertoire peut être converti en dépôt git.
|
||||
|
||||
\commande{git init}
|
||||
\end{frame}
|
9
content/outils/scm/git/exercices/exercice_03.tex
Normal file
9
content/outils/scm/git/exercices/exercice_03.tex
Normal file
@ -0,0 +1,9 @@
|
||||
\begin{frame}
|
||||
\frametitle{Exercice}
|
||||
\framesubtitle{Avoir des dépôts distants en référence}
|
||||
Les dépôts distants sont un aspect important du fonctionnement d'un SCM décentralisé.
|
||||
|
||||
git permet d'associer plusieurs dépôts distants à un dépôt local et de renseigner à quelle branche de quel dépôt distant une branche locale doit se référer.
|
||||
|
||||
Le présent exercice aborde la mise en place de tels liens entre branches locales et branches distantes.
|
||||
\end{frame}
|
31
content/outils/scm/git/exercices/exercice_03/steps.tex
Normal file
31
content/outils/scm/git/exercices/exercice_03/steps.tex
Normal file
@ -0,0 +1,31 @@
|
||||
\begin{frame}
|
||||
\frametitle{Associer les dépôts distants}
|
||||
\framesubtitle{Ajouter un dépôt distant}
|
||||
\commande{git remote add <nom> <protocole>://[<utilisateur>@]<adresse>[:port]/<chemin>}
|
||||
|
||||
Exemples :
|
||||
\begin{itemize}
|
||||
\item \commande{git remote add formation ssh://gogs@localhost:3000/formation/exercices.git}
|
||||
\item \commande{git remote add formation http://gogs@localhost:3000/formation/exercices.git}
|
||||
\end{itemize}
|
||||
\begin{exampleblock}{Vérification}
|
||||
Les dépôts distants configurés peuvent être listés avec :
|
||||
\begin{itemize}
|
||||
\item \commande{git remote} pour la version sobre ou
|
||||
\item \commande{git remote -v} pour plus de détails.
|
||||
\end{itemize}
|
||||
\end{exampleblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Associer les dépôts distants}
|
||||
\framesubtitle{Observer une branche distante}
|
||||
Pour une branche distante existante :
|
||||
\begin{itemize}
|
||||
\item \commande{git branch --set-upstream-to=<nom\_dépôt\_distant>/<branche\_distante>}
|
||||
\end{itemize}
|
||||
Pour une branche distante inexistante :
|
||||
\begin{itemize}
|
||||
\item \commande{git push --set-upstream <nom\_dépôt\_distant> <branche\_locale>}
|
||||
\end{itemize}
|
||||
\end{frame}
|
7
content/outils/scm/git/exercices/exercice_04.tex
Normal file
7
content/outils/scm/git/exercices/exercice_04.tex
Normal file
@ -0,0 +1,7 @@
|
||||
\begin{frame}
|
||||
\frametitle{Exercice}
|
||||
\framesubtitle{Premier commit}
|
||||
Le premier commit est toujours le plus facile. Pas de conflit à attendre, pas de stress…
|
||||
|
||||
Cet exercice permet de revoir le fonctionnement des \emph{arbres} de git avec l'ajout d'un simple fichier dans un dossier.
|
||||
\end{frame}
|
138
content/outils/scm/git/exercices/exercice_04/steps.tex
Normal file
138
content/outils/scm/git/exercices/exercice_04/steps.tex
Normal file
@ -0,0 +1,138 @@
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Dépôt vide}
|
||||
Au démarrage, est un dépôt vide :
|
||||
|
||||
\begin{minted}[fontsize=\tiny]{bash}
|
||||
Sur la branche master
|
||||
|
||||
Validation initiale
|
||||
|
||||
rien à valider (créez/copiez des fichiers et utilisez "git add" pour les suivre)
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Et pourtant…}
|
||||
\begin{columns}
|
||||
\begin{column}{0.5\textwidth}
|
||||
L'initialisation consiste en la création du dossier .git :
|
||||
\end{column}
|
||||
\begin{column}{0.5\textwidth}
|
||||
\begin{minted}[fontsize=\tiny]{bash}
|
||||
.
|
||||
└── .git
|
||||
├── branches
|
||||
├── config
|
||||
├── description
|
||||
├── HEAD
|
||||
├── hooks
|
||||
│ ├── applypatch-msg.sample
|
||||
│ ├── commit-msg.sample
|
||||
│ ├── post-update.sample
|
||||
│ ├── pre-applypatch.sample
|
||||
│ ├── pre-commit.sample
|
||||
│ ├── prepare-commit-msg.sample
|
||||
│ ├── pre-push.sample
|
||||
│ ├── pre-rebase.sample
|
||||
│ └── update.sample
|
||||
├── info
|
||||
│ └── exclude
|
||||
├── objects
|
||||
│ ├── info
|
||||
│ └── pack
|
||||
└── refs
|
||||
├── heads
|
||||
└── tags
|
||||
\end{minted}
|
||||
\end{column}
|
||||
\end{columns}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Création d'un dossier}
|
||||
\commande{mkdir doc}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Création d'un dossier}
|
||||
\commande{git status}
|
||||
\begin{minted}[fontsize=\tiny]{bash}
|
||||
Sur la branche master
|
||||
|
||||
Validation initiale
|
||||
|
||||
rien à valider (créez/copiez des fichiers et utilisez "git add" pour les suivre)
|
||||
\end{minted}
|
||||
\begin{exampleblock}{}
|
||||
git ne prend en considération que le contenu des fichiers.
|
||||
\end{exampleblock}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Création d'un fichier}
|
||||
\commande{touch doc/README}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Création d'un fichier}
|
||||
\commande{git status}
|
||||
\begin{minted}[fontsize=\tiny]{bash}
|
||||
Sur la branche master
|
||||
|
||||
Validation initiale
|
||||
|
||||
Fichiers non suivis:
|
||||
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
|
||||
|
||||
doc/
|
||||
|
||||
aucune modification ajoutée à la validation mais des fichiers non suivis sont présents
|
||||
(utilisez "git add" pour les suivre)
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Création d'un fichier}
|
||||
\commande{git add .}
|
||||
\skbinput[from=fig]{apps/git_commande_add}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Création d'un fichier}
|
||||
\commande{git status}
|
||||
\begin{minted}[fontsize=\tiny]{bash}
|
||||
Sur la branche master
|
||||
|
||||
Validation initiale
|
||||
|
||||
Modifications qui seront validées :
|
||||
(utilisez "git rm --cached <fichier>..." pour désindexer)
|
||||
|
||||
nouveau fichier : doc/README
|
||||
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Création d'un fichier}
|
||||
\commande{git commit -m "Ajout du premier fichier."}
|
||||
\skbinput[from=fig]{apps/git_commande_commit}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Premier pas}
|
||||
\framesubtitle{Création d'un fichier}
|
||||
\commande{git status}
|
||||
\begin{minted}[fontsize=\tiny]{bash}
|
||||
Sur la branche master
|
||||
rien à valider, la copie de travail est propre
|
||||
\end{minted}
|
||||
\end{frame}
|
8
content/outils/scm/git/exercices/exercice_05.tex
Normal file
8
content/outils/scm/git/exercices/exercice_05.tex
Normal file
@ -0,0 +1,8 @@
|
||||
\begin{frame}
|
||||
\frametitle{Exercice}
|
||||
\framesubtitle{Gérer son répertoire de travail}
|
||||
Le répertoire de travail est la vue du dépôt la plus facile à prendre en main dans un dépôt git.
|
||||
|
||||
Cet exercice a pour but de bien maîtriser les quatre états des fichiers dans un dépôt git : non-suivi, suivi et identique au contenu de l'index, suivi et différent et enfin, suivi, différent et selectionné pour archivage.
|
||||
La difficulté majeure, à ce stade, est de toujours contrôler les passages d'état pour ne pas archiver un fichier indésirable par exemple.
|
||||
\end{frame}
|
115
content/outils/scm/git/exercices/exercice_05/steps.tex
Normal file
115
content/outils/scm/git/exercices/exercice_05/steps.tex
Normal file
@ -0,0 +1,115 @@
|
||||
\begin{frame}
|
||||
\frametitle{Gérer son répertoire de travail}
|
||||
\framesubtitle{Créer un fichier}
|
||||
\commande{echo "userA userApwd" > password}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Gérer son répertoire de travail}
|
||||
\framesubtitle{Modifier un fichier}
|
||||
Ajouter du texte au fichier doc/README
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Gérer son répertoire de travail}
|
||||
\framesubtitle{Admirer la complexité de la situation}
|
||||
\commande{git status}
|
||||
\begin{minted}[fontsize=\tiny]{console}
|
||||
Sur la branche master
|
||||
Modifications qui seront validées :
|
||||
(utilisez "git reset HEAD <fichier>..." pour désindexer)
|
||||
|
||||
modifié : doc/README
|
||||
|
||||
Fichiers non suivis:
|
||||
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
|
||||
|
||||
password
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Gérer son répertoire de travail}
|
||||
\framesubtitle{À la croisée des chemins}
|
||||
Associer les commandes suivantes :
|
||||
\begin{columns}
|
||||
\begin{column}{.3\textwidth}
|
||||
\tiny{\commande{git add .}}
|
||||
|
||||
\tiny{\commande{git commit -m "Tout de go"}}
|
||||
\end{column}
|
||||
\begin{column}{.3\textwidth}
|
||||
\tiny{\commande{git commit -am "Implicite"}}
|
||||
\end{column}
|
||||
\begin{column}{.3\textwidth}
|
||||
\tiny{\commande{git add doc/README}}
|
||||
|
||||
\tiny{\commande{git commit -m "Explicite"}}
|
||||
\end{column}
|
||||
\end{columns}
|
||||
aux résultats suivants :
|
||||
\begin{columns}
|
||||
\begin{column}{.3\textwidth}
|
||||
\begin{minted}[fontsize=\tiny,breaklines,frame=single]{console}
|
||||
Sur la branche master
|
||||
Fichiers non suivis:
|
||||
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
|
||||
|
||||
password
|
||||
|
||||
aucune modification ajoutée à la validation mais des fichiers non suivis sont présents (utilisez "git add" pour les suivre)
|
||||
\end{minted}
|
||||
\end{column}
|
||||
\begin{column}{.3\textwidth}
|
||||
\begin{minted}[fontsize=\tiny,breaklines,frame=single]{console}
|
||||
Sur la branche master
|
||||
rien à valider, la copie de travail est propre
|
||||
\end{minted}
|
||||
\end{column}
|
||||
\begin{column}{.3\textwidth}
|
||||
\begin{minted}[fontsize=\tiny,breaklines,frame=single]{console}
|
||||
Sur la branche master
|
||||
Fichiers non suivis:
|
||||
(utilisez "git add <fichier>..." pour inclure dans ce qui sera validé)
|
||||
|
||||
password
|
||||
|
||||
aucune modification ajoutée à la validation mais des fichiers non suivis sont présents (utilisez "git add" pour les suivre)
|
||||
\end{minted}
|
||||
\end{column}
|
||||
\end{columns}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Gérer son répertoire de travail}
|
||||
\framesubtitle{Parer les erreurs prévisibles}
|
||||
\commande{echo "password" > .gitignore}
|
||||
|
||||
\commande{git add .gitignore}
|
||||
|
||||
\commande{git commit -m "Filtre de fichier à ne pas suivre"}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Gérer son répertoire de travail}
|
||||
\framesubtitle{Laisser sur le côté de la route}
|
||||
\commande{git status}
|
||||
\begin{minted}[fontsize=\tiny]{console}
|
||||
Sur la branche master
|
||||
rien à valider, la copie de travail est propre
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Gérer son répertoire de travail}
|
||||
\framesubtitle{Et s'il est trop tard ?}
|
||||
\commande{git reset HEAD\~{}1}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Gérer son répertoire de travail}
|
||||
\framesubtitle{Recueil de .gitignore}
|
||||
Des .gitignore adaptés à différents contextes sont faciles à obtenir sur l'Internet.
|
||||
|
||||
\url{https://github.com/github/gitignore}
|
||||
\end{frame}
|
8
content/outils/scm/git/exercices/exercice_06.tex
Normal file
8
content/outils/scm/git/exercices/exercice_06.tex
Normal file
@ -0,0 +1,8 @@
|
||||
\begin{frame}
|
||||
\frametitle{Exercice}
|
||||
\framesubtitle{Utiliser les branches}
|
||||
Les branches sont faciles à créer et détruire dans un dépôt git.
|
||||
Cela en fait un outil de choix pour l'organisation du développement.
|
||||
|
||||
L'exercice suivant aborde les manipulations de base avec les branches.
|
||||
\end{frame}
|
219
content/outils/scm/git/exercices/exercice_06/steps.tex
Normal file
219
content/outils/scm/git/exercices/exercice_06/steps.tex
Normal file
@ -0,0 +1,219 @@
|
||||
\begin{frame}
|
||||
\frametitle{Utiliser les branches}
|
||||
\framesubtitle{Créer une branche}
|
||||
On créé une branche qui contiendra le fichier password.
|
||||
|
||||
\commande{git checkout -b branche\_indiscrete}
|
||||
|
||||
équivalent de la succession de commandes :
|
||||
\begin{enumerate}
|
||||
\item \commande{git branch branche\_indiscrete}
|
||||
\item \commande{git checkout branche\_indiscrete}
|
||||
\end{enumerate}
|
||||
\begin{tikzpicture}
|
||||
\gitDAG[grow right sep = 1em]{
|
||||
A -- B};
|
||||
\gitbranch{master}{above=of B}{B}
|
||||
\gitHEAD{above=of master}{master}
|
||||
\end{tikzpicture}
|
||||
\begin{tikzpicture}
|
||||
\gitDAG[grow right sep = 1em]{
|
||||
A -- B};
|
||||
\gitbranch{master}{above=of B}{B}
|
||||
\gitHEAD{above=of master}{master}
|
||||
\gitbranch[brindis]{brancheindiscrete}{below=of B}{B}
|
||||
\end{tikzpicture}
|
||||
\begin{tikzpicture}
|
||||
\gitDAG[grow right sep = 1em]{
|
||||
A -- B};
|
||||
\gitbranch{master}{above=of B}{B}
|
||||
\gitbranch[brindis]{brancheindiscrete}{below=of B}{B}
|
||||
\gitHEAD{below=of brindis}{brindis}
|
||||
\end{tikzpicture}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Utiliser les branches}
|
||||
\frametitle{Aparté}
|
||||
\commande{git add password}
|
||||
|
||||
\commande{git commit -m "le fichier indésirable"}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Utiliser les branches}
|
||||
\frametitle{Aparté}
|
||||
\commande{git log master..branche\_indiscrete}
|
||||
|
||||
\commande{git log master..}
|
||||
|
||||
\commande{git reflog}
|
||||
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Utiliser les branches}
|
||||
\framesubtitle{Merge}
|
||||
\commande{git checkout master}
|
||||
|
||||
\commande{git branch merge/automatique}
|
||||
|
||||
\commande{git branch merge/conflit}
|
||||
|
||||
\commande{git branch merge/rebase}
|
||||
% \begin{tikzpicture}
|
||||
% \gitDAG[grow down sep = 1em]{
|
||||
% A -- B};
|
||||
% \gitbranch{master}{left=of B}{B}
|
||||
% \gitHEAD{left=of master}{master}
|
||||
% \gitbranch[auto]{merge/automatique}{right=of master}{B}
|
||||
% \gitbranch[conflit]{merge/conflit}{right=of auto}{B}
|
||||
% \gitbranch[rebase]{merge/rebase}{right=of conflit}{B}
|
||||
% \end{tikzpicture}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Utiliser les branches}
|
||||
\framesubtitle{Merge}
|
||||
\commande{git checkout merge/automatique}
|
||||
|
||||
\commande{cp doc/README\{,.md\}}
|
||||
|
||||
\commande{git add doc/}
|
||||
|
||||
\commande{git commit -m "Copie du fichier"}
|
||||
% \begin{tikzpicture}
|
||||
% \gitDAG[grow down sep = 1em]{
|
||||
% A -- B --{C}};
|
||||
% \gitbranch{master}{right=of B}{B}
|
||||
% \gitHEAD{left=of auto}{auto}
|
||||
% \gitbranch[auto]{merge/automatique}{left=of C}{C}
|
||||
% \gitbranch[conflit]{merge/conflit}{right=of master}{B}
|
||||
% \gitbranch[rebase]{merge/rebase}{right=of conflit}{B}
|
||||
% \end{tikzpicture}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Utiliser les branches}
|
||||
\framesubtitle{Merge}
|
||||
\commande{git checkout merge/conflit}
|
||||
|
||||
Édition du fichier doc/README
|
||||
|
||||
\commande{git commit -am "Des ennuis en perspective"}
|
||||
|
||||
% \begin{tikzpicture}
|
||||
% \gitDAG[grow down sep = 1em]{
|
||||
% A -- B --{C, D}};
|
||||
% \gitbranch{master}{right=of B}{B}
|
||||
% \gitHEAD{left=of conflit}{conflit}
|
||||
% \gitbranch[auto]{merge/automatique}{right=of C}{C}
|
||||
% \gitbranch[conflit]{merge/conflit}{left=of D}{D}
|
||||
% \gitbranch[rebase]{merge/rebase}{right=of master}{B}
|
||||
% \end{tikzpicture}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Utiliser les branches}
|
||||
\framesubtitle{Merge}
|
||||
\commande{git checkout merge/rebase}
|
||||
|
||||
Édition du fichier doc/README
|
||||
|
||||
\commande{git commit -am "Des ennuis en perspective"}
|
||||
|
||||
% \begin{tikzpicture}
|
||||
% \gitDAG[grow right sep = 1em]{
|
||||
% A -- B --{C, D, E}};
|
||||
% \gitbranch{master}{above=of B}{B}
|
||||
% \gitHEAD{above=of rebase}{rebase}
|
||||
% \gitbranch[auto]{merge/automatique}{above=of C}{C}
|
||||
% \gitbranch[conflit]{merge/conflit}{above=of D}{D}
|
||||
% \gitbranch[rebase]{merge/rebase}{above=of E}{E}
|
||||
% \end{tikzpicture}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Utiliser les branches}
|
||||
\framesubtitle{Merge}
|
||||
|
||||
\commande{git checkout master}
|
||||
|
||||
Édition du fichier doc/README pour ajouter des alias
|
||||
|
||||
\commande{git commit -am "Des ennuis en perspective"}
|
||||
|
||||
Pour chaque branche merge/*, tenter la commande :
|
||||
\commande{git merge merge/<nom>}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Utiliser les branches}
|
||||
\framesubtitle{Rebase}
|
||||
\commande{git checkout merge/rebase}
|
||||
|
||||
\commande{git rebase master}
|
||||
% \begin{tikzpicture}
|
||||
% \gitDAG[grow down sep = 1em]{
|
||||
% A -- B --{C, D, E'}};
|
||||
% \gitbranch{master}{right=of B}{B}
|
||||
% \gitHEAD{left=of rebase}{rebase}
|
||||
% \gitbranch[auto]{merge/automatique}{right=of C}{C}
|
||||
% \gitbranch[conflit]{merge/conflit}{right=of D}{D}
|
||||
% \gitbranch[rebase]{merge/rebase}{left=of E'}{E'}
|
||||
% \end{tikzpicture}
|
||||
|
||||
\end{frame}
|
||||
% \begin{tikzpicture}
|
||||
% % Commit DAG
|
||||
% \gitDAG[grow right sep = 2em]{
|
||||
% A -- B -- {
|
||||
% C,
|
||||
% D -- E,
|
||||
% }
|
||||
% };
|
||||
% % Tag reference
|
||||
% \gittag
|
||||
% [v0p1] % node name
|
||||
% {v0.1} % node text
|
||||
% {above=of A} % node placement
|
||||
% {A} % target
|
||||
% % Remote branch
|
||||
% \gitremotebranch
|
||||
% [origmaster] % node name
|
||||
% {origin/master} % node text
|
||||
% {above=of C} % node placement
|
||||
% {C} % target
|
||||
% % Branch
|
||||
% \gitbranch
|
||||
% {master} % node name and text
|
||||
% {above=of E} % node placement
|
||||
% {E} % target
|
||||
% % HEAD reference
|
||||
% \gitHEAD
|
||||
% {above=of master} % node placement
|
||||
% {master} % target
|
||||
% \end{tikzpicture}
|
||||
% \begin{tikzpicture}
|
||||
% \gitDAG[grow right sep = 2em]{
|
||||
% A -- B -- {
|
||||
% C -- D' -- E',
|
||||
% {[nodes=unreachable] D -- E },
|
||||
% }
|
||||
% };
|
||||
% % Tag reference
|
||||
% \gittag
|
||||
% [v0p1] % node name
|
||||
% {v0.1} % node text
|
||||
% {above=of A} % node placement
|
||||
% {A} % target
|
||||
% % Remote branch
|
||||
% \gitremotebranch
|
||||
% [origmaster] % node name
|
||||
% {origin/master} % node text
|
||||
% {above=of C} % node placement
|
||||
% {C} % target
|
||||
% % Branch
|
||||
% \gitbranch
|
||||
% {master} % node name and text
|
||||
% {above=of E'} % node placement
|
||||
% {E'} % target
|
||||
% % HEAD reference
|
||||
% \gitHEAD
|
||||
% {above=of master} % node placement
|
||||
% {master} % target
|
||||
% \SAandWT
|
||||
% \end{tikzpicture}
|
11
content/outils/scm/git/exercices/exercice_07.tex
Normal file
11
content/outils/scm/git/exercices/exercice_07.tex
Normal file
@ -0,0 +1,11 @@
|
||||
\begin{frame}
|
||||
\frametitle{Exercice}
|
||||
\framesubtitle{Inspection générale}
|
||||
Un historique de code n'a d'intérêt que si le besoin de connaître les actions
|
||||
qui ont mené à un état se fait sentir.
|
||||
|
||||
git met à disposition divers outils pour inspecter l'historique.
|
||||
Cet exercice se propose de présenter certains de ces outils.
|
||||
|
||||
Cet exercice s'appuie sur le contenu du dépôt git \emph{exercices} fourni.
|
||||
\end{frame}
|
132
content/outils/scm/git/exercices/exercice_07/steps.tex
Normal file
132
content/outils/scm/git/exercices/exercice_07/steps.tex
Normal file
@ -0,0 +1,132 @@
|
||||
\begin{frame}
|
||||
\frametitle{Inspection}
|
||||
\framesubtitle{log}
|
||||
Comparer les branches du dépôt \emph{exercices} en explorant les différentes options de git log (--graph, --all, --decorate, .., ...)
|
||||
|
||||
\commande{git log}
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Inspection}
|
||||
\framesubtitle{log}
|
||||
\begin{tikzpicture}
|
||||
\begin{pgflowlevelscope}{\pgftransformscale{0.5}}
|
||||
\gitDAG[grow right sep=1em]{
|
||||
fcacc8a -- a3a980c -- {6d7f839 -- {d221665 -- 841f693 -- f5965df -- a12f94b -- 5464ee7, fe0c2b7 -- 6212e29 -- 0f13577 -- a60f3ed, f81ca5c, 7e54de0},
|
||||
30a5821, b13bcf2, 902ae87}
|
||||
};
|
||||
\gitbranch
|
||||
{master}
|
||||
{above=of 6d7f839}
|
||||
{6d7f839}
|
||||
\gitbranch
|
||||
{brancheindiscrete}
|
||||
{right=of 902ae87}
|
||||
{902ae87}
|
||||
\gitbranch
|
||||
{merge/conflit}
|
||||
{right=of 30a5821}
|
||||
{30a5821}
|
||||
\gitbranch
|
||||
{merge/automatique}
|
||||
{right=of b13bcf2}
|
||||
{b13bcf2}
|
||||
\gitbranch
|
||||
{merge/rebase}
|
||||
{right=of 7e54de0}
|
||||
{7e54de0}
|
||||
\gitbranch
|
||||
{branche/perdue}
|
||||
{right=of f81ca5c}
|
||||
{f81ca5c}
|
||||
\gitbranch
|
||||
{branche/minee}
|
||||
{above=of 5464ee7}
|
||||
{5464ee7}
|
||||
\gitbranch
|
||||
{histoire/confuse}
|
||||
{right=of a60f3ed}
|
||||
{a60f3ed}
|
||||
\end{pgflowlevelscope}
|
||||
\end{tikzpicture}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Inspection}
|
||||
\framesubtitle{bisect}
|
||||
\begin{minipage}{\textwidth}
|
||||
\begin{tikzpicture}
|
||||
%\begin{pgflowlevelscope}{\pgftransformscale{0.5}}
|
||||
\begin{pgflowlevel}{\pgftransformscale{0.6}}
|
||||
\gitDAG[grow right sep=1em]{
|
||||
fcacc8a -- a3a980c -- {6d7f839 -- {d221665 -- 841f693 -- f5965df -- a12f94b -- 5464ee7}}
|
||||
};
|
||||
\gitbranch
|
||||
{master}
|
||||
{above=of 6d7f839}
|
||||
{6d7f839}
|
||||
\gitbranch
|
||||
{branche/minee}
|
||||
{above=of 5464ee7}
|
||||
{5464ee7}
|
||||
%\end{pgflowlevelscope}
|
||||
\end{pgflowlevel}
|
||||
\end{tikzpicture}
|
||||
\end{minipage}
|
||||
|
||||
La branche minee schématise une situation dans laquelle un dysfonctionnement a été introduit mais pas détecté
|
||||
aussitôt.
|
||||
Un script \emph{test.sh} a été ajouté pour simuler le test du code.
|
||||
Il retourne \emph{0} lorsque le code est bon, \emph{1} lorsque le code est mauvais.
|
||||
|
||||
L'exercice consiste donc à utiliser la commande \commande{git bisect} pour repérer le commit ayant introduit l'erreur, c'est-à-dire à partir duquel le script retourne \emph{1}.
|
||||
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Inspection}
|
||||
\framesubtitle{bisect}
|
||||
Conditions de départ :
|
||||
\begin{itemize}
|
||||
\item dernier \emph{commit} de la branche \emph{branche/minee}
|
||||
\item dernier état du code fonctionnel : dernier \emph{commit} de la branche \emph{master}.
|
||||
\end{itemize}
|
||||
\begin{enumerate}[<+->]
|
||||
\item \commande{git checkout branche/minee}
|
||||
\item \commande{git bisect start} \# démarrage de la session de recherche
|
||||
\item \commande{git bisect bad} \# déclaration de l'état du dernier \emph{commit}
|
||||
\item \commande{git bisect good \$(git log --oneline -1 --format=\%h master)} \# déclaration du dernier état fonctionnel connu
|
||||
\end{enumerate}
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Inspection}
|
||||
\framesubtitle{bisect}
|
||||
À chaque déplacement contrôlé par \commande{git bisect}, exécuter \emph{test.sh} et indiquer si l'état est fonctionnel :
|
||||
|
||||
\commande{./test.sh; [[ \$? -eq 0 ]] \&\& git bisect good || git bisect bad}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Inspection}
|
||||
\framesubtitle{bisect}
|
||||
\commande{a12f94b62f617417f4b1f8c5317bc2f033c92f5a is the first bad commit}
|
||||
|
||||
Terminer la session de recherche :
|
||||
\commande{git bisect reset}
|
||||
\end{frame}
|
||||
|
||||
\begin{frame}
|
||||
\frametitle{Inspection}
|
||||
\framesubtitle{blame}
|
||||
La conclusion précédente, vu la simplicité du code en cause, aurait pu être tirée grâce à \commande{git blame} et \commande{git log}.
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Inspection}
|
||||
\framesubtitle{blame}
|
||||
\begin{itemize}
|
||||
\item \commande{git blame test.sh}
|
||||
\item \commande{git log -S"exit 1" test.sh}
|
||||
\end{itemize}
|
||||
\end{frame}
|
8
content/outils/scm/git/exercices/exercice_08.tex
Normal file
8
content/outils/scm/git/exercices/exercice_08.tex
Normal file
@ -0,0 +1,8 @@
|
||||
\begin{frame}
|
||||
\frametitle{Exercice}
|
||||
\framesubtitle{Travail collaboratif}
|
||||
En fait de travail collaboratif, chacun peut facilement personnifier l'enfer pour ses collègues.
|
||||
|
||||
L'exercice suivant propose de nettoyer son dépôt personnel avant de le rendre public.
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
156
content/outils/scm/git/exercices/exercice_08/steps.tex
Normal file
156
content/outils/scm/git/exercices/exercice_08/steps.tex
Normal file
@ -0,0 +1,156 @@
|
||||
\begin{frame}
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
\begin{minipage}{\textwidth}
|
||||
\begin{tikzpicture}
|
||||
%\begin{pgflowlevelscope}{\pgftransformscale{0.5}}
|
||||
\begin{pgflowlevel}{\pgftransformscale{0.6}}
|
||||
\gitDAG[grow right sep=1em]{
|
||||
fcacc8a -- a3a980c -- {6d7f839 -- {fe0c2b7 -- 6212e29 -- 0f13577 -- a60f3ed}}
|
||||
};
|
||||
\gitbranch
|
||||
{master}
|
||||
{above=of 6d7f839}
|
||||
{6d7f839}
|
||||
\gitbranch
|
||||
{histoire/confuse}
|
||||
{above=of a60f3ed}
|
||||
{a60f3ed}
|
||||
%\end{pgflowlevelscope}
|
||||
\end{pgflowlevel}
|
||||
\end{tikzpicture}
|
||||
\end{minipage}
|
||||
|
||||
Le scénario proposé pour le nettoyage s'appuie sur la branche \emph{histoire/confuse}.
|
||||
|
||||
Les \emph{commit} n'y sont pas cohérents : mélange de corrections syntaxiques, orthographiques et grammaticales.
|
||||
Le but est de redonner de la lisibilité à l'historique du dépôt en le réécrivant à l'aide de \commande{git rebase -i} et \commande{git add -i}.
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
\begin{enumerate}[<+->]
|
||||
\item \commande{git checkout histoire/confuse}
|
||||
\item \commande{git show master..} \# aperçu des modifications à réorganiser
|
||||
\item \commande{git rebase -i \$(git merge-base --fork-point master)} \# rebase de tous les commits depuis la divergence avec la branche \emph{master}
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
À l'origine :
|
||||
\begin{minted}[fontsize=\tiny]{console}
|
||||
pick fe0c2b7 Commit un peu rapide.
|
||||
pick 6212e29 Premier commit de correction
|
||||
pick 0f13577 Deuxième commit de correction
|
||||
pick a60f3ed Troisième et dernier (on espère) commit de correction
|
||||
\end{minted}
|
||||
Ce qu'on veut faire :
|
||||
\begin{itemize}
|
||||
\item un \emph{commit} pour les espaces superflues (0f13577 et 6212e29)
|
||||
\item un \emph{commit} pour l'orthographe et la grammaire (0f13577, a60f3ed et 6212e29)
|
||||
\item un \emph{commit} pour le contresens
|
||||
\end{itemize}
|
||||
\end{frame}
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
\begin{enumerate}[<+->]
|
||||
\item s'arrêter sur le \emph{commit} 6212e29 et répartir les modifications sur trois \emph{commit}
|
||||
\item s'arrèter sur le \emph{commit} 0f13577 et répartir les modifications sur deux \emph{commit}
|
||||
\item reformuler le message du \emph{commit} a60f3ed
|
||||
\end{enumerate}
|
||||
\begin{minted}[fontsize=\tiny]{console}
|
||||
pick fe0c2b7 Commit un peu rapide.
|
||||
e 6212e29 Premier commit de correction
|
||||
e 0f13577 Deuxième commit de correction
|
||||
r a60f3ed Troisième et dernier (on espère) commit de correction
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
Pour chaque \emph{commit} édité :
|
||||
\begin{enumerate}[<+->]
|
||||
\item \commande{git reset HEAD\~{}1}
|
||||
\item \commande{git add -i}
|
||||
\item \commande{patch} et sélection du fichier à éditer
|
||||
\item validation, refus ou édition du fragment de patch
|
||||
\item sortie du mode patch
|
||||
\item \commande{git add doc/README} suivi de \commande{git commit}
|
||||
\item si il n'y a plus de modifications, \commande{git rebase --continue}, sinon, retour à l'étape 2
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
\begin{minted}[fontsize=\tiny]{console}
|
||||
f500056 Corrections orthographiques et grammaticales
|
||||
a11256a Suppression des espaces superflues
|
||||
1a03003 Corrections orthographiques et grammaticales
|
||||
f48a802 Corrections orthographiques et grammaticales
|
||||
9ed1adb Suppression des espaces superflues
|
||||
7236369 Correction du contresens
|
||||
fe0c2b7 Commit un peu rapide.
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
Prêt pour la seconde passe.
|
||||
\begin{minted}[fontsize=\tiny]{console}
|
||||
pick fe0c2b7 Commit un peu rapide.
|
||||
pick 7236369 Correction du contresens
|
||||
pick 9ed1adb Suppression des espaces superflues
|
||||
s a11256a Suppression des espaces superflues
|
||||
pick f48a802 Corrections orthographiques et grammaticales
|
||||
s 1a03003 Corrections orthographiques et grammaticales
|
||||
s f500056 Corrections orthographiques et grammaticales
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
\begin{frame}[fragile]
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
Prêt pour la seconde passe.
|
||||
\begin{minted}[fontsize=\tiny]{console}
|
||||
f7caf4b Corrections orthographiques et grammaticales
|
||||
cdcf39e Suppression des espaces superflues
|
||||
7236369 Correction du contresens
|
||||
fe0c2b7 Commit un peu rapide.
|
||||
\end{minted}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
Évidemment, dans la situation décrite, peu de modifications mais imbriquées, un résultat équivalent mais plus rapidement obtenu avec :
|
||||
\begin{enumerate}[<+->]
|
||||
\item \commande{git reset \$(git merge-base --fork-point master)}
|
||||
\item \commande{git add -i}
|
||||
\end{enumerate}
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Nettoyage}
|
||||
\begin{minipage}{\textwidth}
|
||||
\begin{tikzpicture}
|
||||
%\begin{pgflowlevelscope}{\pgftransformscale{0.5}}
|
||||
\begin{pgflowlevel}{\pgftransformscale{0.6}}
|
||||
\gitDAG[grow right sep=1em]{
|
||||
fcacc8a -- a3a980c -- {902ae87}
|
||||
};
|
||||
\gitbranch
|
||||
{brancheindiscrete}
|
||||
{above=of 902ae87}
|
||||
{902ae87}
|
||||
%\end{pgflowlevelscope}
|
||||
\end{pgflowlevel}
|
||||
\end{tikzpicture}
|
||||
\end{minipage}
|
||||
|
||||
Il ne reste plus qu'à purger les \emph{commit} de tous les fichiers embarrassants, ajoutés par inadvertance.
|
||||
\begin{enumerate}[<+->]
|
||||
\item \commande{git checkout branche\_indiscrete}
|
||||
\item \commande{git filter-branch --tree-filter "git rm password" master..}
|
||||
\end{enumerate}
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
8
content/outils/scm/git/exercices/exercice_09.tex
Normal file
8
content/outils/scm/git/exercices/exercice_09.tex
Normal file
@ -0,0 +1,8 @@
|
||||
\begin{frame}
|
||||
\frametitle{Travail collaboratif}
|
||||
\framesubtitle{Partager}
|
||||
Reprendre les exercices en incluant les commandes push, pull et fetch.
|
||||
|
||||
Côté serveur, tester les hooks.
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
4
content/outils/scm/git/exercices/exercice_09/steps.tex
Normal file
4
content/outils/scm/git/exercices/exercice_09/steps.tex
Normal file
@ -0,0 +1,4 @@
|
||||
\begin{frame}
|
||||
\frametitle{}
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
9
content/outils/scm/git/exercices/exercice_10.tex
Normal file
9
content/outils/scm/git/exercices/exercice_10.tex
Normal file
@ -0,0 +1,9 @@
|
||||
\begin{frame}
|
||||
\frametitle{Exercice}
|
||||
\framesubtitle{Intégration dans les processus}
|
||||
|
||||
git est intégré dans divers processus, notamment les processus de packaging.
|
||||
|
||||
Cet exercice donne un aperçu d'une telle intégration dans le cas du packaging debian.
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
35
content/outils/scm/git/exercices/exercice_10/steps.tex
Normal file
35
content/outils/scm/git/exercices/exercice_10/steps.tex
Normal file
@ -0,0 +1,35 @@
|
||||
\begin{frame}
|
||||
\frametitle{Packaging debian}
|
||||
\framesubtitle{buildpackage}
|
||||
buildpackage regroupe les outils simplifiant le packaging debian basé sur des sources maintenues en dépôts git.
|
||||
|
||||
\commande{apt-get install git-buildpackage}
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Packaging debian}
|
||||
\framesubtitle{patchs}
|
||||
gbp-pq est la commande permettant de faire correspondre les commit d'une branche aux patchs d'un paquet.
|
||||
|
||||
Depuis la branche de packaging :
|
||||
\commande{gbp-pq import}
|
||||
|
||||
Après modification du code et organisation en commit :
|
||||
\commande{gbp-pq export}
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Packaging debian}
|
||||
\framesubtitle{changelog}
|
||||
git dch permet d'automatiser l'écriture du changelog en se basant sur les commit.
|
||||
|
||||
\commande{git dch}
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
||||
\begin{frame}
|
||||
\frametitle{Packaging debian}
|
||||
\framesubtitle{description du paquet}
|
||||
Finalement, git buildpackage produit les fichiers nécessaires à la construction du paquet : .dsc, archive des sources, etc.
|
||||
\commande{apt-get install git-buildpackage}
|
||||
% contenu (pas trop long) de la diapositive
|
||||
\end{frame}
|
Reference in New Issue
Block a user