Nouveau : Datasets open source gratuits disponibles !Decouvrir →
📦
Avance 25 min Git

Git avance : rebase, cherry-pick, stash

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

  1. Gestion des conflits avancée : Découvrez comment résoudre automatiquement les conflits avec git mergetool.
  2. Utilisation de Git Flow : Apprenez à utiliser le modèle de développement Git Flow pour une gestion efficace du workflow.
  3. Optimisations avancées de Git : Explorez des outils comme git-cola ou gitk pour 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.

Besoin d'aide sur Git ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Qu'est-ce que rebase en Git et comment puis-je l'utiliser?
Rebase est une commande qui permet d'appliquer les modifications de la branche courante sur la base des derniers commits de la branche cible. Cela peut aider à conserver un historique linéaire et net dans votre projet.
Comment utiliser stash pour sauvegarder mes modifications momentanées?
Stash permet de mettre de côté les modifications qui ne sont pas prêtes à être commises. Vous pouvez utiliser `git stash` pour sauvegarder vos changements et revenir à la dernière version du code sans perdre ce que vous avez en cours d'édition.
Quelle est la différence entre rebase et merge en Git?
Rebase applique les modifications de votre branche sur une autre branche, créant un historique linéaire. Merge combine deux branches en créant un nouveau commit qui comporte des parents provenant de chaque branche. Rebase est souvent préféré pour avoir un historique plus propre et linéaire.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.