# TP : Rebase

## Mise en place et instructions

Pour ce TP, vous aurez besoin de [Git et Git Bash](https://gitforwindows.org/) (ou d'un terminal Unix).

**À la fin de la séance du 15/10/2020**, merci de déposer un fichier .zip/.rar (ou équivalent) à [cette adresse](https://drive.google.com/drive/folders/1ivQwbx7XLjXn0urqzqhRmA4a5I3Dfb5X?usp=sharing), au format **NOM\_prenom\_TP03.zip**, contenant :\
\- L'intégralité de votre dossier de travail (le dossier masqué .git doit être présent)\
\- Un fichier (txt, pdf, docx, ...) contenant les commandes jouées lors de ce TP

Vous êtes libre d'ajouter à votre rapport les difficultés rencontrées.

**Pour le nommage de vos commits, il conviendra d'appliquer la méthode de nommage de commit vue lors de la séance précédente.**

## Gérer les branches efficacement <a href="#enrichir-le-projet-de-nouvelles-fonctionnalites" id="enrichir-le-projet-de-nouvelles-fonctionnalites"></a>

```
git clone https://gitlab.com/corentin.desfarges/tp-rebase-2020.git
cd tp-rebase-2020
git checkout ajout-styles
git checkout improve-doc
git checkout modification-textes
git checkout master
```

{% hint style="info" %}
Les commandes précédentes seront étudiées prochainement
{% endhint %}

### **Récupérer le projet pour travailler en local** <a href="#creer-des-feature-branches" id="creer-des-feature-branches"></a>

### Aperçu du dépôt Git

![](https://657091054-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LnswsZS6eUIgREjnzKE%2F-MJfXXWieraAAmKpOCfN%2F-MJfYR42EnnRT054w9Yf%2Fimage.png?alt=media\&token=fd0ed844-9dd3-4b70-af48-7481550f6e42)

### Let's merge into master...

Pour commencer tout doucement, on décide de merger la branche `improve-doc` dans `master`. Sachant que la branche `master` n'a pas changé depuis la création de `improve-doc` , choisissez la commande la plus simple à vos yeux. **Expliquez votre choix.**

### **Jusque là tout va bien**

Il est fort probable que tout se soit bien passé jusqu'ici ! Sinon, je vous invite à demander de l'aide.

On décide ensuite de merger la branche `modification-textes` sur `master`. On pourrait utiliser la commande `merge`, mais on souhaite conserver l'historique le plus linéaire possible. Il s'agit donc de **rebaser** notre branche sur `master`.

Donnez la ou les différentes commandes que vous utilisez. Le résultat devrait être sensiblement similaire à celui-ci :

```
First, rewinding head to replay your work on top of it...
Applying: feat(index): modify paragraph content
Applying: feat(index): rename page title
```

En cas de problème, contactez-moi (moi === le mec qui vous parle depuis 2h) immédiatement. Vous pourriez être bloqués pour la suite du TP.

Utilisez la commande adéquate pour vérifier la linéarité de votre branche `master`. Vous pouvez constaté que le commit parent de votre branche est désormais celui intitulé *"docs(): add working instructions".*

Vous pouvez désormais rapatrier les modifications de la branche courante dans `master`.

### Un poil plus technique

Placez-vous sur la dernière branche à merger : `ajout-styles`, et rebasez-là sur la branche `master`. Constatez puis expliquez le résultat suivant :

```
First, rewinding head to replay your work on top of it...
Applying: feat(index): add some colors
Using index info to reconstruct a base tree...
M       index.html
Falling back to patching base and 3-way merge...
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
error: Failed to merge in the changes.
Patch failed at 0001 feat(index): add some colors
The copy of the patch that failed is found in: .git/rebase-apply/patch
```

Résolvez le problème, en respectant le contenu d'origine du commit en cours d'application :

* Conservez le nouveau titre de la page
* Conservez le nouveau texte du paragraphe
* Veillez à ce que le texte puisse s'afficher en bleu
* Le fichier css doit bien être inclu dans la page html

Validez puis passez à la suite. Lorsqu'un autre conflit survit, veillez à :

* Conservez le nouveau texte du paragraphe
* Veillez à ce que le texte puisse s'afficher en bleu et que la classe text soit bien appliquée

Validez et passez à la suite. Un nouveau conflit se produit, lors de l'application du commit *"feat(index): rename page title"*. Cette fois, on constate que le conflit se produit sur le titre de la page html. Or, celui-ci a déjà été modifié sur une autre branche, et ce commit n'a plus de raison d'être. Ne l'appliquez pas et terminer le rebase.

Enfin, mergez la branche `ajout-styles` dans `master`.

### On check que tout est bon !

Vérifiez les points suivant :

* Le fichier index.html correspond bien à :

```
<!DOCTYPE html>
<html>
<head>
    <title>TP Git - Rebase</title>
    <link href="styles.css" rel="stylesheet" type="text/css">
</head>
<body>
    <h1>This is a Heading</h1>
    <p class="blue text">Git c'est merveilleux</p>
</body>
</html>
```

* La commande `git log --graph --oneline` donne le résultat (les hashs seront différents) :

```
* cd32090 (HEAD -> master, ajout-styles) feat(index): add text class to uniformize text displaying
* 3dbbe33 feat(index): add some colors
* c371aad (modification-textes) feat(index): rename page title
* 73f0549 feat(index): modify paragraph content
* cba676c (origin/improve-doc, improve-doc) docs(): add working instructions
* c36d817 (origin/master, origin/HEAD) docs(readme): add readme file
* aad15dc feat(index): add initial page
```

### Rebase interactif

Clonez à nouveau le projet, dans un nouveau dossier

```
cd ..
git clone https://gitlab.com/corentin.desfarges/tp-rebase-2020.git tp-rebase-interactif
cd tp-rebase-interactif
git checkout ajout-styles
git checkout improve-doc
git checkout modification-textes
git checkout master
```

Mergez la branche `improve-doc` dans `master`.

Placez-vous sur la branche `modification-textes`,  puis utilisez le mode interactif pour rebaser cette branche sur `master`. Inversez l'ordre des commits (indiquez précisément ce que vous avez fait pour Enfin, mergez dans `master`.

Utilisez le rebase interactif pour rebaser `ajout-styles` sur `master`. L'objectif sera de ne pas appliquer le commit "*feat(index): rename page title"* provenant de cette branche, et de fusionner les deux commits *"feat(index): add some colors"* et *"feat(index): add text class to uniformize text displaying"*.

Enfin, mergez le tout dans `master`.

### On valide !

La commande `git log --graph --oneline` donne le résultat suivant :

```
* b3166ef (HEAD -> master, ajout-styles) feat(index): add some styles
* 211cd8a (modification-textes) feat(index): modify paragraph content
* 434ee5c feat(index): rename page title
* cba676c (origin/improve-doc, improve-doc) docs(): add working instructions
* c36d817 (origin/master, origin/HEAD) docs(readme): add readme file
* aad15dc feat(index): add initial page
```

## Questions

Dans votre rapport, ajoutez les réponses aux questions suivantes :

1. Donnez les principaux cas d'utilisation du mode interactif ?`rebase -i`
2. Dans quel cas ne devriez-vous pas utiliser la commande rebase ?
3. Que pensez-vous de l'utilisation du mode interactif de rebase ?
