<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Troubleshooting on kenji.blog</title><link>http://kenji.blog/fr/tags/troubleshooting/</link><description>Recent content in Troubleshooting on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>kenjinote</copyright><lastBuildDate>Sat, 12 Sep 2026 17:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/fr/tags/troubleshooting/index.xml" rel="self" type="application/rss+xml"/><item><title>Erreurs courantes des débutants sur Git et commandes de résolution (résolution de conflits, etc.)</title><link>http://kenji.blog/fr/p/git-beginners-mistakes-and-solutions/</link><pubDate>Sat, 12 Sep 2026 17:00:00 +0900</pubDate><guid>http://kenji.blog/fr/p/git-beginners-mistakes-and-solutions/</guid><description>&lt;img src="http://kenji.blog/p/git-beginners-mistakes-and-solutions/img/eyecatch.jpg" alt="Featured image of post Erreurs courantes des débutants sur Git et commandes de résolution (résolution de conflits, etc.)" />&lt;h1 id="erreurs-courantes-des-débutants-sur-git-et-commandes-de-résolution-résolution-de-conflits-etc">Erreurs courantes des débutants sur Git et commandes de résolution (résolution de conflits, etc.)
&lt;/h1>&lt;h2 id="1-introduction--pourquoi-fait-on-des-erreurs-sur-git-">1. Introduction : Pourquoi fait-on des erreurs sur Git ?
&lt;/h2>&lt;p>Dans le développement logiciel, Git est devenu aussi indispensable que l&amp;rsquo;air ou l&amp;rsquo;eau. Cependant, pour de nombreux débutants (et parfois même pour les experts), Git peut sembler être une &amp;ldquo;boîte noire magique et effrayante&amp;rdquo;. Des commits qui disparaissent, des modifications massives poussées sur la mauvaise branche, des messages d&amp;rsquo;erreur de conflit inédits remplissant l&amp;rsquo;écran&amp;hellip; Lorsqu&amp;rsquo;on tombe dans ces &amp;ldquo;pièges de Git&amp;rdquo;, la progression du travail s&amp;rsquo;arrête complètement, et dans le pire des cas, on est envahi par la peur de détruire le code source.&lt;/p>
&lt;p>Pourquoi Git est-il si difficile et si propice aux erreurs ? La raison principale est que &amp;ldquo;les utilisateurs mémorisent et utilisent des commandes superficielles sans comprendre ce qui se passe à l&amp;rsquo;intérieur de Git&amp;rdquo;. Bien que Git soit basé sur la conception robuste d&amp;rsquo;un système de contrôle de version décentralisé (DVCS), son interface (CLI) n&amp;rsquo;est pas toujours intuitive.&lt;/p>
&lt;p>Dans cet article, nous classerons en de nombreux cas les &amp;ldquo;gaffes (erreurs courantes)&amp;rdquo; que les débutants sur Git rencontrent fréquemment sur le terrain, et nous présenterons les commandes spécifiques pour les résoudre. Cependant, il ne s&amp;rsquo;agira pas d&amp;rsquo;une simple liste de commandes (antisèche). Nous explorerons en profondeur, sur plus de 10 000 caractères, &amp;ldquo;pourquoi cette erreur se produit&amp;rdquo; et &amp;ldquo;comment les données se déplacent à l&amp;rsquo;intérieur de Git lors de l&amp;rsquo;exécution de cette commande&amp;rdquo;, en utilisant la structure du répertoire &lt;code>.git&lt;/code>, le contexte mathématique de l&amp;rsquo;algorithme Diff en arrière-plan, et des diagrammes Mermaid.&lt;/p>
&lt;p>À la fin de cet article, vous devriez être libéré de la peur de Git et convaincu que &amp;ldquo;Git est le partenaire le plus fiable&amp;rdquo;. Plongeons maintenant dans le monde profond de Git.&lt;/p>
&lt;hr>
&lt;h2 id="2-les-abysses-de-git--comprendre-la-structure-interne-du-répertoire-git">2. Les abysses de Git : Comprendre la structure interne du répertoire &lt;code>.git&lt;/code>
&lt;/h2>&lt;p>La première étape pour faciliter le dépannage est de savoir comment Git stocke les données. Le dossier caché &lt;code>.git&lt;/code> situé à la racine de votre projet est le cœur de Git. Git ne gère pas les données comme un simple système enregistrant séquentiellement les différences de fichiers (patchs), mais comme un &lt;strong>flux d&amp;rsquo;instantanés (snapshots)&lt;/strong>.&lt;/p>
&lt;h3 id="21-modèle-dobjet--blob-tree-commit">2.1 Modèle d&amp;rsquo;objet : Blob, Tree, Commit
&lt;/h3>&lt;p>Git utilise principalement trois objets pour représenter l&amp;rsquo;état du dépôt. Ces objets sont stockés dans &lt;code>.git/objects&lt;/code>.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Blob (Binary Large Object)&lt;/strong>
C&amp;rsquo;est l&amp;rsquo;objet qui stocke le contenu du fichier lui-même. Les noms de fichiers et les informations d&amp;rsquo;autorisation n&amp;rsquo;y sont pas inclus. Il s&amp;rsquo;agit d&amp;rsquo;une pure séquence d&amp;rsquo;octets compressée avec zlib et identifiée par une valeur de hachage SHA-1 (40 caractères hexadécimaux).&lt;/li>
&lt;li>&lt;strong>Tree&lt;/strong>
C&amp;rsquo;est l&amp;rsquo;objet qui représente la structure du répertoire. Un objet Tree contient des pointeurs (valeurs de hachage SHA-1) vers d&amp;rsquo;autres objets Tree (sous-répertoires) ou objets Blob (fichiers), ainsi que leurs noms de fichiers et autorisations d&amp;rsquo;accès. Il joue un rôle similaire à un répertoire UNIX.&lt;/li>
&lt;li>&lt;strong>Commit&lt;/strong>
Il contient un pointeur vers l&amp;rsquo;objet Tree de niveau supérieur de l&amp;rsquo;ensemble du dépôt à un moment donné, des métadonnées (auteur, date du commit, message de commit) et un pointeur vers le commit précédent (commit parent).&lt;/li>
&lt;/ol>
&lt;pre class="mermaid">
graph TD
Commit1[&amp;#34;Commit (Hash: 9f8a)&amp;#34;] --&amp;gt; Tree1[&amp;#34;Tree (Hash: 4b82)&amp;#34;]
Tree1 --&amp;gt; Blob1[&amp;#34;Blob (Hash: 8d7e) : index.js&amp;#34;]
Tree1 --&amp;gt; Tree2[&amp;#34;Tree (Hash: 3a2c) : src/&amp;#34;]
Tree2 --&amp;gt; Blob2[&amp;#34;Blob (Hash: 5f1b) : app.js&amp;#34;]
&lt;/pre>
&lt;h3 id="22-la-véritable-nature-de-head-et-des-références-refs">2.2 La véritable nature de HEAD et des références (Refs)
&lt;/h3>&lt;p>En travaillant avec Git, on voit souvent le mot &lt;code>HEAD&lt;/code>. Il s&amp;rsquo;agit d&amp;rsquo;une &lt;strong>référence symbolique (Symbolic Reference)&lt;/strong> qui pointe vers la branche (ou le commit) actuellement extraite.
Si vous ouvrez le fichier &lt;code>.git/HEAD&lt;/code> avec un éditeur de texte, vous verrez la chaîne 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-text" data-lang="text">&lt;span class="line">&lt;span class="cl">ref: refs/heads/main
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Cela signifie que &amp;ldquo;l&amp;rsquo;état actuel se trouve à la pointe de la branche &lt;code>main&lt;/code>&amp;rdquo;. Et si vous ouvrez &lt;code>.git/refs/heads/main&lt;/code>, vous y trouverez un hachage SHA-1 de 40 caractères, qui pointe vers le dernier objet Commit.
Une branche Git n&amp;rsquo;est rien d&amp;rsquo;autre qu&amp;rsquo;un pointeur léger (un fichier) qui pointe vers un commit spécifique. Le simple fait de savoir cela dissipe la peur que &amp;ldquo;supprimer une branche supprimera tous les fichiers&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="3-git-décrypté-par-les-mathématiques--algorithme-diff-et-fonctions-de-hachage">3. Git décrypté par les mathématiques : Algorithme Diff et fonctions de hachage
&lt;/h2>&lt;p>Lorsque Git détecte des conflits ou affiche des différences de fichiers, un algorithme avancé fonctionne en arrière-plan.&lt;/p>
&lt;h3 id="31-algorithme-diff-de-myers">3.1 Algorithme Diff de Myers
&lt;/h3>&lt;p>L&amp;rsquo;algorithme de détection de différences par défaut de Git est celui inventé par Eugene W. Myers. Étant donné deux fichiers texte $A$ et $B$, le problème de trouver la &amp;ldquo;séquence minimale d&amp;rsquo;édition (insertions et suppressions)&amp;rdquo; pour convertir $A$ en $B$ peut être modélisé comme un problème de plus court chemin dans la théorie des graphes.&lt;/p>
&lt;p>Soient $N$ et $M$ les longueurs des chaînes, et $V = N + M$ le total. L&amp;rsquo;algorithme de Myers recherche la distance d&amp;rsquo;édition (Edit Distance) $D$. La complexité temporelle de cet algorithme est exprimée par l&amp;rsquo;équation suivante :&lt;/p>
$$ \mathcal{O}(V \cdot D) $$&lt;p>Ici, si la différence entre les fichiers est petite (c&amp;rsquo;est-à-dire que $D$ est petit), l&amp;rsquo;algorithme fonctionne très rapidement en $\mathcal{O}(V)$. Cependant, si les fichiers est complètement différents, $D \approx V$, et la complexité temporelle dans le pire des cas est de $\mathcal{O}(V^2)$.&lt;/p>
&lt;h3 id="32-patience-diff-et-histogram-diff">3.2 Patience Diff et Histogram Diff
&lt;/h3>&lt;p>L&amp;rsquo;algorithme de Myers est excellent, mais il peut générer des différences qui ne sont pas intuitives (dénuées de sens) pour les humains, par exemple lors d&amp;rsquo;un grand changement dans l&amp;rsquo;ordre des fonctions ou des classes. Pour résoudre ce problème, Git implémente &lt;code>Patience Diff&lt;/code> et &lt;code>Histogram Diff&lt;/code>.&lt;/p>
&lt;p>Patience Diff se concentre sur &amp;ldquo;les lignes uniques qui n&amp;rsquo;apparaissent qu&amp;rsquo;une seule fois dans les deux fichiers&amp;rdquo; et trouve leur plus longue sous-séquence commune (Longest Common Subsequence : LCS). Si le nombre d&amp;rsquo;éléments uniques est $U$, le calcul de la LCS peut être résolu avec la complexité suivante :&lt;/p>
$$ \mathcal{O}(U \log U) $$&lt;p>Lorsque vous trouvez qu&amp;rsquo;il est difficile de résoudre un conflit, une solution consiste à utiliser &lt;code>git diff --histogram&lt;/code> ou à spécifier cet algorithme dans la stratégie de fusion (&lt;code>git merge -s recursive -X histogram&lt;/code>).&lt;/p>
&lt;h3 id="33-sha-1-et-probabilité-de-collision">3.3 SHA-1 et probabilité de collision
&lt;/h3>&lt;p>Git gère tous les objets avec des valeurs de hachage SHA-1. La taille de l&amp;rsquo;espace de hachage est de $2^{160}$. En approximant la probabilité d&amp;rsquo;une collision de hachage (le fait que différents contenus aient la même valeur de hachage) à l&amp;rsquo;aide du paradoxe des anniversaires (Birthday Paradox), le nombre d&amp;rsquo;objets $k$ requis pour que la probabilité de collision $p$ atteigne 50 % est le suivant :&lt;/p>
$$ k \approx \sqrt{2 \ln(2)} \cdot 2^{80} \approx 1.2 \times 2^{80} $$&lt;p>Il s&amp;rsquo;agit d&amp;rsquo;un nombre astronomique, et la probabilité qu&amp;rsquo;une collision involontaire se produise dans le développement logiciel normal est pratiquement nulle. Par conséquent, Git fonctionne en faisant confiance à la valeur de hachage comme un &amp;ldquo;ID unique absolu&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="4-étude-de-cas-1--jai-commité-sur-la-mauvaise-branche-">4. Étude de cas 1 : J&amp;rsquo;ai commité sur la mauvaise branche !
&lt;/h2>&lt;p>&lt;strong>【Situation】&lt;/strong>
Sans me rendre compte que je travaillais sur la branche &lt;code>main&lt;/code>, j&amp;rsquo;ai écrit beaucoup de code pour une nouvelle fonctionnalité et, pire encore, j&amp;rsquo;ai même fait un &lt;code>git commit&lt;/code>. J&amp;rsquo;étais censé créer une branche &lt;code>feature/login&lt;/code> et y travailler !&lt;/p>
&lt;h3 id="solution--git-reset-et-création-de-branche">Solution : &lt;code>git reset&lt;/code> et création de branche
&lt;/h3>&lt;p>Dans Git, les commits sont des objets indépendants et les branches ne sont que des pointeurs. Par conséquent, cela peut être résolu instantanément par l&amp;rsquo;opération : &amp;ldquo;créer une nouvelle branche, puis reculer le pointeur de la branche actuelle&amp;rdquo;.&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;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;span class="lnt">9
&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"># 1. Créer une nouvelle branche pointant vers le commit actuel (le commit fait par erreur)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git branch feature/login
&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"># 2. Reculer le pointeur de la branche main au commit précédent (HEAD~1)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># L&amp;#39;utilisation de --keep permet de réinitialiser en toute sécurité tout en conservant les modifications non commitées dans le répertoire de travail.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git reset --keep HEAD~1
&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"># 3. Basculer sur la bonne branche&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git checkout feature/login
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="explication-illustrée--que-sest-il-passé-en-interne-">Explication illustrée : Que s&amp;rsquo;est-il passé en interne ?
&lt;/h3>&lt;p>Visualisons le mouvement du pointeur de branche à ce moment-là à l&amp;rsquo;aide de &lt;code>gitGraph&lt;/code> de Mermaid.&lt;/p>
&lt;pre class="mermaid">
gitGraph
commit id: &amp;#34;Commit initial&amp;#34;
commit id: &amp;#34;Correction de bug&amp;#34;
commit id: &amp;#34;Commit erroné&amp;#34; type: HIGHLIGHT
branch feature/login
checkout feature/login
checkout main
&lt;/pre>
&lt;p>Au début, &lt;code>main&lt;/code> et &lt;code>HEAD&lt;/code> pointaient vers &amp;ldquo;Commit erroné&amp;rdquo;, mais &lt;code>git branch feature/login&lt;/code> y crée un nouveau pointeur. Ensuite, avec &lt;code>git reset&lt;/code>, seul le pointeur &lt;code>main&lt;/code> revient à la position de &amp;ldquo;Correction de bug&amp;rdquo;. Aucun objet n&amp;rsquo;est supprimé.&lt;/p>
&lt;hr>
&lt;h2 id="5-étude-de-cas-2--je-veux-annuler-un-commit-déjà-poussé-">5. Étude de cas 2 : Je veux annuler un commit déjà poussé !
&lt;/h2>&lt;p>&lt;strong>【Situation】&lt;/strong>
Tard dans la nuit, j&amp;rsquo;ai commité du code plein de bugs et je l&amp;rsquo;ai rendu public sur le dépôt distant avec &lt;code>git push origin main&lt;/code>. Je réalise qu&amp;rsquo;il y a un bug majeur et je pâlis.&lt;/p>
&lt;h3 id="solution-1--annuler-lhistoire-avec-git-revert-recommandé--sûr">Solution 1 : Annuler l&amp;rsquo;histoire avec &lt;code>git revert&lt;/code> (Recommandé / Sûr)
&lt;/h3>&lt;p>Dans le développement en équipe, il est strictement interdit d&amp;rsquo;altérer l&amp;rsquo;historique des commits déjà poussés en utilisant &lt;code>git reset&lt;/code> ou similaire. Cela briserait la cohérence avec les dépôts locaux des autres développeurs. La bonne approche est de &lt;strong>&amp;ldquo;créer un nouveau commit inverse qui annule complètement les modifications du commit erroné&amp;rdquo;&lt;/strong>. C&amp;rsquo;est ce que fait &lt;code>git revert&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;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&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"># Créer un commit qui annule le dernier commit&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git revert HEAD
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">[&lt;/span>main 7f3a8b2&lt;span class="o">]&lt;/span> Revert &lt;span class="s2">&amp;#34;Message du commit erroné&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="m">1&lt;/span> file changed, &lt;span class="m">1&lt;/span> insertion&lt;span class="o">(&lt;/span>+&lt;span class="o">)&lt;/span>, &lt;span class="m">10&lt;/span> deletions&lt;span class="o">(&lt;/span>-&lt;span class="o">)&lt;/span>
&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"># Pousser vers le dépôt distant&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;pre class="mermaid">
gitGraph
commit id: &amp;#34;Commit A&amp;#34;
commit id: &amp;#34;Commit B (Erreur)&amp;#34;
commit id: &amp;#34;Revert Commit B&amp;#34; type: REVERSE
&lt;/pre>
&lt;p>L&amp;rsquo;histoire continue d&amp;rsquo;avancer, seul l&amp;rsquo;état du code revient à la normale.&lt;/p>
&lt;h3 id="solution-2--altérer-lhistoire-avec-git-push---force-with-lease">Solution 2 : Altérer l&amp;rsquo;histoire avec &lt;code>git push --force-with-lease&lt;/code>
&lt;/h3>&lt;p>Si vous venez de pousser sur une branche que vous êtes le seul à utiliser, altérer l&amp;rsquo;historique peut être acceptable.&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;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&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éinitialiser le commit localement et corriger&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git reset --hard HEAD~1
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git add .
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git commit -m &lt;span class="s2">&amp;#34;Correct implementation&amp;#34;&lt;/span>
&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"># Écraser de force l&amp;#39;historique distant&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git push origin feature/login --force-with-lease
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;code>--force-with-lease&lt;/code> est un push forcé sécurisé pour éviter d&amp;rsquo;écraser accidentellement le travail de quelqu&amp;rsquo;un d&amp;rsquo;autre.&lt;/p>
&lt;hr>
&lt;h2 id="6-étude-de-cas-3--je-veux-changer-de-branche-en-plein-travail-la-magie-de-stash">6. Étude de cas 3 : Je veux changer de branche en plein travail (La magie de Stash)
&lt;/h2>&lt;p>&lt;strong>【Situation】&lt;/strong>
Je suis en train d&amp;rsquo;implémenter une nouvelle fonctionnalité sur la branche &lt;code>feature/A&lt;/code>, le code source est dans un état intermédiaire qui ne compile même pas encore. Soudain, mon patron me dit : &amp;ldquo;Il y a un bug urgent en production sur la branche &lt;code>main&lt;/code>, corrige-le tout de suite !&amp;rdquo;&lt;/p>
&lt;h3 id="solution--mettre-de-côté-avec-git-stash">Solution : Mettre de côté avec &lt;code>git stash&lt;/code>
&lt;/h3>&lt;p>&lt;code>git stash&lt;/code> est une commande qui met de côté les modifications non commitées dans une zone temporaire.&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;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&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"># 1. Mettre de côté les modifications en cours&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git stash push -m &lt;span class="s2">&amp;#34;WIP: feature A partially implemented&amp;#34;&lt;/span>
&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"># 2. Possibilité de basculer sur la branche main&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git checkout main
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># ... (travail de correction de bug urgent, commit et push) ...&lt;/span>
&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"># 3. Retourner à la branche d&amp;#39;origine une fois le travail terminé&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git checkout feature/A
&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"># 4. Restaurer les modifications mises de côté&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git stash pop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Lors de l&amp;rsquo;exécution de &lt;code>git stash&lt;/code>, Git crée en interne deux objets commit spéciaux et les stocke dans une référence appelée &lt;code>refs/stash&lt;/code>. En d&amp;rsquo;autres termes, un Stash est finalement un &amp;ldquo;commit temporaire sans nom&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="7-étude-de-cas-4--létat-terrifiant-detached-head">7. Étude de cas 4 : L&amp;rsquo;état terrifiant &amp;ldquo;Detached HEAD&amp;rdquo;
&lt;/h2>&lt;p>&lt;strong>【Situation】&lt;/strong>
Je voulais vérifier le code à un moment précis dans le passé et j&amp;rsquo;ai exécuté &lt;code>git checkout 9f8a7b6&lt;/code>. Le message &lt;code>You are in 'detached HEAD' state.&lt;/code> s&amp;rsquo;est affiché. J&amp;rsquo;ai commité tel quel, mais quand j&amp;rsquo;ai changé de branche, le commit a disparu !&lt;/p>
&lt;h3 id="le-mécanisme-du-detached-head">Le mécanisme du Detached HEAD
&lt;/h3>&lt;p>Normalement, &lt;code>HEAD&lt;/code> pointe vers une branche comme &lt;code>refs/heads/main&lt;/code>. Cependant, si vous extrayez directement un commit spécifique, &lt;code>HEAD&lt;/code> pointera directement vers l&amp;rsquo;objet commit. C&amp;rsquo;est ce qu&amp;rsquo;on appelle un &lt;strong>Detached HEAD (HEAD détaché)&lt;/strong>.&lt;/p>
&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&amp;#34;]
C --&amp;gt; D[&amp;#34;Commit D&amp;#34;]
BranchMain[&amp;#34;Branche : main&amp;#34;] --&amp;gt; D
HEAD[&amp;#34;HEAD&amp;#34;] --&amp;gt; B
style HEAD fill:#f9f,stroke:#333,stroke-width:4px
&lt;/pre>
&lt;p>Même si vous empilez les commits dans cet état, aucune branche ne suivra ces nouveaux commits. Au moment où vous passez à une autre branche, les nouveaux commits se perdent.&lt;/p>
&lt;h3 id="solution--sauvegarder-en-tant-que-nouvelle-branche">Solution : Sauvegarder en tant que nouvelle branche
&lt;/h3>&lt;p>Le problème est résolu en créant une nouvelle branche à l&amp;rsquo;endroit où vous vous trouvez actuellement.&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;/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"># Créer une nouvelle branche à la position actuelle de HEAD et basculer dessus&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git checkout -b feature/recovered-work
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="8-étude-de-cas-5--résolution-de-conflits-lors-de-merge-et-rebase">8. Étude de cas 5 : Résolution de conflits lors de Merge et Rebase
&lt;/h2>&lt;p>&lt;strong>【Situation】&lt;/strong>
J&amp;rsquo;ai exécuté &lt;code>git merge&lt;/code> ou &lt;code>git rebase&lt;/code>, et &lt;code>CONFLICT (content)&lt;/code> s&amp;rsquo;est affiché, le processus a été interrompu.&lt;/p>
&lt;h3 id="différence-entre-merge-fusion-et-rebase-rebasage">Différence entre Merge (fusion) et Rebase (rebasage)
&lt;/h3>&lt;ol>
&lt;li>&lt;strong>Merge (fusion)&lt;/strong>
Effectue une fusion à 3 voies (3-way merge) en utilisant le dernier commit de deux branches et leur ancêtre commun, et crée un commit de fusion.&lt;/li>
&lt;li>&lt;strong>Rebase (rebasage)&lt;/strong>
Enregistre temporairement les commits de la branche actuelle et les réapplique à la pointe de la branche cible. L&amp;rsquo;historique devient une ligne droite.&lt;/li>
&lt;/ol>
&lt;pre class="mermaid">
gitGraph
commit id: &amp;#34;M1&amp;#34;
commit id: &amp;#34;M2&amp;#34;
branch feature
checkout feature
commit id: &amp;#34;F1&amp;#34;
commit id: &amp;#34;F2&amp;#34;
checkout main
commit id: &amp;#34;M3&amp;#34;
merge feature
&lt;/pre>
&lt;h3 id="comment-résoudre-un-conflit">Comment résoudre un conflit
&lt;/h3>&lt;p>Les marqueurs suivants sont insérés dans les fichiers où des conflits se sont produits.&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-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/span> &lt;span class="nx">HEAD&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">apiUrl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.production.example.com&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">=======&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">apiUrl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;https://api.staging.example.com&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="o">&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span> &lt;span class="nx">feature&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="k">new&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">api&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>La procédure de résolution est extrêmement simple.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Supprimez les marqueurs et corrigez avec le bon code.&lt;/strong>
&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-javascript" data-lang="javascript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">apiUrl&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">process&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">env&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">NODE_ENV&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="s1">&amp;#39;production&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">?&lt;/span> &lt;span class="s2">&amp;#34;https://api.production.example.com&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;https://api.staging.example.com&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>&lt;strong>Ajoutez le fichier résolu à l&amp;rsquo;index (staging).&lt;/strong>
&lt;code>git add&lt;/code> a pour rôle de &amp;ldquo;dire à Git que le conflit est résolu&amp;rdquo;.
&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 index.js
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>&lt;strong>Terminez le processus.&lt;/strong>
&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"># Dans le cas d&amp;#39;un merge&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git commit -m &lt;span class="s2">&amp;#34;Resolve merge conflict in index.js&amp;#34;&lt;/span>
&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"># Dans le cas d&amp;#39;un rebase&lt;/span>
&lt;/span>&lt;/span>&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 paniquez, vous pouvez toujours annuler avec &lt;code>$ git merge --abort&lt;/code> ou &lt;code>$ git rebase --abort&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="9-étude-de-cas-6--lhistorique-des-commits-est-un-gâchis--git-rebase--i">9. Étude de cas 6 : L&amp;rsquo;historique des commits est un gâchis ! &lt;code>git rebase -i&lt;/code>
&lt;/h2>&lt;p>&lt;strong>【Situation】&lt;/strong>
Un grand nombre de petits commits tels que &amp;ldquo;Correction de typo&amp;rdquo;, &amp;ldquo;Encore une correction&amp;rdquo;, &amp;ldquo;Ajout de tests&amp;rdquo; ont été générés. Si je fusionne dans &lt;code>main&lt;/code> tel quel, l&amp;rsquo;historique sera sale.&lt;/p>
&lt;h3 id="solution--rebase-interactif">Solution : Rebase interactif
&lt;/h3>&lt;p>En utilisant &lt;code>git rebase -i&lt;/code> (interactif), vous pouvez modifier l&amp;rsquo;ordre des commits passés, combiner plusieurs commits en un seul (squash), ou modifier les messages de commit.&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;/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"># Organiser les 3 derniers commits&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git rebase -i HEAD~3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>L&amp;rsquo;éditeur s&amp;rsquo;ouvrira et affichera ceci :&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-text" data-lang="text">&lt;span class="line">&lt;span class="cl">pick 1a2b3c4 Correction de typo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pick 2b3c4d5 Encore une correction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">pick 3c4d5e6 Ajout de tests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Réécrivez-le comme ceci :&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-text" data-lang="text">&lt;span class="line">&lt;span class="cl">pick 1a2b3c4 Implémentation de la fonctionnalité X
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">squash 2b3c4d5 Encore une correction
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">squash 3c4d5e6 Ajout de tests
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Enregistrez et fermez, ces 3 commits seront magnifiquement fusionnés en un seul.&lt;/p>
&lt;hr>
&lt;h2 id="10-étude-de-cas-7--je-ne-sais-pas-quand-le-bug-a-été-introduit--git-bisect">10. Étude de cas 7 : Je ne sais pas quand le bug a été introduit ! &lt;code>git bisect&lt;/code>
&lt;/h2>&lt;p>&lt;strong>【Situation】&lt;/strong>
La branche &lt;code>main&lt;/code> actuelle a un bug, mais tout était normal lors de la version d&amp;rsquo;il y a un mois. Je veux identifier dans quel commit le bug a été introduit, mais il y a plus de 100 commits et c&amp;rsquo;est impossible de le faire manuellement !&lt;/p>
&lt;h3 id="solution--identifier-le-bug-par-recherche-dichotomique">Solution : Identifier le bug par recherche dichotomique
&lt;/h3>&lt;p>Git intègre un outil pour trouver le commit qui a introduit un bug en utilisant la recherche dichotomique (Binary Search) mathématique. La complexité de calcul étant de $\mathcal{O}(\log N)$, même s&amp;rsquo;il y a 1000 commits, vous pouvez l&amp;rsquo;identifier en environ 10 tests.&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;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&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"># Démarrer la recherche&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git bisect start
&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"># Le commit actuel a un bug (bad)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git bisect bad
&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"># Il y a un mois (par exemple le hachage a1b2c3d) c&amp;#39;était normal (good)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git bisect good a1b2c3d
&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"># Git extrait automatiquement un commit intermédiaire, vous exécutez donc le test&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Si le test réussit :&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git bisect good
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Si le test échoue :&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">$ git bisect bad
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>En répétant simplement cela, Git vous dira exactement : &amp;ldquo;Ce commit est le premier commit Bad&amp;rdquo;. Une fois terminé, revenez à l&amp;rsquo;état d&amp;rsquo;origine avec &lt;code>$ git bisect reset&lt;/code>.&lt;/p>
&lt;hr>
&lt;h2 id="11-le-filet-de-sécurité-ultime--git-reflog">11. Le filet de sécurité ultime : &lt;code>git reflog&lt;/code>
&lt;/h2>&lt;p>La technique secrète ultime pour toutes les &amp;ldquo;gaffes&amp;rdquo; sur Git est &lt;code>git reflog&lt;/code>. Git enregistre tout l&amp;rsquo;historique des opérations locales (l&amp;rsquo;historique des déplacements de HEAD) pendant une certaine période. Même si vous supprimez une branche ou effectuez une mauvaise réinitialisation, vous pouvez toujours récupérer en trouvant le hachage passé avec &lt;code>git reflog&lt;/code> et en effectuant un &lt;code>git reset --hard&lt;/code> dessus.&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 reflog
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">9f8a7b6 &lt;span class="o">(&lt;/span>HEAD -&amp;gt; main&lt;span class="o">)&lt;/span> HEAD@&lt;span class="o">{&lt;/span>0&lt;span class="o">}&lt;/span>: commit: Add new feature
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">1a2b3c4 HEAD@&lt;span class="o">{&lt;/span>1&lt;span class="o">}&lt;/span>: reset: moving to HEAD~1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="12-conclusion">12. Conclusion
&lt;/h2>&lt;p>Nous avons expliqué très en détail les erreurs courantes dans lesquelles tombent les débutants sur Git, les mécanismes de Git en arrière-plan et comment les résoudre. Commiter sur la mauvaise branche, annuler un commit déjà poussé, utiliser Stash, survivre à un Detached HEAD et résoudre des conflits. Ce qui est important dans tout cela, c&amp;rsquo;est d&amp;rsquo;imaginer &amp;ldquo;quels objets et pointeurs Git manipule en arrière-plan&amp;rdquo;.&lt;/p>
&lt;p>Les différences de fichiers sont calculées par un algorithme Diff strict représenté par des formules mathématiques, et la cohérence de l&amp;rsquo;historique est garantie par des fonctions de hachage cryptographiques. Si vous comprenez cette belle philosophie de conception, vous devriez réaliser que Git n&amp;rsquo;est en aucun cas une &amp;ldquo;boîte noire mystérieuse&amp;rdquo;, mais le bouclier le plus puissant pour protéger fermement votre code source.&lt;/p>
&lt;p>La prochaine fois que vous penserez &amp;ldquo;J&amp;rsquo;ai gaffé !&amp;rdquo;, ne fermez pas le terminal dans la panique, prenez une grande respiration et tapez &lt;code>git status&lt;/code>. Git vous donnera toujours des indices pour la récupération.&lt;/p></description></item></channel></rss>