Pourquoi Git avance : rebase, cherry-pick, stash ?
Au quotidien des développeurs, la gestion du code source est cruciale pour maintenir la qualité et l'intégrité du projet. Les outils rebase, cherry-pick et stash de Git offrent des fonctionnalités avancées qui permettent aux développeurs de manipuler facilement les branches, d'appliquer des modifications spécifiques et de sauvegarder temporairement des changements sans perturber le workflow normal. Ces outils sont particulièrement utiles pour les équipes travaillant sur des projets complexes avec plusieurs branchs.
Un cas d'utilisation concret est lorsqu'un développeur a un bug important à corriger dans la branche main mais ne veut pas que cette correction perturbe le développement actuel sur sa branche feature. En utilisant cherry-pick, il peut appliquer uniquement ce correctif sans fusionner l'ensemble de la branche main. Plus tard, avec rebase, il peut intégrer les modifications à partir de son branche feature dans la branche main de manière propre et linéaire.
Prerequis
- Connaissance avancée des bases de Git (commits, branches, merges).
- Familiarité avec les commandes de terminal.
- Un environnement Git configuré sur votre machine (ex: Git Bash pour Windows, Terminal pour macOS/Linux).
Concepts fondamentaux
Rebase
Le rebase permet de déplacer ou combiner des séries de commits à une autre branche. Il est souvent utilisé pour "coller" les modifications d'une branche feature sur la branche main de manière linéaire.
## 👉 Commencez par vous assurer que votre branche feature est mise à jour avec main
git checkout feature-branch
git pull origin main
## 👉 Effectuez le rebase sur la branche main
git rebase main
Cherry-Pick
Le cherry-pick permet d'appliquer un ou plusieurs commits spécifiques de une branche à une autre. C'est utile pour appliquer des modifications importantes sans fusionner l'ensemble du code.
## 👉 Appliquez le commit avec l'ID 'abc123' à la branche feature-branch
git checkout feature-branch
git cherry-pick abc123
Stash
Le stash permet de sauvegarder temporairement les modifications dans votre travail courant sans les commiter. C'est utile lorsque vous devez passer à une autre tâche mais voulez garder vos changements en cours.
## 👉 Sauvegardez les modifications actuelles
git stash
## 👉 Récupérez les modifications sauvegardées
git stash pop
## 👉 Affichez la liste des stashs
git stash list
Mise en pratique : projet fil rouge
Nous allons construire un simple gestionnaire de tâches en utilisant Node.js et Express. Ce projet nous permettra d'explorer les concepts de rebase, cherry-pick et stash.
Étape 1 : Initialiser le Projet
## 👉 Créez un nouveau répertoire et initialisez Git
mkdir task-manager
cd task-manager
git init
## 👉 Initialisez un nouveau projet Node.js
npm init -y
Étape 2 : Installer les Dépendances
## 👉 Installez Express
npm install express
Étape 3 : Créer le Serveur
// 👉 Importez Express
const express = require('express');
const app = express();
const port = 3000;
// 👉 Middleware pour parser les requêtes JSON
app.use(express.json());
// 👉 Route pour obtenir toutes les tâches
app.get('/tasks', (req, res) => {
const tasks = ['Task 1', 'Task 2'];
res.send(tasks);
});
// 👉 Route pour ajouter une nouvelle tâche
app.post('/tasks', (req, res) => {
const task = req.body.task;
// 👇 TODO : Ajoutez la tâche à la liste
res.status(201).send(task);
});
// 👉 Lancez le serveur
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
Étape 4 : Testez le Serveur
## 👉 Lancez le serveur avec Node.js
node server.js
Allez sur http://localhost:3000/tasks dans votre navigateur pour voir les tâches. Vous devriez voir une erreur car nous n'avons pas encore implémenté la route POST.
Étape 5 : Implémentez la Route POST
// 👉 Ajoutez cette ligne à la fin du fichier server.js
app.post('/tasks', (req, res) => {
const task = req.body.task;
tasks.push(task); // 👇 TODO : Sauvegardez la tâche
res.status(201).send(task);
});
Étape 6 : Ajoutez un Stash
Maintenant que vous avez ajouté une fonctionnalité importante, mais que le code ne compile pas encore, vous pouvez utiliser stash pour sauvegarder les modifications en cours.
## 👉 Sauvegardez les modifications actuelles
git stash
Étape 7 : Ajoutez la Sauvegarde des Tâches
Créez un fichier tasks.json pour stocker les tâches.
// 👉 tasks.json
[]
Et modifiez le code pour sauvegarder les tâches dans ce fichier.
const fs = require('fs');
let tasks = JSON.parse(fs.readFileSync('tasks.json', 'utf8'));
app.post('/tasks', (req, res) => {
const task = req.body.task;
tasks.push(task);
fs.writeFileSync('tasks.json', JSON.stringify(tasks));
res.status(201).send(task);
});
Étape 8 : Réappliquez le Stash
Maintenant que vous avez résolu le problème, vous pouvez réappliquer les modifications en cours avec cherry-pick.
## 👉 Récupérez la dernière modification stashée
git stash pop
## 👉 Ajoutez et committez les changements
git add server.js tasks.json
git commit -m "Ajoutez la sauvegarde des tâches"
Étape 9 : Intégrez les Modifications avec Rebase
Enfin, utilisez rebase pour intégrer les modifications à partir de votre branche feature dans la branche main.
## 👉 Effectuez le rebase sur la branche main
git checkout main
git rebase feature-branch
Erreurs frequentes et debugging
Erreur 1 : Rebase conflict
Lors d'un rebase, vous pouvez rencontrer des conflits qui doivent être résolus manuellement.
## 👉 Effectuez le rebase sur la branche main
git checkout feature-branch
git rebase main
Message d'erreur :
CONFLICT (content): Merge conflict in server.js
Automatic merge failed; fix conflicts and then commit the result.
Correction :
## 👉 Résolvez le conflit manuellement dans server.js
git add server.js
## 👉 Continuez le rebase
git rebase --continue
Erreur 2 : Cherry-Pick invalid commit ID
Lors d'un cherry-pick, vous devez spécifier un identifiant de commit valide.
## 👉 Appliquez le commit avec l'ID 'abc123' à la branche feature-branch
git checkout feature-branch
git cherry-pick abc123
Message d'erreur :
error: commit abc123 does not exist.
Correction :
## 👉 Vérifiez les identifiants de commit disponibles
git log
## 👉 Appliquez le correct ID
git cherry-pick def456
Erreur 3 : Stash apply error
Lors d'un stash pop, vous pouvez rencontrer des erreurs si la sauvegarde contient des modifications qui ne peuvent pas être appliquées.
## 👉 Récupérez les modifications stashées
git stash pop
Message d'erreur :
error: Your local changes to the following files would be overwritten by checkout:
server.js
Please commit your changes or use 'git stash' before you switch branches.
Aborting
Correction :
## 👉 Commitez ou sauvegardez les modifications locales
git add server.js
git commit -m "Enregistrer mes modifications"
## 👉 Réappliquez le stash
git stash pop
Pour aller plus loin
- Gestion des conflits avancée : Découvrez comment résoudre automatiquement les conflits avec
git mergetool. - Utilisation de Git Flow : Apprenez à utiliser le modèle de développement Git Flow pour une gestion efficace du workflow.
- Optimisations avancées de Git : Explorez des outils comme
git-colaougitkpour visualiser et optimiser votre historique de commits.
Défi pratique
Créez un simple script CLI qui utilise les concepts appris (rebase, cherry-pick, stash) pour automatiser une tâche spécifique, par exemple la mise à jour d'un environnement local.