@@ -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><ahref='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-7494git % 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-7494git %
```
La commande a pour effet de créer un dépôt dont le _Working Tree_ et l'historique sont vides.
> :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 :
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) :
> :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.
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
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, ...
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`).
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 :
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
__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).