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

## Objectifs du TP

### Ce que vous allez faire

- Vous allez cloner une version complète du projet générateur de mots de passe pour y ajouter une fonctionnalité

### Ce que vous allez apprendre

- Manipuler les branches
- Travailler avec un dépôt distant
- Faire une Merge Request
- Gérer des conflits de fusion

## Étapes

### 0 – Préparation

**Objectif :** Créer un compte Gitlab

```admonish travail
1. Rendez-vous sur [Gitlab](https://gitlab.com) et créez un nouveau compte (ou connectez-vous si vous en avez un).
1. Donnez votre nom d'utilisateur et/ou mail à votre professeur pour qu'il vous ajoute au projet
1. Une fois ajouté, rendez-vous sur : [pwd-generator](https://gitlab.com/afourmaux-edu-ufa-b2/pwd-generator)
1. Trouvez l'URL pour cloner avec HTTPS
1. Ouvrez un nouveau répertoire dans Visual Studio Code, puis un terminal
1. Tapez la commande `git clone <url> .` en remplaçant l'url par celle trouvée plus haut. Git devrait vous demander vos identifiants.
```

```admonish note title="Dans le compte rendu"
- Rien à écrire
```

### 1 – Manipulation de branches

**Objectif :** Créer une branche de fonctionnalité

```admonish travail
1. Aidez-vous de la [documentation](https://git-scm.com/docs/git-branch) pour
    - Lister ***toutes*** les branches existantes
    - Créer une branche nommée `votre_prenom_tp_branches`
    - Basculer sur la branche `votre_prenom_tp_branches`
2. Ajoutez un nouveau fichier à votre nom dans le dépôt.
3. Faites un commit (n'oubliez pas d'ajouter votre modification) pour valider votre changement
4. Tentez de faire `git push`. À l'aide du résultat de la commande, corrigez votre commande pour pousser votre branche sur le dépôt distant.
```

```admonish note title="Dans le compte rendu"
1. Quelles branches existent ?
1. Expliquez les commandes utilisées
1. Que sont les branches dont le nom commence par `remotes/origin` ?
1. Quelle est la différence entre `remotes/origin/develop` et `develop` ?
```

### 2 – Merge request

**Objectif :** Créer une merge request

```admonish travail
1. Allez sur la page web du projet et trouvez la liste des branches. Vérifiez que votre branche y soit.
1. Trouvez le menu des requêtes de fusion, et créez une requête de fusion pour merger votre branche (source) dans `develop` (cible)
1. Dans le menu de création, assignez-vous la requête, et assignez la relecture à un.e de vos camarades. Attendez son commentaire et son approbation (lire la suite).
1. Lorsque que quelqu'un vous aura assigné une relecture, allez voir sa merge request et déposez un commentaire.
1. Attendez une réponse, résolvez le commentaire et approuvez sa Merge Request (MR)
1. Lorsqu'on aura approuvé votre MR, mergez-la.
1. Sur votre poste, basculez sur `develop` et utilisez `git pull` pour récupérer les mises à jour. Vérifiez que votre commit a été mergé.
```

```admonish note title="Dans le compte rendu"
1. Expliquez ce qu'est une merge request (ou pull request sur Github)
2. Expliquez l'interêt des merge request dans le cadre d'un gros projet
```

### 3 – Gestion de conflits

**Objectif :** Apprendre à gérer des conflits de fusion

```admonish travail
1. Créez une nouvelle branche et basculez dessus.
2. Ajoutez votre prénom dans la section `Contributrices et contributeurs` du `README.md`
3. Faites un commit (n'oubliez pas d'ajouter votre modification) pour valider votre changement
4. Tentez de faire `git push`. À l'aide du résultat de la commande, corrigez votre commande pour pousser votre branche sur le dépôt distant.
5. Créez une MR. Attendez (dans le calme et la discipline) qu'un camarade en soit au même point.
6. Mergez votre branche ou celle de votre camarade, puis tentez de merger l'autre. Travaillez à deux pour cette partie.
7. Comme tout le monde va modifier le même fichier, il risque d'y avoir des conflits de fusion. Si cela se produit, il faudra les résoudre. Pour ça :
    - Récupérez les changements dans votre espace de travail (`git pull`)
    - La commande échouera probablement. Vous devrez alors effectuer `git pull --rebase`
    - Vous aurez peut-être à gérer le conflit de fusion localement. N'hésitez pas à demander de l'aide.
    - Communiquez entre vous pour définir un ordre de fusion et résoudre les conflits.
```

```admonish warning title="Important"
Cette partie peut être chaotique : tout le monde travaille sur le même fichier et tente de merger en même temps ou presque. C'est voulu, et cela montre l'intérêt de s'organiser lors du travail en projet pour :
- architecturer correctement le code afin de segmenter les problèmes
- bien se répartir les tâches pour ne pas travailler tous en même temps sur les mêmes portions de code
- savoir s'organiser lorsque cela est inévitable
```
