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 ...@@ -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) * [Inversion de modifications](#inversion-de-modifications)
- [Ressources utiles](#ressources-utiles) - [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 ## 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`: 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: 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: 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: 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: ...@@ -35,19 +41,17 @@ hint: 'development'. The just-created branch can be renamed via this command:
hint: hint:
hint: git branch -m <name> hint: git branch -m <name>
Initialized empty Git repository in /Users/sebastienjean/4git/.git/ 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"> La commande a pour effet de créer un dépôt dont le _Working Tree_ et l'historique sont vides.
<img src="uploads/53f8fee980b061a18b9ffa7d03c1d2ea/GitInit.png" width="50%" />
</p>
[//]: ![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 : 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 MacBook-Air-749:4git sebastienjean$ ls -al
total 0 total 0
...@@ -69,7 +73,7 @@ drwxr-xr-x 4 sebastienjean staff 128 Dec 16 10:54 refs ...@@ -69,7 +73,7 @@ drwxr-xr-x 4 sebastienjean staff 128 Dec 16 10:54 refs
MacBook-Air-749:.git sebastienjean$ 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 MacBook-Air-749:.git sebastienjean$ more config
...@@ -86,12 +90,13 @@ MacBook-Air-749:.git sebastienjean$ ...@@ -86,12 +90,13 @@ MacBook-Air-749:.git sebastienjean$
> :bulb: Pour rappel, un _commit_ répond aux questions : > :bulb: Pour rappel, un _commit_ répond aux questions :
> - **quand ?** (*quand la version a été produite*) > - **quand ?** (_quand la version a été produite_)
> - **qui ?** (*par qui la version a été produte*) > - **qui ?** (_par qui la version a été produte_)
> - **pourquoi ?** (*ce qui justifie cette version*) > - **pourquoi ?** (_ce qui justifie cette version_)
> - **comment ?** (*les changements opérés dans 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] [user]
...@@ -105,7 +110,7 @@ Le fichier de configuration locale permet de paramétrer l'**identité de l'aute ...@@ -105,7 +110,7 @@ Le fichier de configuration locale permet de paramétrer l'**identité de l'aute
(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 MacBook-Air-749:4git sebastienjean$ pwd
...@@ -139,29 +144,22 @@ MacBook-Air-749:4git sebastienjean$ ...@@ -139,29 +144,22 @@ MacBook-Air-749:4git sebastienjean$
Ici, plusieurs informations sont données : Ici, plusieurs informations sont données :
- la branche courante est `master` - la **branche courante** est `master`
- cette branche ne comporte pas encore de versions (commits) - 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_) - 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 - **aucun changement n'est actuellement intégré** à la future prochaine version
Cette situation est illustrée ci-dessous : Cette situation est illustrée ci-dessous :
<p align="center"> ![01-newFile](uploads/ed1a9b435c0f221d90e59dc3a7a6f449/01-newFile.png)
<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).
: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 ### Préparation d'une nouvelle version
La sélection des changements à intégrer à la future nouvelle version est explicite et s'effectue 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) :
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 MacBook-Air-749:4git sebastienjean$ git add unFichier.txt
...@@ -179,18 +177,13 @@ MacBook-Air-749:4git sebastienjean$ ...@@ -179,18 +177,13 @@ MacBook-Air-749:4git sebastienjean$
La situation résultante est illustrée ci-dessous : La situation résultante est illustrée ci-dessous :
<p align="center"> ![](uploads/44667c5cc8bb44c3f280837d77724d78/GitRepoStatusAdd.png)
<img src="uploads/44667c5cc8bb44c3f280837d77724d78/GitRepoStatusAdd.png" width="66%" />
</p>
[//]: ![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. 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 ### Création d'une nouvelle version
...@@ -204,19 +197,13 @@ MacBook-Air-749:4git sebastienjean$ git commit -m "ajout d'un fichier" ...@@ -204,19 +197,13 @@ MacBook-Air-749:4git sebastienjean$ git commit -m "ajout d'un fichier"
MacBook-Air-749:4git sebastienjean$ 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 : La situation résultante est illustrée ci-dessous :
<p align="center"> ![](uploads/272be2885d15067d852e39691ede15ac/GitRepoStatusCommit.png)
<img src="uploads/272be2885d15067d852e39691ede15ac/GitRepoStatusCommit.png" width="66%" />
</p>
[//]: ![GitRepoStatusCommit](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 : 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 :
...@@ -282,7 +269,7 @@ no changes added to commit (use "git add" and/or "git commit -a") ...@@ -282,7 +269,7 @@ no changes added to commit (use "git add" and/or "git commit -a")
MacBook-Air-749:4git sebastienjean$ 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_) : 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_) :
...@@ -311,7 +298,7 @@ MacBook-Air-749:4git sebastienjean$ git commit -a -m "modification du fichier" ...@@ -311,7 +298,7 @@ MacBook-Air-749:4git sebastienjean$ git commit -a -m "modification du fichier"
MacBook-Air-749:4git sebastienjean$ 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 : Il y a donc maintenant 2 versions :
...@@ -333,6 +320,7 @@ MacBook-Air-749:4git sebastienjean$ ...@@ -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 : Il est alors possible, avec `git diff`, de comparer le contenu du fichier à différentes versions :
- _Working Tree_ Vs `HEAD` : - _Working Tree_ Vs `HEAD` :
```diff ```diff
MacBook-Air-749:4git sebastienjean$ git diff unFichier.txt MacBook-Air-749:4git sebastienjean$ git diff unFichier.txt
diff --git a/unFichier.txt b/unFichier.txt diff --git a/unFichier.txt b/unFichier.txt
...@@ -344,7 +332,9 @@ index ee051bd..53c5f7f 100644 ...@@ -344,7 +332,9 @@ index ee051bd..53c5f7f 100644
+Encore une autre ligne de texte +Encore une autre ligne de texte
MacBook-Air-749:4git sebastienjean$ MacBook-Air-749:4git sebastienjean$
``` ```
- `HEAD` Vs `HEAD~1` (la version parente de `HEAD`) :
- `HEAD` Vs `HEAD\\\\\\\\\\\\\\\~1` (la version parente de `HEAD`) :
```diff ```diff
MacBook-Air-749:4git sebastienjean$ git diff HEAD~1 HEAD unFichier.txt MacBook-Air-749:4git sebastienjean$ git diff HEAD~1 HEAD unFichier.txt
diff --git a/unFichier.txt b/unFichier.txt diff --git a/unFichier.txt b/unFichier.txt
...@@ -356,7 +346,8 @@ index 927b61b..ee051bd 100644 ...@@ -356,7 +346,8 @@ index 927b61b..ee051bd 100644
+Une autre ligne de texte +Une autre ligne de texte
``` ```
- _Working Tree_ Vs `HEAD~1` : - _Working Tree_ Vs `HEAD\\\\\\\\\\\\\\\~1` :
```diff ```diff
MacBook-Air-749:4git sebastienjean$ git diff HEAD~1 unFichier.txt MacBook-Air-749:4git sebastienjean$ git diff HEAD~1 unFichier.txt
diff --git a/unFichier.txt b/unFichier.txt diff --git a/unFichier.txt b/unFichier.txt
...@@ -368,7 +359,7 @@ index 927b61b..53c5f7f 100644 ...@@ -368,7 +359,7 @@ index 927b61b..53c5f7f 100644
+Encore une autre ligne de texte +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 ### Restauration de versions
...@@ -466,5 +457,3 @@ MacBook-Air-749:4git sebastienjean$ ...@@ -466,5 +457,3 @@ MacBook-Air-749:4git sebastienjean$
- [Aide en ligne](https://git-scm.com/docs) de l'outil _git_ - [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