# TP - Découverte de Git 

## Objectifs du TP

### Objectif pédagogique

L'objectif de cette activité est de découvrir le logiciel de gestion de versions git pour tenter de comprendre son rôle et ses possibilités. 

- **Installer :** installer le logiciel sur vos machines
- **Dépôt :** créer un nouveau dépôt
- **Commit :** créer un ou plusieurs commits
- **Historique :** visualiser et manipuler l'historique

### Objectif technique

- Initialiser un projet de développement versionné

## Étapes

### 1 - Installation

**Objectif :** Installer git

```admonish travail
- Se rendre sur le site officiel de git et récupérer l'installateur : [Download for Windows](https://git-scm.com/downloads/win)
- Le lancer pour installer git
    - Choisir VSCode comme éditeur par défaut
    - Choisir de nommer vos branches par défaut `main` au lieu de laisser git décider
    - Choisissez l'option `Only-ever fast-forward` comme comportement par défaut pour le `git pull`
    - Utiliser les options par défaut pour le reste
```

```admonish note title="Dans le compte rendu"
1. Grâce à la [documentation](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control) et vos recherches, essayer de résumer (en 2-3 lignes maximum) ce que fait git. Dites ce que vous comprenez de la notion de Version Control System.
```

### 2 - Création d'un nouveau dépôt

**Objectif :** Créer un nouveau dépôt

```admonish travail
1. Créer un nouveau répertoire vide dans votre espace personnel
2. L'ouvrir avec VSCode
3. Dans VSCode ouvrir un terminal et taper la commande `git init`
4. Ouvrir votre répertoire dans l'explorateur Windows et afficher les éléments masqués pour voir le répertoire caché qui s'y trouve (ou dans le terminal tapez `dir -force`)
```

```admonish note title="Dans le compte rendu"
1. Grâce à la [documentation](https://git-scm.com/docs/git-init), dites en quelques mots ce que fait la commande `git init`
1. Quel est le nom du répertoire caché que git crée ?
1. Qu'est-ce qu'un dépôt git ?
```

### 3 - Un premier commit

**Objectif :** Créer un premier commit

```admonish travail
1. Commencer par donner quelques informations à git pour signer le travail. 
    - tapez `git config --global user.email "you@example.com` (en adaptant)
    - tapez `git config --global user.name "Your name"` (en adaptant)
1. Créer ensuite un fichier `README.md`, et dans ce fichier taper une rapide description (de votre choix)
1. Taper maintenant `git status` et constatez que git a détecté votre fichier, qui est marqué comme `Untracked file`
1. À l'aide de la documentation de `git add`, demander à git de tracer votre fichier. Lorsque vous aurez réussi, la commande `git status` vous affichera le nom du fichier en vert précédé de `new file:`.
1. Tapez ensuite `git commit`. VSCode devrait ouvrir un onglet `COMMIT_EDITMSG`. Tapez un commentaire **sur la première ligne** pour décrire votre commit (par exemple `Commit initial avec README`). Sauvegardez le fichier et fermez l'onglet. La commande devrait se terminer avec succès dans le terminal.
```

```admonish note title="Dans le compte rendu"
1. A l'aide de la [documentation](https://git-scm.com/docs), dites en quelques lignes ce que font les commandes suivantes
    - `git add`
    - `git status`
    - `git commit`
1. Essayez de décrire ce qu'est un "commit"
```

### 4 - Ajouter des modifications

**Objectif :** Se repérer dans les étapes de validation d'une modification

```admonish travail
1. Taper la commande `git log`. Vous devriez y voir votre commit. Prêter attention aux différentes informations qui s'affichent.
2. Faites une modification quelconque dans votre fichier `README.md`, sauvegardez-la, puis tapez `git status` dans le terminal. Constatez que git a pris en compte la modification du fichier (mais ne l'a pas enregistrée).
3. Tapez `git diff` et observez la sortie de la commande.
4. Utilisez la commande `git add -u` après avoir vérifié ce que fait l'option -u dans la [documentation](https://git-scm.com/docs/git-add#Documentation/git-add.txt--u). 
5. Vérifiez de nouveau ce que vous renvoient `git status`, `git diff` et `git log`.
6. Effectuez un commit à l'aide de `git commit`. Choisissez un message vous permettant de distinguer votre nouveau commit du précédent. Puis réeffectuez les commandes `git status`, `git diff` et `git log`.
```

```admonish note title="Dans le compte rendu"
1. Observer la sortie de la commande `git log`. Quelles informations sont affichées ? Dans quel ordre semblent être affichés les commit ?
1. Que semble faire la commande `git diff` ?
1. Quelles sont les étapes nécessaires pour enregistrer une modification sur un fichier dans git ? Quel est l'intérêt de ce découpage selon vous ?
```

### 5 - Manipuler l'historique

**Objectif :** Manipuler l'historique de votre dépôt pour annuler des modifications

```admonish travail
1. Tapez la commande `git diff HEAD^1`
1. Effectuez une nouvelle modification dans votre fichier `README.md` et sauvegardez. Tapez `git status` et lisez bien le résultat de la commande. Essayez, au regard de votre lecture, d'annuler vos modifications.
1. Observez le résultat de la commande `git log`, puis lancez `git reset HEAD^1`. Effectuez ensuite les vérifications habituelles : `git diff`, `git status` et `git log`.
1. Effectuez un commit pour réenregistrer les modifications. 
```

```admonish note title="Dans le compte rendu"
1. Quel est l'intérêt de la commande `git restore` ?
1. Que semble faire la commande `git diff HEAD^1` ? et `git reset HEAD^1` ? Concluez sur la signification de `HEAD^1`
```

### 6 - Etiqueter un commit

**Objectif :** Comprendre la notion d'étiquette (ou tag)

```admonish travail
1. A l'aide de `git log`, relever le hash (identifiant) d'un ancien commit (autre que votre dernier commit)
1. Créer une étiquette `my_tag` sur ce commit en vous aidant de la [documentation de `git tag`](https://git-scm.com/docs/git-tag). Pour identifier un commit vous pouvez utiliser le hash relevé précédemment.
1. Repérez le tag dans l'historique avec `git log`.
1. Tapez la commande `git switch --detach my_tag`. Réaffichez le log.
1. Revenez en arrière à l'aide de `git switch -`
```

```admonish note title="Dans le compte rendu"
1. Que semble faire la commande `git switch` ? Quel est l'intérêt ?
1. Qu'est-ce qu'un tag git selon vous ? A quoi cela peut servir ? Aidez vous de la [documentation](https://git-scm.com/book/en/v2/Git-Basics-Tagging) et/ou de vos recherches
```

## Ressources supplémentaires

- [Git book](https://git-scm.com/book/en/v2)
- [Git doc](https://git-scm.com/doc)
- [Git videos](https://git-scm.com/videos)


