# 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 ?


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://students.corentindesfarges.fr/cnam-fip-1a/tp-rebase.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
