Leçon 24 · Récupération
Continuer, ignorer ou abandonner une opération active
Lorsqu'une fusion ou un rebase s'arrête, vous avez trois solutions : continuer, ignorer ou abandonner. Découvrez lequel convient, ce que chacun jette et comment vérifier le référentiel par la suite.
- Niveau: Intermédiaire
- 14 minutes de lecture
- 7 minutes de vidéo
- Mis à jour
- Avant cette leçon: Résoudre les conflits de fusion et de rebase
Progression enregistrée dans ce navigateur.
La lecture charge la vidéo depuis YouTube (mode de confidentialité amélioré).
Ce que vous apprendrez
- Dites quelle opération est active avant de toucher quoi que ce soit.
- Continuez seulement une fois que chaque conflit est résolu et marqué.
- Expliquez ce que Skip laisse de côté et quand il s'agit du mauvais outil.
- Abandonnez une opération et vérifiez que vous êtes de retour au début.
Avant de commencer
Vous utilisez la divergence de la leçon 23 : conflict/sara (le titre de Sara "Examiner les modifications en toute confiance.") et conflict/omar (le titre d'Omar "Comprendre chaque modification enregistrée."), tous deux issus du commit M. Faites-en trois copies propres, nommées gittree-continue, gittree-abort et gittree-skip. Dans chacun, conflict/sara est extrait et rien ne fonctionne. Vous arrêterez la même opération dans les trois et quitterez chacun d’une manière différente.
Tout est local et sur le forfait gratuit (GitTree vous demande de vous connecter) : pas de compte d'hébergement, pas de fournisseur, pas d'Internet. Chaque identité est fictive (exemple.com). N'exécutez jamais cette leçon dans un projet réel.
Apportez les modifications dans GitTree ou avec les commandes Git natives, pas les deux dans la même copie. La lecture du résultat est toujours sûre. Les étiquettes de menu proviennent des propres chaînes de GitTree 2.0 et les commandes natives ont été exécutées avec Git 2.43 dans des copies jetables. Les étapes GitTree n'ont pas été exécutées le macOS, Windows ou Linux.
Effets de concept et d'état
Une opération arrêtée est un état en soi. Jusqu'à la fin, le référentiel se souvient de ce qu'il faisait et vous ne devez pas lancer une autre fusion ou un rebase par-dessus. Découvrez d’abord ce qui est actif. La bannière de GitTree le dit clairement : "Fusionner… en…", ou "Rebaser… en…" (avec le numéro de l'étape lorsqu'il y en a plusieurs), et le nombre de conflits restants. Dans un terminal, git status commence par "Vous avez des chemins non fusionnés" et un indice pour une fusion, ou "rebasement interactif en cours ; sur…" pour un rebasement, puis répertorie les commandes que vous pouvez utiliser.
Continue continue une fois que chaque conflit est résolu et que son résultat est mis en scène. Il ne s'agit pas d'une nouvelle tentative de fusion ou de rebase d'origine : cela termine la validation de fusion ou déplace un rebase vers sa prochaine validation.
Skip existe pour les opérations qui rejouent les commits, comme un rebase. Cela laisse entièrement la modification du commit actuel hors du résultat. Dans cette leçon, Skip supprime le titre de Sara et la branche se termine sur le commit d'Omar. Ce n'est pas une façon d'"accepter le dossier" ou de reporter un conflit, et ce n'est pas le bon outil chaque fois que vous souhaitez encore ce changement. Une fusion n'a pas de saut, car une fusion est une étape : soit vous la terminez, soit vous l'abandonnez.
Abort revient à l'endroit où l'opération a commencé. Tout ce que vous avez résolu jusqu'à présent est abandonné. GitTree enregistre un instantané de récupération de ce qu'il supprime en premier, et le référentiel revient à la validation, à l'index et aux fichiers exacts qu'il avait auparavant. C'est la solution lorsque vous n'êtes pas sûr de ce que vous faites.
| Choix | Le résultat | Ce que ça coûte |
|---|---|---|
| Continuer | Fusionner le commit effectué ou le prochain commit rejoué | rien, une fois que tout est résolu |
| Sauter | La modification du commit actuel est laissée de côté | ce changement, jusqu'à ce que tu le retrouves |
| Abandonner | Le référentiel est de retour au début | le travail effectué lors de l'opération |
Préparer l’état exact du projet
Construisez les branches de Sara et d'Omar une fois, puis faites-en trois copies. Commencez à partir d'une copie ordinaire distincte du projet telle que la leçon 18 l'a laissé et laissez votre gittree-features original intact. Les versions de la page : MERGED est la base partagée, SARA et OMAR sont les versions concurrentes et RESOLU est le résultat que vous enregistrez dans la copie continue.
Entrées de fichiers complètes
Enregistrez uniquement à la phase nommée ci-dessous. Ce sont des corps UTF-8/LF complets avec une nouvelle ligne finale ; ne collez jamais les clôtures Markdown. Les fichiers exécutables inchangés héritent de l'entrée nommée. Les versions dans des variantes distinctes ne doivent pas écraser l'original.
index.html — FUSIONNÉ
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">See your work clearly.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>index.html — LEP
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Review changes with confidence.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>index.html — OMAR
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Understand each saved change.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>index.html — RÉSOLU
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>GitTree Features — course demo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<header class="site-header">
<a href="#main">GitTree Features</a>
</header>
<main id="main" tabindex="-1">
<section class="hero" aria-labelledby="hero-title">
<p class="eyebrow">GitTree Learn demo project</p>
<h1 id="hero-title">Review each change with confidence.</h1>
<p id="hero-copy">Choose one change, then check what Git saved.</p>
</section>
<section class="features" aria-labelledby="features-title">
<h2 id="features-title">Follow your work</h2>
<div class="cards">
<article class="feature-card">
<h3>History</h3>
<p>Read commits and branches together.</p>
</article>
<article class="feature-card">
<h3>Changes</h3>
<p>Review the exact content selected for a commit.</p>
</article>
<article class="feature-card">
<h3>Recovery</h3>
<p>Inspect the scope of a recovery point before using it.</p>
</article>
</div>
</section>
<section aria-labelledby="plans-title">
<h2 id="plans-title">Choose the workflow you need</h2>
<div class="cards">
<article class="feature-card">
<h3>Local Git</h3>
<p>Local Git workflows work without signing in.</p>
</article>
<article class="feature-card">
<h3>Connected workflows</h3>
<p>Provider integrations and Nour require Pro or an applicable trial.</p>
</article>
</div>
</section>
</main>
<footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
<script type="module" src="site.js"></script>
</body>
</html>Dans GitTree
Ouvrez la palette avec Commande+Maj+P (Ctrl+Maj+P sur Ubuntu). Les actions sur une branche nommée utilisent le menu contextuel de cette branche.
- Construisez les trois copies comme le montre la section suivante. Dans chacun,
conflict/saraest extrait et le statut est vide. Notez l'ID complet deconflict/saradans la copie d'abandon. - Continue copy. Ouvrez gittree-continue. Faites un clic droit sur
conflict/omaret choisissez Merge conflict/omar into conflict/sara, avec Always a merge commit. Ça s'arrête. Sur la bannière, choisissez Resolve, ouvrezindex.html, choisissez Edit Output, écrivezReview each change with confidence.et choisissez Save and Mark Resolved. - Vérifiez qu'il ne reste aucun conflit, puis choisissez une fois Continue sur la bannière. L'avis indique "Terminé". et la bannière s'en va. Le nouveau commit a deux parents.
- Abort copy. Ouvrez gittree-abort et lancez la même fusion. Laissez le conflit non résolu. Sur la bannière, choisissez Abort…. La boîte de dialogue « Abandonner l'opération ? » explique que la branche, l'index et les fichiers reviennent à ce qu'ils étaient et que ce qui est supprimé est d'abord conservé dans les instantanés de récupération. Choisissez Abort. L'avis indique "Avorté. La modification supprimée est conservée sous refs/ogt/trash/… ; Annuler la ramène." (lorsque l'abandon ne laisse rien tomber, il est indiqué "Avorté. Le référentiel est de retour là où il était auparavant.")
- Vérifiez l'abandon :
conflict/saraest toujours l'ID que vous avez noté, la page est le titre complet de Sara et il n'y a pas de bannière. - Skip copy. Ouvrez gittree-skip. Cliquez avec le bouton droit sur
conflict/omaret choisissez Rebase conflict/sara onto conflict/omar. Laissez les options désactivées et choisissez Rebase conflict/sara. Ça s'arrête. La bannière propose désormais Skip à côté de Continue et Abort… ; la bannière de fusion n'avait pas de saut. - Lisez quel commit est en cours de relecture (celui de Sara), acceptez que sauter laisse de côté son en-tête et choisissez Skip une fois. L'avis indique "Étape sautée".
- Vérifiez le saut : la page affiche le titre d'Omar,
conflict/sarapointe désormais vers le commit d'Omar et aucune bannière ne s'affiche. Comparez les trois résultats et séparez-les.
Pour chaque commit ordinaire du cours : Summary est le sujet indiqué, Description est vide et les options Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit et Allow Empty Commit restent désactivées.
Dans la borne
Dans une copie propre séparée du résultat de la leçon 18 :
git switch --create conflict/sara
BASE_SHA="$(git rev-parse HEAD)"Enregistrez SARA sous index.html, puis :
git add -- index.html
git -c user.name="Sara Lindqvist" -c user.email=sara@example.com commit --quiet -m "feat: Sara clarifies the hero"
git switch --quiet --create conflict/omar "$BASE_SHA"Enregistrez OMAR sous index.html, puis :
git add -- index.html
git -c user.name="Omar Haddad" -c user.email=omar@example.com commit --quiet -m "feat: Omar explains the hero"
git switch --quiet conflict/saraFaites trois copies vierges de cet état (gittree-continue, gittree-abort, gittree-skip). Tout d’abord, vérifiez ce qui est actif en cas de doute :
git statusContinue copy. La fusion s'arrête avec le code de sortie 1. Enregistrez RÉSOLU sous index.html, puis :
git merge --no-ff --no-edit conflict/omar
git add -- index.html
git -c core.editor=true merge --continue
git ls-files --unmerged
git status --shortLes deux dernières commandes n'impriment rien. Abort copy:
git rev-parse conflict/sara
git merge --no-edit conflict/omar
git merge --abort
git rev-parse HEAD conflict/sara
git status --shortLa fusion s'arrête et git merge --abort y met fin. Les deux identifiants imprimés par git rev-parse HEAD conflict/sara sont égaux, index.html est la page complète de Sara et le statut est vide. Un rebase arrêté est laissé de la même manière avec git rebase --abort. Skip copy:
git rebase conflict/omar
git rebase --skip
git rev-parse HEAD conflict/omar
git status --shortLe rebase s'arrête ; git rebase --skip le termine avec "Rebasé avec succès". Les deux identifiants sont égaux, donc la branche de Sara se trouve désormais sur le commit d'Omar, la page est celle d'Omar et le statut est vide. Le commit ignoré de Sara n'est plus sur la branche, mais Git l'a encore depuis un moment (le reflog, leçon 29). Ne lisez pas ce résultat comme une résolution conservant les deux entrées.
Résultat
Where you end: trois exemplaires, trois résultats différents. La copie continue comporte une validation de fusion à deux parents avec l'en-tête combiné. La copie abandonnée est exactement là où elle a commencé, avec le titre de Sara. La copie sautée contient le titre d'Omar et la branche de Sara sur le commit d'Omar. Dans les trois cas, l’opération est terminée et le statut est propre.
Erreurs courantes
- Utiliser Skip pour « dépasser » un conflit. Il supprime la modification de ce commit du résultat.
- Démarrer une autre fusion ou rebase alors que l’une est encore arrêtée.
- Utiliser
git reset --hardpour vous échapper, au lieu degit merge --abortougit rebase --abort. - Abandonner lorsque vous êtes à un clic de terminer, ou continuer lorsque vous n'êtes pas sûr de ce qui est mis en scène.
Si quelque chose ne va pas
Si vous êtes perdu, lisez d'abord la bannière ou git status et décidez à nouveau. L'abandon est toujours le moyen sûr de revenir au début. Si vous avez sauté par erreur, ne recommencez pas aveuglément : le commit sauté est encore accessible pendant un certain temps depuis le reflog (leçon 29), et la leçon 30 montre ce que l'annulation de GitTree peut remettre en place.
Vérifiez votre compréhension
Répondez à chaque question, puis lisez pourquoi. Les questions marquées « Obligatoire » comptent pour terminer la leçon.
0 sur 6 corrects
Répondez correctement aux questions requises pour terminer la leçon.
Vérifié dans ce navigateur.
Pratique
Dans chaque copie, indiquez l'opération, le choix et la preuve : pour Continuer les deux parents et la liste vide non fusionnée, pour Abandonner les ID égaux et la page de Sara, pour Sauter la page d'Omar et la branche sur son commit. Prédisez ensuite pourquoi Skip n'est pas proposé pour une fusion.
Votre propre confirmation : le site ne peut pas voir votre ordinateur.
Pour terminer la leçon, répondez correctement aux questions demandées et confirmez l'exercice pratique.
Récapitulatif
- Découvrez ce qui est actif avant d’agir.
- Continuez après la résolution, sautez uniquement pour laisser un commit de côté, abandonnez pour revenir en arrière.
- Vérifiez ensuite le commit, les fichiers et le statut.
En rapport
Termes du glossaire introduits
Continuer — متابعة; sauter — تخطّي; abandonner — إيقاف; opération — عملية.
Transcription vidéo
La narration de la vidéo, repère par repère.
Afficher la transcription
- Une fusion ou un rebase s'arrête. Tu en as trois des issues.
- Continuer le termine. Sauter en laisse un s'engager. L'abandon revient.
- Tout d’abord, recherchez toujours quelle opération est actif.
- La bannière le nomme. Dans un terminal, git le statut le fait.
- Construisez les succursales de Sara et d'Omar, et trois exemplaires identiques.
- Même début, trois fins différentes.
- Copiez-en un : nous continuons. Commencez la fusion, et ça s'arrête.
- Résolvez, ouvrez le fichier et écrivez le rubrique combinée.
- Enregistrez et marquez comme résolu, pour que Git voie le fichier comme fait.
- Continuer est disponible dès maintenant. Choisissez-le une fois.
- Fait. Le nouveau commit a deux parents, et la bannière a disparu.
- Copie deux : nous avortons. Commencez la même fusion.
- Laissez le conflit tranquille et choisissez Abandonner.
- La boîte de dialogue explique ce qui revient et ce qui est conservé en premier.
- Le dépôt est de retour là où il était avant.
- L'extrémité de la branche porte le même identifiant et le la page est à nouveau celle de Sara.
- Copie trois : on saute. Celui-ci est un rebase.
- Rebasez la branche de Sara sur celle d'Omar. Ça s'arrête avec un conflit.
- La bannière comporte désormais un bouton Ignorer. Une fusion je n’en ai jamais eu.
- Skip laisse le commit de Sara en dehors du résultat. Dites-le à voix haute.
- Choisissez Sauter une fois.
- La page montre le titre d'Omar. celle de Sara La branche se trouve maintenant sur son commit.
- Ignorer n'est pas une résolution. Il a supprimé Le changement de Sara par rapport à ce résultat.
- Dans le terminal, git status montre ce qui est actif et les commandes.
- La fusion : ajoutez le fichier résolu, puis git la fusion continue.
- L'abandon : la pointe de la branche est la même avant et après.
- Le skip : git rebase skip et la branche siège sur le commit d'Omar.
- Dans chaque copie, le statut est vide et rien n'est laissé sans fusion.
- Changer l'entrée : résoudre le fichier, puis choisissez plutôt Abandonner.
- Votre résolution est abandonnée, après un l'instantané de récupération est enregistré.
- N'utilisez jamais la réinitialisation difficile pour vous échapper. Abandonner est la sortie sûre.
- Si vous avez sauté par erreur, le commit est toujours dans le reflog.
- Pratique : nommer l'opération, le choix, et la preuve, pour chaque exemplaire.
- Ensuite, copiez un seul commit sur un autre branche avec un pic-cerise.