Update Gestion de versions locale avec git, les bases authored by Sebastien Jean's avatar Sebastien Jean
......@@ -13,17 +13,23 @@ L'objectif de ce qui suit est de prendre en main l'outil de gestion de versions
* [Inversion de modifications](#inversion-de-modifications)
- [Ressources utiles](#ressources-utiles)
<small><i><a href='http://ecotrust-canada.github.io/markdown-toc/'>Table of contents generated with markdown-toc</a></i></small>
[<small>_Table of contents generated with markdown-toc_</small>](http://ecotrust-canada.github.io/markdown-toc/)
__N.B.__ : _les manipulations suivantes sont effectuées depuis un terminal Linux-compatible, les commandes ont des équivalents sous Windows._
> _Les manipulations suivantes sont effectuées depuis un terminal Linux-compatible, les commandes ont des équivalents sous Windows._
## Création d'un dépôt local
_On suppose que l'on se trouve dans un répertoire local `4git` (vide) où l'on souhaite commencer à développer_.
> _Dans la suite, on suppose que l'on se trouve dans un répertoire local `4git` (vide) où l'on souhaite commencer à développer_. Il est donc nécessaire de créer ce répertoire au besoin et de s'y déplacer.
```
sebastienjean@MacBook-Air-749 ~ % mkdir 4git
sebastienjean@MacBook-Air-749 ~ % cd 4git
```
La création du dépôt local s'effectue via la commande `git init`:
```
MacBook-Air-749:4git sebastienjean$ git init
sebastienjean@MacBook-Air-749 4git % git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
......@@ -35,19 +41,17 @@ hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /Users/sebastienjean/4git/.git/
MacBook-Air-749:4git sebastienjean$
sebastienjean@MacBook-Air-749 4git %
```
La commande a pour effet de créer un dépôt dont le _Working Tree_ et l'historique sont vides.
<p align="center">
<img src="uploads/53f8fee980b061a18b9ffa7d03c1d2ea/GitInit.png" width="50%" />
</p>
La commande a pour effet de créer un dépôt dont le _Working Tree_ et l'historique sont vides.
[//]: ![GitInit](uploads/53f8fee980b061a18b9ffa7d03c1d2ea/GitInit.png)
![00-git-init](uploads/767b835ee0e669c7e64199e4fb57fdb0/00-git-init.png)
> :bulb: Le *Working Tree* est l'arborescence des fichiers versionnés, démarrant à la racine du dépôt, dans la version considérée comme courante. L'historique est la succession de commits (graphe) marquant l'évolution du contenu du *Working Tree* au fil du développement.
> :bulb: Le _Working Tree_ est l'arborescence des fichiers versionnés, démarrant à la racine du dépôt, dans la version considérée comme courante. L'historique est la succession de commits (graphe) marquant l'évolution du contenu du _Working Tree_ au fil du développement.
L'existence du dépôt créé se matérialise par la création d'un sous- répértoire caché nommé `.git`, que l'on peut observer soit avec un explorateur de fichiers graphique (en prenant soin d'activer l'affichage des éléments cachés), soit en ligne de commande :
```
MacBook-Air-749:4git sebastienjean$ ls -al
total 0
......@@ -69,7 +73,7 @@ drwxr-xr-x 4 sebastienjean staff 128 Dec 16 10:54 refs
MacBook-Air-749:.git sebastienjean$
```
Ce répertoire contient des *méta-données* représentant l'historique, que l'outil _git_ tient à jour au fil des commandes. Les fichiers ne sont pas faits pour être modifiés à la main, à l'exception du fichier `config` qui contient des informations personnalisables de configuration locale du dépôt (voir plus généralement [`git config`](https://git-scm.com/docs/git-config) pour cela) :
Ce répertoire contient des _méta-données_ représentant l'historique, que l'outil _git_ tient à jour au fil des commandes. Les fichiers ne sont pas faits pour être modifiés à la main, à l'exception du fichier `config` qui contient des informations personnalisables de **configuration locale** du dépôt (voir plus généralement [`git config`](https://git-scm.com/docs/git-config) pour cela) :
```
MacBook-Air-749:.git sebastienjean$ more config
......@@ -86,12 +90,13 @@ MacBook-Air-749:.git sebastienjean$
> :bulb: Pour rappel, un _commit_ répond aux questions :
> - **quand ?** (*quand la version a été produite*)
> - **qui ?** (*par qui la version a été produte*)
> - **pourquoi ?** (*ce qui justifie cette version*)
> - **comment ?** (*les changements opérés dans cette version*)
> - **quand ?** (_quand la version a été produite_)
> - **qui ?** (_par qui la version a été produte_)
> - **pourquoi ?** (_ce qui justifie cette version_)
> - **comment ?** (_les changements opérés dans cette version_)
> - **où ?** (à quel commit, précédente version, ce commit est raccroché
Le fichier de configuration locale permet de paramétrer l'**identité de l'auteur** des commits, de sorte que l'outil _git_ les utilise automatiquement. Ceci se fait en ajoutant la section `[user]` à la suite de la section `[core]` déjà présente :
Le fichier de configuration locale permet de paramétrer l'**identité de l'auteur** des commits, de sorte que l'outil _git_ les utilise automatiquement. Ceci se fait en ajoutant la section `\\\[user\\\]` à la suite de la section `\\\[core\\\]` déjà présente :
```
[user]
......@@ -103,9 +108,9 @@ Le fichier de configuration locale permet de paramétrer l'**identité de l'aute
### Création d'un nouveau fichier
(en se plaçant dans le répertoire de base du dépôt, `4git`)
(en se plaçant dans le répertoire de base du dépôt, `4git`)
__N.B.__ : ici la création/édition du fichier s'effectue via la commande `cat` (`Ctrl-D` pour terminer), la commande `pwd` permet de savoir dans quel répertoire l'on se trouve, la commande `more` permet d'afficher le contenu du fichier.
> Ici la création/édition du fichier s'effectue via la commande `cat` (`Ctrl-D` pour terminer), la commande `pwd` permet de savoir dans quel répertoire l'on se trouve, la commande `more` permet d'afficher le contenu du fichier.
```
MacBook-Air-749:4git sebastienjean$ pwd
......@@ -139,29 +144,22 @@ MacBook-Air-749:4git sebastienjean$
Ici, plusieurs informations sont données :
- la branche courante est `master`
- cette branche ne comporte pas encore de versions (commits)
- git observe dans le _Working Tree_ l'existence d'un fichier qu'il n'a jamais vu (_untracked_)
- aucun changement n'est actuellement intégré à la future prochaine version
- la **branche courante** est `master`
- cette branche ne comporte **pas encore de versions** (commits)
- git observe dans le _Working Tree_ l'existence d'un **fichier qu'il n'a jamais vu** (_untracked_)
- **aucun changement n'est actuellement intégré** à la future prochaine version
Cette situation est illustrée ci-dessous :
<p align="center">
<img src="uploads/b6e72399f6acb9f6f216c09982c05797/GitRepoStatus.png" width="60%" />
</p>
[//]: ![GitRepoStatus](uploads/b6e72399f6acb9f6f216c09982c05797/GitRepoStatus.png)
Les changements observés sont consignés par _git_ dans une zone nommée `unstaged` (qu'il s'agisse de la création d'un nouveau fichier ou de la suppression ou modification d'un fichier existant).
![01-newFile](uploads/ed1a9b435c0f221d90e59dc3a7a6f449/01-newFile.png)
:warning: Ces changements observés n'entrainent pas automatiquement la création d'une nouvelle version.
:warning: Ces changements observés n'entrainent pas automatiquement la création d'une nouvelle version.
### Préparation d'une nouvelle version
La sélection des changements à intégrer à la future nouvelle version est explicite et s'effectue
s'effectue via la commande [`git add`](https://git-scm.com/docs/git-add) :
La sélection des changements à intégrer à la future nouvelle version est explicite et s'effectue s'effectue via la commande [`git add`](https://git-scm.com/docs/git-add) :
__N.B__. : On peut utiliser des _jokers_ pour ajouter simultanément plusieurs fichiers, un répertoire, ...
**N.B**. : On peut utiliser des _jokers_ pour ajouter simultanément plusieurs fichiers, un répertoire, ...
```
MacBook-Air-749:4git sebastienjean$ git add unFichier.txt
......@@ -179,18 +177,13 @@ MacBook-Air-749:4git sebastienjean$
La situation résultante est illustrée ci-dessous :
<p align="center">
<img src="uploads/44667c5cc8bb44c3f280837d77724d78/GitRepoStatusAdd.png" width="66%" />
</p>
![](uploads/44667c5cc8bb44c3f280837d77724d78/GitRepoStatusAdd.png)
[//]: ![GitRepoStatusAdd](uploads/44667c5cc8bb44c3f280837d77724d78/GitRepoStatusAdd.png)
Les changements pris en compte sont déplacés par _git_ dans une zone nommée `staged`.
:warning: Cette prise en compte n'entraine pas automatiquement la création d'une nouvelle version.
Les changements pris en compte sont déplacés par _git_ dans une zone nommée `staged`. :warning: Cette prise en compte n'entraine pas automatiquement la création d'une nouvelle version.
La validation de la nouvelle version proprement dite est également une opération explicite.
__N.B__. : On peut annuler la prise en compte des changements pour un fichier via la commande `git rm --cached` (de fait, le changement est rebasculé dans la zone `unstaged`).
**N.B**. : On peut annuler la prise en compte des changements pour un fichier via la commande `git rm --cached` (de fait, le changement est rebasculé dans la zone `unstaged`).
### Création d'une nouvelle version
......@@ -204,19 +197,13 @@ MacBook-Air-749:4git sebastienjean$ git commit -m "ajout d'un fichier"
MacBook-Air-749:4git sebastienjean$
```
L'option `-m` permet ici de spécifier le message de commit. Celui-ci répond à la question _Pourquoi ?_ de la nouvelle version (les changements pris en compte répondent à la question _Comment ?_, la date d'exécution de la commande répond à la question _Quand ?_, les propriétés de la section `[user]` du fichier de configuration répondent quant à eux à la question _Qui ?_).
L'option `-m` permet ici de spécifier le message de commit. Celui-ci répond à la question _Pourquoi ?_ de la nouvelle version (les changements pris en compte répondent à la question _Comment ?_, la date d'exécution de la commande répond à la question _Quand ?_, les propriétés de la section `\\\\\\\\\\\\\\\[user\\\\\\\\\\\\\\\]` du fichier de configuration répondent quant à eux à la question _Qui ?_).
Le message de commit est constitué d'un **résumé** qui doit tenir **sur une ligne** et une **description détaillée optionnelle**, de longueur variable et séparée du résumé par une **ligne vide**.
L'option `-m` permet d'indiquer rapidement et facilement un message sans description détaillée. De façon plus générale, sans l'option `-m`, l'exécution de la commande est déroutée vers un éditeur de texte qui permet de rédiger un message adapté à la situation.
Le message de commit est constitué d'un **résumé** qui doit tenir **sur une ligne** et une **description détaillée optionnelle**, de longueur variable et séparée du résumé par une **ligne vide**. L'option `-m` permet d'indiquer rapidement et facilement un message sans description détaillée. De façon plus générale, sans l'option `-m`, l'exécution de la commande est déroutée vers un éditeur de texte qui permet de rédiger un message adapté à la situation.
La situation résultante est illustrée ci-dessous :
<p align="center">
<img src="uploads/272be2885d15067d852e39691ede15ac/GitRepoStatusCommit.png" width="66%" />
</p>
[//]: ![GitRepoStatusCommit](uploads/272be2885d15067d852e39691ede15ac/GitRepoStatusCommit.png)
![](uploads/272be2885d15067d852e39691ede15ac/GitRepoStatusCommit.png)
Les changements pris en compte (consignés en zone `staged`) forment une nouvelle version notée ici `0`. A l'historique sont associés 2 pointeurs :
......@@ -260,7 +247,7 @@ MacBook-Air-749:4git sebastienjean$
### Comparaison de versions
On considère que l'on édite le contenu du fichier précédent en modifiant le texte sur la première ligne pour produire le résultat suivant :
On considère que l'on édite le contenu du fichier précédent en modifiant le texte sur la première ligne pour produire le résultat suivant :
```
MacBook-Air-749:4git sebastienjean$ more unFichier.txt
......@@ -282,7 +269,7 @@ no changes added to commit (use "git add" and/or "git commit -a")
MacBook-Air-749:4git sebastienjean$
```
__N.B.__ : ici, le fichier est déjà connu.
**N.B.** : ici, le fichier est déjà connu.
La commande [`git diff`](https://git-scm.com/docs/git-diff), sans paramètre, permet de comparer le _Working Tree_ et la version `HEAD` (et ainsi voir tout ce qui est déclaré _unstaged_) :
......@@ -298,7 +285,7 @@ index 927b61b..ee051bd 100644
MacBook-Air-749:4git sebastienjean$
```
Pour chaque changement sur un fichier, une description des changements à la syntaxe [_diff_](https://en.wikipedia.org/wiki/Diff#Unified_format) est produite. Elle fusionne les 2 versions du fichier et annote les endroits où se produisent les changements.
Pour chaque changement sur un fichier, une description des changements à la syntaxe [_diff_](https://en.wikipedia.org/wiki/Diff#Unified_format) est produite. Elle fusionne les 2 versions du fichier et annote les endroits où se produisent les changements.
> :bulb: L'outil _diff_ ne travaille qu'au niveau d'un ligne (pas au niveau de son contenu), ainsi une modification sur une ligne à l'endroit désigné du fichier est vue comme la suppression (`-`) de la ligne et l'ajout (`+`) d'une autre ligne.
......@@ -311,7 +298,7 @@ MacBook-Air-749:4git sebastienjean$ git commit -a -m "modification du fichier"
MacBook-Air-749:4git sebastienjean$
```
__N.B.__ : ici, le fichier est déjà connu. L'option `-a` permet d'éviter l'appel à `git add` et inclus à la nouvelle version l'intégralité du contenu de la zone _unstaged_.
**N.B.** : ici, le fichier est déjà connu. L'option `-a` permet d'éviter l'appel à `git add` et inclus à la nouvelle version l'intégralité du contenu de la zone _unstaged_.
Il y a donc maintenant 2 versions :
......@@ -322,7 +309,7 @@ e08fe66 modification du fichier
MacBook-Air-749:4git sebastienjean$
```
On considère que l'on édite de nouveau le contenu du fichier précédent en modifiant le texte sur la première ligne pour produire le résultat suivant :
On considère que l'on édite de nouveau le contenu du fichier précédent en modifiant le texte sur la première ligne pour produire le résultat suivant :
```
MacBook-Air-749:4git sebastienjean$ more unFichier.txt
......@@ -333,6 +320,7 @@ MacBook-Air-749:4git sebastienjean$
Il est alors possible, avec `git diff`, de comparer le contenu du fichier à différentes versions :
- _Working Tree_ Vs `HEAD` :
```diff
MacBook-Air-749:4git sebastienjean$ git diff unFichier.txt
diff --git a/unFichier.txt b/unFichier.txt
......@@ -344,7 +332,9 @@ index ee051bd..53c5f7f 100644
+Encore une autre ligne de texte
MacBook-Air-749:4git sebastienjean$
```
- `HEAD` Vs `HEAD~1` (la version parente de `HEAD`) :
- `HEAD` Vs `HEAD\\\\\\\\\\\\\\\~1` (la version parente de `HEAD`) :
```diff
MacBook-Air-749:4git sebastienjean$ git diff HEAD~1 HEAD unFichier.txt
diff --git a/unFichier.txt b/unFichier.txt
......@@ -356,7 +346,8 @@ index 927b61b..ee051bd 100644
+Une autre ligne de texte
```
- _Working Tree_ Vs `HEAD~1` :
- _Working Tree_ Vs `HEAD\\\\\\\\\\\\\\\~1` :
```diff
MacBook-Air-749:4git sebastienjean$ git diff HEAD~1 unFichier.txt
diff --git a/unFichier.txt b/unFichier.txt
......@@ -368,7 +359,7 @@ index 927b61b..53c5f7f 100644
+Encore une autre ligne de texte
```
__N.B.__ : On peut aussi utiliser en paramètre les _hash_ des commits (abbréviés ou non) mais il est parfois plus simple de se répérer par rapport à `HEAD` (`~1` pour le commit parent, `~2` pour le commit grand-parent, ...) ou même par rapport à `Master` (de la même manière).
**N.B.** : On peut aussi utiliser en paramètre les _hash_ des commits (abbréviés ou non) mais il est parfois plus simple de se répérer par rapport à `HEAD` (`\\\\\\\\\\\\\\\~1` pour le commit parent, `\\\\\\\\\\\\\\\~2` pour le commit grand-parent, ...) ou même par rapport à `Master` (de la même manière).
### Restauration de versions
......@@ -422,7 +413,7 @@ MacBook-Air-749:4git sebastienjean$
```
On décide de les défaire (l'exécution est déroutée vers un éditeur de texte pour rédiger le message de commit) :
```
MacBook-Air-749:4git sebastienjean$ git revert HEAD
[master 268a278] Revert "restauration de la première version"
......@@ -465,6 +456,4 @@ MacBook-Air-749:4git sebastienjean$
## Ressources utiles :
- [Aide en ligne](https://git-scm.com/docs) de l'outil _git_
- [Aide mémoire](https://www.atlassian.com/git/tutorials/atlassian-git-cheatsheet) des commandes usuelles
- [Aide mémoire](https://www.atlassian.com/git/tutorials/atlassian-git-cheatsheet) des commandes usuelles
\ No newline at end of file