TP : Rebase

Mise en place et instructions

Pour ce TP, vous aurez besoin de Git et Git Bash.

À la fin de la séance du 06/11/2019, merci de déposer un fichier .zip/.rar (ou équivalent) à cette adresse, 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

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

Les commandes précédentes seront étudiées prochainement

Récupérer le projet pour travailler en local

Aperçu du dépôt Git

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 inclue 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.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. Adaptez si besoin le résultat de vos recherches effectuées en début de séance.

    1. À quoi sert la commande rebase ?

    2. Quelles sont les principales options de la commande rebase, et quelles sont leurs effets ?

    3. Donnez les principaux cas d'utilisation du mode interactif ?rebase -i

  2. Que pensez-vous de l'utilisation du mode interactif de rebase ?