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