# TP2 - Les branches et les dépôts distants

## Objectifs du TP

### Ce que vous allez faire

- Faire évoluer votre projet "Générateur de mots de passe"

### Ce que vous allez apprendre

- Manipuler les branches
- Travailler avec un dépôt distant

## Étapes

### 1 – Installation

**Objectif :** Installer git

```admonish travail
1. Aller sur le site officiel de git et télécharger l’installateur : [Download for Windows](https://git-scm.com/downloads/win)
1. Lancer l’installateur pour installer git
1. Choisir VSCode comme éditeur par défaut
1. Choisir l'option pour nommer les branches principales `main`
1. Choisir l’option `Only-ever fast-forward` comme comportement par défaut pour le `git pull`
1. Garder les options par défaut pour le reste
```

```admonish note title="Dans le compte rendu"
1. Résumer en 2 ou 3 phrases ce que fait git, grâce à la [documentation](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control). 
1. Expliquer ce qu’est un système de gestion des versions.
```

### 2 – Créer un nouveau dépôt

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

```admonish travail
1. Créer un dossier vide dans votre espace personnel
1. Ouvrir ce dossier avec VSCode
1. Ouvrir le terminal dans VSCode et taper la commande `git init`
1. Ouvrir le dossier dans l’explorateur Windows et afficher les fichiers cachés pour voir le dossier caché créé par git (ou utiliser la commande `dir -force` dans le terminal)
```

```admonish note title="Dans le compte rendu"
1. Expliquer ce que fait la commande `git init`, grâce à la [documentation](https://git-scm.com/docs/git-init)
1. Indiquer le nom du dossier caché créé par git
1. Expliquer ce qu’est un dépôt git
```

### 3 – Faire un premier commit

**Objectif :** Créer un commit

```admonish travail
1. Configurer git avec votre email et votre nom pour signer le travail :
    - Taper `git config --global user.email "votre email"`
    - Taper `git config --global user.name "Votre nom"`
1. Copier le fichier `main.py` fourni dans votre dossier de travail
1. Taper `git status` pour voir que git a détecté le nouveau fichier comme non suivi ("Untracked file")
1. Utiliser `git add` pour demander à git de suivre ce fichier. Vérifier le résultat avec `git status` (le fichier doit apparaître en vert)
1. Taper `git commit` pour enregistrer vos changements
    - Écrire un commentaire court sur la première ligne (exemple : `Ajoute le programme principal`)
    - Enregistrer et fermer l’éditeur quand c’est terminé
```

```admonish note title="Dans le compte rendu"
1. Expliquer ce que font les commandes suivantes en quelques lignes, grâce à la [documentation](https://git-scm.com/docs) :
    - `git add`
    - `git status`
    - `git commit`
1. Expliquer ce que représente un "commit"
```

### 4 – Ajouter des modifications

**Objectif :** Enregistrer une modification avec git

```admonish travail
1. Taper la commande `git log` pour voir l’historique
1. Copier le code du bloc `À copier` en dessous et l'ajouter dans la fonction `afficher_menu` de `main.py`
1. Enregistrer, puis taper `git status` pour voir le changement
1. Taper `git diff` pour observer la différence
1. Utiliser la commande `git add -u` après avoir lu la [documentation](https://git-scm.com/docs/git-add#Documentation/git-add.txt--u) sur l’option -u
1. Vérifier le résultat avec les commandes `git status`, `git diff`, `git log`
1. Faire un commit avec `git commit`, écrire un message pour reconnaître ce nouveau commit, puis re-vérifier l’état avec les commandes déjà utilisées
```

```admonish abstract title="À copier"
~~~python
print("Quel type de mot de passe souhaitez-vous créer ?")
print("1 - Mot de passe avec configuration par défaut")
print("2 - Mot de passe avec configuration personnalisée")
print("3 - Phrase de passe avec configuration par défaut")
print("4 - Phrase de passe avec configuration personnalisée")
print("0 - Quitter\n")
~~~
```

```admonish note title="Dans le compte rendu"
1. Quel message de commit avez-vous mis ?
1. Quand vous tapez `git log`, quelles informations s’affichent ? Dans quel ordre ?
1. Expliquer ce que fait la commande `git diff`
1. Lister les étapes pour enregistrer une modification dans git. Expliquer pourquoi ces étapes sont séparées
```

### 5 – Manipuler l’historique

**Objectif :** Annuler ou restaurer des modifications

```admonish travail
1. Taper la commande `git diff HEAD^1` pour comparer les changements
1. Modifier votre fichier `main.py`, enregistrer, taper `git status` et tenter d’annuler la modification (indice: la commande à taper est donnée par `git status`)
1. Regarder la sortie de la commande `git log`
1. Taper `git reset HEAD^1` puis vérifier avec les commandes `git diff`, `git status`, `git log`
1. Faire un commit pour enregistrer la modification
```

```admonish note title="Dans le compte rendu"
1. Expliquer l’utilité de la commande `git restore`
1. Expliquer ce que font `git diff HEAD^1` et `git reset HEAD^1`. Préciser la signification de `HEAD^1`
```

### 6 – Etiqueter un commit

**Objectif :** Ajouter une étiquette ("tag")

```admonish travail
- Trouver le hash (identifiant) d’un ancien commit avec `git log`
- Créer une étiquette `my_tag` sur ce commit (vous aider de la [documentation](https://git-scm.com/docs/git-tag))
- Vérifier que l’étiquette apparaît dans l’historique avec `git log`
- Taper la commande `git switch --detach my_tag` puis vérifier la position avec le log
- Revenir à l’état précédent avec `git switch -`
```

```admonish note title="Dans le compte rendu"
- Expliquer ce que fait la commande `git switch` et son utilité
- Expliquer ce qu’est un "tag" git et à quoi cela sert (vous aider de la [documentation](https://git-scm.com/book/en/v2/Git-Basics-Tagging))
```

## Ressources supplémentaires

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

