<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rebase on kenji.blog</title><link>http://kenji.blog/fr/tags/rebase/</link><description>Recent content in Rebase on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 09:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/tags/rebase/index.xml" rel="self" type="application/rss+xml"/><item><title>【Commandes Git】La différence entre rebase et merge, et comment les utiliser correctement en pratique</title><link>http://kenji.blog/fr/p/git-rebase-vs-merge-practical-guide/</link><pubDate>Sun, 13 Sep 2026 09:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/git-rebase-vs-merge-practical-guide/</guid><description>&lt;img src="http://kenji.blog/p/git-rebase-vs-merge-practical-guide/img/eyecatch.jpg" alt="Featured image of post 【Commandes Git】La différence entre rebase et merge, et comment les utiliser correctement en pratique" />&lt;h1 id="1-introduction--pourquoi-le-choix-entre-merge-ou-rebase-est-il-un-débat-éternel-">1. Introduction : Pourquoi le choix entre &amp;ldquo;merge ou rebase&amp;rdquo; est-il un débat éternel ?
&lt;/h1>&lt;p>Git est un système de contrôle de version indispensable dans le développement logiciel moderne. Lorsque plusieurs développeurs modifient simultanément une base de code, le puissant modèle de branches de Git prend tout son sens. Cependant, dans le développement en équipe, le débat sur &amp;ldquo;s&amp;rsquo;il faut utiliser &lt;code>merge&lt;/code> ou &lt;code>rebase&lt;/code>&amp;rdquo; est un sujet qui tourmente constamment les développeurs, des débutants aux experts.&lt;/p>
&lt;p>Dans cet article, nous explorerons les différences de mécanisme entre &lt;code>git merge&lt;/code> et &lt;code>git rebase&lt;/code> en partant de la structure interne de Git, à savoir le graphe orienté acyclique (DAG) et les propriétés mathématiques des hachages de commit. Ensuite, nous expliquerons en profondeur comment les utiliser correctement en pratique, en nous appuyant sur des flux de travail (workflows) concrets. En allant au-delà d&amp;rsquo;une simple introduction aux commandes et en comprenant les calculs que Git effectue en arrière-plan, vous perdrez votre peur des conflits et serez en mesure de construire un historique propre et traçable.&lt;/p>
&lt;hr>
&lt;h1 id="2-structure-interne-de-git--hachages-de-commit-et-modèle-dobjets">2. Structure interne de Git : Hachages de commit et modèle d&amp;rsquo;objets
&lt;/h1>&lt;p>Pour comprendre comment Git intègre l&amp;rsquo;historique, il faut d&amp;rsquo;abord savoir comment Git stocke les données. Git ne sauvegarde pas simplement les différences (patchs) des modifications de fichiers, mais plutôt un instantané (snapshot) de l&amp;rsquo;ensemble du système de fichiers à un moment donné.&lt;/p>
&lt;h2 id="21-propriétés-cryptographiques-des-hachages-de-commit">2.1 Propriétés cryptographiques des hachages de commit
&lt;/h2>&lt;p>Chaque commit dans Git est identifié de manière unique par un nombre hexadécimal de 40 caractères calculé à partir de son contenu à l&amp;rsquo;aide de la fonction de hachage SHA-1 (Secure Hash Algorithm 1). L&amp;rsquo;objet commit est composé des éléments suivants :&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Pointeur vers l&amp;rsquo;objet Tree&lt;/strong> : Un instantané de la structure des répertoires et des fichiers (Blob) à ce moment-là.&lt;/li>
&lt;li>&lt;strong>Pointeurs vers les commits parents&lt;/strong> : Les valeurs de hachage d&amp;rsquo;un ou plusieurs commits parents (le premier commit n&amp;rsquo;a pas de parent, et un commit de fusion a deux parents ou plus).&lt;/li>
&lt;li>&lt;strong>Informations de l&amp;rsquo;auteur (Author)&lt;/strong> : La personne qui a écrit le code et la date/heure.&lt;/li>
&lt;li>&lt;strong>Informations du validateur (Committer)&lt;/strong> : La personne qui a créé/appliqué le commit et la date/heure.&lt;/li>
&lt;li>&lt;strong>Message de commit&lt;/strong> : Texte expliquant l&amp;rsquo;intention de la modification.&lt;/li>
&lt;/ol>
&lt;p>Exprimée mathématiquement, la valeur de hachage $H(C)$ pour l&amp;rsquo;objet commit $C$ est définie comme suit :&lt;/p>
$$
H(C) = \text{SHA-1}( \text{tree} \parallel \text{parent} \parallel \text{author} \parallel \text{committer} \parallel \text{message} )
$$&lt;p>Ici, $\parallel$ représente la concaténation des données. En raison des caractéristiques de la fonction de hachage, le simple fait de changer une lettre dans le message de commit, ou d&amp;rsquo;avoir un commit parent différent, générera une valeur de hachage complètement différente. En d&amp;rsquo;autres termes, &lt;strong>les commits sont immuables (Immutable)&lt;/strong>. Lorsque l&amp;rsquo;on dit que le &lt;code>rebase&lt;/code>, décrit plus loin, &amp;ldquo;réécrit l&amp;rsquo;historique&amp;rdquo;, c&amp;rsquo;est parce qu&amp;rsquo;il crée en fait de &amp;ldquo;nouveaux commits avec des contenus similaires mais des valeurs de hachage différentes&amp;rdquo;.&lt;/p>
&lt;p>La taille de l&amp;rsquo;espace de hachage est de $2^{160}$, et la probabilité $P$ qu&amp;rsquo;une collision (deux commits différents ayant la même valeur de hachage) se produise peut être approximée par la théorie du paradoxe des anniversaires (Birthday Paradox) comme suit ($n$ étant le nombre de commits) :&lt;/p>
$$
P(\text{collision}) \approx 1 - \exp\left(-\frac{n^2}{2 \times 2^{160}}\right)
$$&lt;p>Cette probabilité est extrêmement faible et, en pratique, il est presque impossible que les hachages de commit de Git entrent en collision.&lt;/p>
&lt;hr>
&lt;h1 id="3-théorie-des-graphes-et-dag--modèle-mathématique-de-lhistorique-git">3. Théorie des graphes et DAG : Modèle mathématique de l&amp;rsquo;historique Git
&lt;/h1>&lt;p>L&amp;rsquo;historique des commits de Git est modélisé comme un &amp;ldquo;graphe orienté acyclique&amp;rdquo; (Directed Acyclic Graph, DAG) en théorie des graphes.&lt;/p>
&lt;h2 id="31-quest-ce-quun-dag-graphe-orienté-acyclique-">3.1 Qu&amp;rsquo;est-ce qu&amp;rsquo;un DAG (graphe orienté acyclique) ?
&lt;/h2>&lt;p>Dans un graphe $G = (V, E)$, $V$ est l&amp;rsquo;ensemble des commits (sommets), et $E$ est l&amp;rsquo;ensemble des arêtes orientées montrant les relations parent-enfant entre les commits. Dans Git, la direction des arêtes va &amp;ldquo;du commit enfant vers le commit parent&amp;rdquo;. C&amp;rsquo;est parce le nouveau commit conserve un pointeur vers le commit passé.&lt;/p>
&lt;pre class="mermaid">
graph BT
A[&amp;#34;Commit A (Initial)&amp;#34;]
B[&amp;#34;Commit B&amp;#34;]
C[&amp;#34;Commit C (Principal)&amp;#34;]
D[&amp;#34;Commit D (Fonctionnalité)&amp;#34;]
E[&amp;#34;Commit E (Fusion)&amp;#34;]
B --&amp;gt; A
C --&amp;gt; B
D --&amp;gt; B
E --&amp;gt; C
E --&amp;gt; D
&lt;/pre>
&lt;p>La caractéristique principale d&amp;rsquo;un DAG est l&amp;rsquo;absence de cycles (boucles). Grâce à cela, les algorithmes qui remontent l&amp;rsquo;historique des commits ne tombent jamais dans une boucle infinie et peuvent atteindre la fin (le commit initial) à coup sûr.&lt;/p>
&lt;h2 id="32-tri-topologique-et-ordre-de-lhistorique">3.2 Tri topologique et ordre de l&amp;rsquo;historique
&lt;/h2>&lt;p>Lors de l&amp;rsquo;affichage de l&amp;rsquo;historique avec des commandes comme &lt;code>git log&lt;/code>, le DAG est ordonné sous forme de liste unidimensionnelle par un algorithme de tri topologique (Topological Sort). Pour toute arête orientée $u \to v$ ($u$ est l&amp;rsquo;enfant de $v$) dans le DAG, l&amp;rsquo;algorithme les réorganise de sorte que $u$ apparaisse avant $v$ dans la liste.&lt;/p>
&lt;hr>
&lt;h1 id="4-le-mécanisme-et-les-types-de-git-merge">4. Le mécanisme et les types de git merge
&lt;/h1>&lt;p>La commande la plus fondamentale pour intégrer les modifications d&amp;rsquo;une branche est &lt;code>git merge&lt;/code>. Cependant, en fonction de l&amp;rsquo;état actuel, Git choisit automatiquement une stratégie de fusion différente.&lt;/p>
&lt;h2 id="41-fusion-fast-forward---ff">4.1 Fusion Fast-Forward (&amp;ndash;ff)
&lt;/h2>&lt;p>Si la branche cible de l&amp;rsquo;intégration (ex. : &lt;code>main&lt;/code>) est un ancêtre direct de la branche source de l&amp;rsquo;intégration (ex. : &lt;code>feature&lt;/code>), Git effectue une fusion &amp;ldquo;Fast-Forward&amp;rdquo; (avance rapide). C&amp;rsquo;est une opération qui ne crée pas de nouveau commit, mais qui avance simplement le pointeur de la branche.&lt;/p>
&lt;pre class="mermaid">
gitGraph
commit id: &amp;#34;A&amp;#34;
commit id: &amp;#34;B&amp;#34;
branch feature
checkout feature
commit id: &amp;#34;C&amp;#34;
commit id: &amp;#34;D&amp;#34;
checkout main
merge feature
&lt;/pre>
&lt;p>La fusion Fast-Forward maintient l&amp;rsquo;historique en ligne droite, mais elle a l&amp;rsquo;inconvénient de perdre le contexte de &amp;ldquo;quels groupes de commits constituaient le développement d&amp;rsquo;une fonctionnalité (feature) spécifique&amp;rdquo;.&lt;/p>
&lt;h2 id="42-fusion-non-fast-forward---no-ff">4.2 Fusion Non-Fast-Forward (&amp;ndash;no-ff)
&lt;/h2>&lt;p>Si vous spécifiez explicitement &lt;code>git merge --no-ff&lt;/code>, Git créera toujours un nouveau &amp;ldquo;commit de fusion&amp;rdquo;, même dans une situation où le Fast-Forward est possible. Un commit de fusion est un commit spécial avec deux parents.&lt;/p>
&lt;pre class="mermaid">
gitGraph
commit id: &amp;#34;A&amp;#34;
commit id: &amp;#34;B&amp;#34;
branch feature
checkout feature
commit id: &amp;#34;C&amp;#34;
commit id: &amp;#34;D&amp;#34;
checkout main
commit id: &amp;#34;Travail Principal 1&amp;#34;
merge feature type: NORMAL
&lt;/pre>
&lt;p>L&amp;rsquo;avantage de cette méthode est que l&amp;rsquo;existence et l&amp;rsquo;histoire de la branche de fonctionnalité restent claires sur le DAG. Lorsqu&amp;rsquo;un problème survient, il est possible d&amp;rsquo;annuler (revert) en toute sécurité l&amp;rsquo;ensemble de la fonctionnalité en exécutant &lt;code>git revert -m 1 &amp;lt;hachage du commit de fusion&amp;gt;&lt;/code>.&lt;/p>
&lt;h2 id="43-algorithme-de-fusion-à-3-voies-3-way-merge">4.3 Algorithme de fusion à 3 voies (3-Way Merge)
&lt;/h2>&lt;p>Si la branche cible et la branche source ont chacune leurs propres commits, Git exécute une fusion à 3 voies. Git explore alors le DAG et trouve &amp;ldquo;l&amp;rsquo;ancêtre commun le plus proche&amp;rdquo; (Lowest Common Ancestor, LCA) des deux branches.&lt;/p>
&lt;p>La complexité algorithmique $T_{\text{LCA}}$ pour trouver le LCA peut être exécutée en temps linéaire par rapport au nombre de sommets $|V|$ et d&amp;rsquo;arêtes $|E|$ :&lt;/p>
$$
T_{\text{LCA}} = \mathcal{O}(|V| + |E|)
$$&lt;p>Git compare trois états : &amp;ldquo;l&amp;rsquo;état du LCA&amp;rdquo;, &amp;ldquo;l&amp;rsquo;état de la branche actuelle&amp;rdquo; et &amp;ldquo;l&amp;rsquo;état de l&amp;rsquo;autre branche&amp;rdquo;. S&amp;rsquo;il n&amp;rsquo;y a pas de conflit de modifications, il générera automatiquement un commit de fusion.&lt;/p>
&lt;hr>
&lt;h1 id="5-le-mécanisme-de-git-rebase-et-la-reconstruction-de-lhistorique">5. Le mécanisme de git rebase et la reconstruction de l&amp;rsquo;historique
&lt;/h1>&lt;p>Alors que &lt;code>git merge&lt;/code> &amp;ldquo;intègre&amp;rdquo; l&amp;rsquo;historique, &lt;code>git rebase&lt;/code> &amp;ldquo;reconstruit&amp;rdquo; (rattache) l&amp;rsquo;historique.&lt;/p>
&lt;h2 id="51-le-fonctionnement-interne-de-rebase">5.1 Le fonctionnement interne de Rebase
&lt;/h2>&lt;p>Lorsque vous rebasez la branche &lt;code>feature&lt;/code> sur la branche &lt;code>main&lt;/code> (&lt;code>git rebase main&lt;/code>), le fonctionnement interne est le suivant :&lt;/p>
&lt;ol>
&lt;li>Trouver l&amp;rsquo;ancêtre commun (LCA) entre la branche &lt;code>feature&lt;/code> et la branche &lt;code>main&lt;/code>.&lt;/li>
&lt;li>Sauvegarder dans une zone temporaire les différences des commits entre le LCA et l&amp;rsquo;extrémité de la branche &lt;code>feature&lt;/code>.&lt;/li>
&lt;li>Déplacer le pointeur de la branche &lt;code>feature&lt;/code> vers l&amp;rsquo;extrémité de la branche &lt;code>main&lt;/code>.&lt;/li>
&lt;li>Appliquer les différences sauvegardées une par une sur la nouvelle base (l&amp;rsquo;extrémité de &lt;code>main&lt;/code>) dans l&amp;rsquo;ordre (Cherry-Pick), créant ainsi de nouveaux commits.&lt;/li>
&lt;/ol>
&lt;pre class="mermaid">
graph TD
A[&amp;#34;Commit A&amp;#34;] --&amp;gt; B[&amp;#34;Commit B&amp;#34;]
B --&amp;gt; C[&amp;#34;Commit C (Principal)&amp;#34;]
B --&amp;gt; D[&amp;#34;Commit D (Ancienne Fonctionnalité)&amp;#34;]
D -.-&amp;gt; E[&amp;#34;Commit D&amp;#39; (Nouvelle Fonctionnalité)&amp;#34;]
C --&amp;gt; E
style D stroke-dasharray: 5 5, fill: #f9f9f9, color: #999
&lt;/pre>
&lt;p>Le point important ici est que le commit généré par le rebase $D'$ a &lt;strong>des commits parents différents du commit d&amp;rsquo;origine $D$, et aura donc une valeur de hachage complètement différente&lt;/strong> (voir la définition de la fonction de hachage $H(C)$ mentionnée précédemment).&lt;/p>
&lt;h2 id="52-rebase-interactif-interactive-rebase">5.2 Rebase interactif (Interactive Rebase)
&lt;/h2>&lt;p>L&amp;rsquo;utilisation de &lt;code>git rebase -i&lt;/code> (ou &lt;code>--interactive&lt;/code>) vous permet de manipuler l&amp;rsquo;historique des commits à votre guise. C&amp;rsquo;est l&amp;rsquo;outil ultime pour nettoyer l&amp;rsquo;historique local.&lt;/p>
&lt;ul>
&lt;li>&lt;code>pick&lt;/code> : Conserver le commit tel quel.&lt;/li>
&lt;li>&lt;code>reword&lt;/code> : Modifier uniquement le message du commit.&lt;/li>
&lt;li>&lt;code>edit&lt;/code> : Suspendre le processus pour modifier le contenu du commit.&lt;/li>
&lt;li>&lt;code>squash&lt;/code> : Fusionner ce commit avec le commit précédent et combiner leurs messages.&lt;/li>
&lt;li>&lt;code>fixup&lt;/code> : Semblable à &lt;code>squash&lt;/code>, mais ignore le message de ce commit.&lt;/li>
&lt;li>&lt;code>drop&lt;/code> : Supprimer complètement le commit.&lt;/li>
&lt;/ul>
&lt;p>D&amp;rsquo;un point de vue mathématique, si une branche contient $N$ commits, les variations (permutations) d&amp;rsquo;historique linéaire $P$ qui peuvent être générées en changeant l&amp;rsquo;ordre lors du rebase sont les suivantes :&lt;/p>
$$
P = N!
$$&lt;p>Git donne aux développeurs $N!$ degrés de liberté, ce qui leur permet de garder un historique logique et élégant.&lt;/p>
&lt;hr>
&lt;h1 id="6-la-règle-dor-du-rebase-the-golden-rule-of-rebase">6. La règle d&amp;rsquo;or du Rebase (The Golden Rule of Rebase)
&lt;/h1>&lt;p>Bien que &lt;code>rebase&lt;/code> soit très puissant, il existe une règle absolue.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>&amp;ldquo;Ne jamais rebaser un historique public.&amp;rdquo;&lt;/strong>
&lt;em>(Never rebase public history)&lt;/em>&lt;/p>
&lt;/blockquote>
&lt;h2 id="61-pourquoi-ne-faut-il-pas-rebaser-un-historique-public-">6.1 Pourquoi ne faut-il pas rebaser un historique public ?
&lt;/h2>&lt;p>Git est distribué. Les commits que vous avez poussés sur &lt;code>origin/main&lt;/code> ont également été clonés (dupliqués) dans les dépôts locaux des autres développeurs. Si vous rebasez un commit déjà poussé pour réécrire l&amp;rsquo;historique, puis que vous forcez l&amp;rsquo;écrasement avec &lt;code>git push --force&lt;/code>, que se passera-t-il ?&lt;/p>
&lt;p>Le DAG local des autres développeurs et le DAG distant vont diverger fondamentalement. Lorsque les autres développeurs exécuteront &lt;code>git pull&lt;/code>, Git tentera de forcer la fusion de groupes de commits ayant des historiques différents, ce qui entraînera d&amp;rsquo;énormes conflits et des commits en double (des commits ayant le même contenu mais des hachages différents), plongeant le dépôt dans un état de panique.&lt;/p>
&lt;p>La règle d&amp;rsquo;or est de &lt;strong>&amp;ldquo;n&amp;rsquo;utiliser rebase que sur des branches locales qui n&amp;rsquo;ont pas encore été partagées avec d&amp;rsquo;autres&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h1 id="7-résolution-des-conflits-et-git-rebase---continue">7. Résolution des conflits et git rebase &amp;ndash;continue
&lt;/h1>&lt;p>Si plusieurs personnes modifient la même partie d&amp;rsquo;un même fichier, un conflit se produit. Le processus de résolution des conflits est différent pour &lt;code>merge&lt;/code> et &lt;code>rebase&lt;/code>.&lt;/p>
&lt;h2 id="71-résolution-des-conflits-dans-merge">7.1 Résolution des conflits dans Merge
&lt;/h2>&lt;p>Avec &lt;code>git merge&lt;/code>, la résolution des conflits ne se produit &lt;strong>qu&amp;rsquo;une seule fois&lt;/strong>. Vous corrigez tous les conflits en une seule fois juste avant de créer le commit de fusion final.&lt;/p>
&lt;h2 id="72-résolution-des-conflits-dans-rebase">7.2 Résolution des conflits dans Rebase
&lt;/h2>&lt;p>Avec &lt;code>git rebase&lt;/code>, en raison de sa nature consistant à réappliquer les commits un par un, &lt;strong>un conflit peut survenir pour chaque commit&lt;/strong>.&lt;/p>
&lt;p>Si un conflit survient pendant le rebase, Git interrompt le processus. Le flux de résolution est le suivant :&lt;/p>
&lt;ol>
&lt;li>Ouvrez un éditeur de texte ou un IDE (comme VS Code) et corrigez manuellement les marqueurs de conflit (&lt;code>&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code>, &lt;code>======&lt;/code>, &lt;code>&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code>).&lt;/li>
&lt;li>Ajoutez les fichiers corrigés à l&amp;rsquo;index :
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git add &amp;lt;fichiers_modifiés&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>Sans créer de commit, reprenez le processus de rebase :
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git rebase --continue
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Si vous souhaitez annuler le rebase lui-même et revenir à l&amp;rsquo;état d&amp;rsquo;origine, exécutez la commande suivante :&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git rebase --abort
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>(&lt;em>Si la résolution d&amp;rsquo;un conflit n&amp;rsquo;est pas nécessaire et que vous souhaitez sauter ce commit, utilisez &lt;code>git rebase --skip&lt;/code>.&lt;/em>)&lt;/p>
&lt;hr>
&lt;h1 id="8-utilisation-correcte-en-pratique-pratiques-de-workflow">8. Utilisation correcte en pratique (Pratiques de Workflow)
&lt;/h1>&lt;p>Alors, comment devez-vous utiliser &lt;code>merge&lt;/code> et &lt;code>rebase&lt;/code> dans des environnements de développement réels ? Voici l&amp;rsquo;approche la plus standard et la plus sûre.&lt;/p>
&lt;h2 id="81-scénario-1-nettoyer-lhistorique-de-travail-local-utilisation-de-rebase">8.1 [Scénario 1] Nettoyer l&amp;rsquo;historique de travail local (Utilisation de Rebase)
&lt;/h2>&lt;p>Supposons que vous développiez sur une branche de fonctionnalité et que de nombreux petits commits (comme des &amp;ldquo;corrections de fautes de frappe&amp;rdquo; ou &amp;ldquo;sauvegardes temporaires&amp;rdquo;) se soient accumulés. Avant de créer une Pull Request (PR), utilisez le rebase interactif pour les organiser en unités significatives.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Exécuté sur la branche feature&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git rebase -i HEAD~5
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># (L&amp;#39;éditeur s&amp;#39;ouvre, et vous pouvez utiliser squash et fixup pour nettoyer l&amp;#39;historique)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Cela crée un historique de commits clair, rendant vos intentions facilement compréhensibles pour le réviseur.&lt;/p>
&lt;h2 id="82-scénario-2-suivre-les-dernières-modifications-de-la-branche-main-utilisation-de-rebase">8.2 [Scénario 2] Suivre les dernières modifications de la branche main (Utilisation de Rebase)
&lt;/h2>&lt;p>Si le développement prend du temps et que les modifications des autres sont continuellement fusionnées dans la branche &lt;code>main&lt;/code>, votre branche &lt;code>feature&lt;/code> deviendra obsolète. Dans ce cas, suivez le rythme en rebasant votre branche &lt;code>feature&lt;/code> sur la dernière version de &lt;code>main&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Récupérer les dernières informations de main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git fetch origin
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Rattacher la branche feature au sommet de la dernière version de main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git rebase origin/main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Cela maintient un historique en ligne droite et permet d&amp;rsquo;éviter les conflits lors de la fusion ultérieure. Cela empêche également la création de commits de fusion inutiles (&amp;ldquo;Merge branch &amp;lsquo;main&amp;rsquo; into feature&amp;rdquo;).&lt;/p>
&lt;h2 id="83-scénario-3-intégration-de-fonctionnalités-terminées-utilisation-de-merge">8.3 [Scénario 3] Intégration de fonctionnalités terminées (Utilisation de Merge)
&lt;/h2>&lt;p>Une fois le développement sur la branche &lt;code>feature&lt;/code> terminé, il est temps de l&amp;rsquo;intégrer dans la branche &lt;code>main&lt;/code>. Ici, utilisez &lt;strong>&lt;code>git merge --no-ff&lt;/code>&lt;/strong> (c&amp;rsquo;est la même chose que de choisir &amp;ldquo;Create a merge commit&amp;rdquo; dans une Pull Request sur GitHub).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">git checkout main
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git merge --no-ff feature -m &lt;span class="s2">&amp;#34;Merge feature: Implémentation de la fonction de connexion utilisateur&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">git push origin main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Cela laisse un point nodal historique (un commit de fusion) sur le DAG de la branche &lt;code>main&lt;/code>, indiquant qu&amp;rsquo;&amp;ldquo;une fonctionnalité a été fusionnée ici&amp;rdquo;. Lorsque vous regardez l&amp;rsquo;historique plus tard, il est plus facile de suivre le code par fonctionnalité.&lt;/p>
&lt;hr>
&lt;h1 id="9-conclusion-résumé">9. Conclusion (Résumé)
&lt;/h1>&lt;p>Lors de l&amp;rsquo;utilisation de Git, les approches extrêmes telles que &amp;ldquo;tout résoudre avec Merge&amp;rdquo; ou &amp;ldquo;tout garder en ligne droite avec Rebase&amp;rdquo; ont chacune leurs avantages et leurs inconvénients.&lt;/p>
&lt;p>La meilleure pratique en milieu professionnel est une approche hybride : &lt;strong>&amp;ldquo;utiliser rebase pour nettoyer élégamment l&amp;rsquo;historique privé local, et utiliser merge &amp;ndash;no-ff pour conserver le contexte dans l&amp;rsquo;historique public d&amp;rsquo;intégration&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Local (espace de travail personnel)&lt;/strong> : Utilisez &lt;code>rebase&lt;/code> pour éliminer les commits inutiles et maintenir un historique linéaire en suivant les dernières modifications de la branche principale.&lt;/li>
&lt;li>&lt;strong>Global (espace de travail partagé)&lt;/strong> : Utilisez &lt;code>merge --no-ff&lt;/code> pour enregistrer l&amp;rsquo;existence de la branche de fonctionnalité sous forme de commit de fusion dans le DAG, facilitant ainsi les reverts et le suivi.&lt;/li>
&lt;/ul>
&lt;p>En comprenant le contexte mathématique et architectural tel que la structure du DAG et le fonctionnement de la fonction de hachage, les commandes Git passent de la simple mémorisation à la &amp;ldquo;conception intentionnelle d&amp;rsquo;un historique&amp;rdquo;. En respectant la règle d&amp;rsquo;or du rebase, choisissez les commandes optimales pour chaque situation et construisez un historique de commits propre, facile à lire et à maintenir pour toute l&amp;rsquo;équipe.&lt;/p></description></item></channel></rss>