Leçon 32 · Récupération
Récupérer les erreurs après avoir poussé
Réparez une erreur que d'autres ont peut-être déjà commise : préférez un nouveau commit, et lorsque vous devez réécrire une branche que vous possédez, forcez avec un bail épinglé à la pointe distante exacte que vous avez examinée.
- Niveau: Avancé
- 9 minutes de lecture
- 4 minutes de vidéo
- Mis à jour
- Avant cette leçon: Pousser les commits et publier une branche, Annuler une modification dans l'historique partagé, Trouver un commit perdu avec reflog
Progression enregistrée dans ce navigateur.
La lecture charge la vidéo depuis YouTube (mode de confidentialité amélioré).
Ce que vous apprendrez
- Choisissez entre une réparation additive et une réécriture pour une erreur poussée.
- Expliquez ce qu'un bail vérifie et pourquoi l'engagement attendu est important.
- Prévoyez un refus de bail périmé et conservez le travail d'un coéquipier.
- Sachez ce que GitTree conserve avant de forcer la poussée.
Avant de commencer
Deux situations sur un serveur de répétition local. Le shared, un mauvais commit a déjà été poussé et d'autres peuvent l'avoir. Le lease, vous avez poussé un brouillon puis l'avez réécrit localement, mais Leo a entre-temps poussé un commit plus récent vers la même branche.
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
Si des coéquipiers peuvent avoir le mauvais commit, réparez-le avec un nouveau commit (un revert, leçon 28) et poussez normalement : l'historique conserve l'erreur et le clone de personne n'est invalidé. Réécrivez une branche publiée uniquement lorsque vous en êtes propriétaire.
Un lease rend une poussée forcée conditionnelle : Git remplace la branche distante uniquement si elle pointe toujours là où vous l'attendez. --force-with-lease=<ref>:<commit> nomme le commit attendu. Un simple --force-with-lease utilise votre référence de suivi à distance, et un git fetch déplace cette référence, donc la récupération puis la poussée peuvent écraser ce que vous venez de télécharger. GitTree épingle le dernier commit récupéré, l'affiche dans sa boîte de dialogue et conserve l'astuce remplacée sous refs/ogt/trash.
Un bail ne décide pas si vous pouvez écraser le travail d'un coéquipier. Cela vous protège uniquement contre l’écrasement de quelque chose que vous n’avez pas vu.
Préparer l’état exact du projet
Commencez à partir d'une copie ordinaire distincte du résultat de la leçon 18 avec un nouveau référentiel nu local comme seul référentiel distant. RECOVERY_BAD est la mauvaise feuille de style ; LEASE_A, LEASE_B et LEASE_REWRITE sont les trois versions d'une note.
Entrées de fichiers complètes
Enregistrez chaque fichier ci-dessous exactement comme indiqué : UTF-8, fins de ligne LF et une nouvelle ligne finale, sans les lignes de clôture Markdown. Les fichiers non répertoriés conservent leur contenu de M.
styles.css — RECOVERY_BAD
:root {
color-scheme: light;
--page: #f7f8fa;
--surface: #ffffff;
--text: #f7f8fa;
--link: #154ab5;
--line: #bac4d0;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--page);
color: var(--text);
font: 1rem/1.6 system-ui, sans-serif;
}
a {
color: var(--link);
}
.site-header,
main,
footer {
width: min(68rem, 100% - 2rem);
margin-inline: auto;
}
.site-header {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 1rem;
padding-block: 1rem;
}
.hero {
max-width: 48rem;
padding-block: 3rem;
}
h1 {
font-size: clamp(2rem, 5vw, 3.5rem);
line-height: 1.2;
}
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
gap: 1rem;
}
.feature-card {
padding: 1rem;
border: 1px solid var(--line);
border-radius: 0.75rem;
background: var(--surface);
}
section {
margin-block-end: 2rem;
}
button,
input {
font: inherit;
}
button,
input {
padding: 0.5rem 0.75rem;
}
:focus-visible {
outline: 3px solid var(--link);
outline-offset: 3px;
}
form {
display: grid;
max-width: 28rem;
gap: 0.5rem;
}docs/lease-note.md — LEASE_A
# Private release rehearsal
The reviewed draft is still private.docs/lease-note.md — LEASE_B
# Private release rehearsal
Leo added a review that must not be overwritten.docs/lease-note.md — LEASE_REWRITE
# Private release rehearsal
This alternative draft has not seen Leo's review.Dans GitTree
Ouvrez la palette avec Commande+Maj+P (Ctrl+Maj+P sur Ubuntu).
- Construisez la répétition comme le montre la section suivante : le mauvais commit poussé vers
sharedet la brancheleaseavec le nouveau commit de Leo sur le serveur. - Additive repair. Sur
shared, cliquez avec le bouton droit sur le mauvais commit et choisissez Revert Commit, puis cliquez sur Push. Il s'agit d'une poussée normale ; ne choisissez pas Force Push (With Lease)…. - Stale lease. Sur
private/lease, réécrivez le brouillon localement afin que la branche ne contienne plus le commit poussé, et essayez de le pousser avec la barre d'outils Push. GitTree demande d'abord où pousser, carprivate/leasesuitorigin/leasesous un autre nom : choisissez Push to origin/lease. Une boîte de dialogue intitulée "La télécommande refusée/location" propose alors Fetch Only, Rebase and Push, Merge and Push et Force Push…. - Choisissez d'abord Fetch Only et lisez le graphique : la branche distante a désormais le commit de Leo, que votre réécriture ne contient pas. C'est le travail d'un coéquipier.
- Ouvrez Force Push…. La boîte de dialogue « Forcer le transfert privé/bail vers l'origine/le bail ? dit que les validations manquantes dans votre branche seront supprimées de la télécommande, que la poussée se poursuivra uniquement tant que la télécommande est toujours à la validation affichée et que la pointe remplacée est conservée sous
refs/ogt/trash. Annuler; Le travail de Leo ne vous appartient pas. - Réconciliez-vous plutôt : Rebase and Push place votre brouillon au-dessus de celui de Leo, ou demandez-lui d'abord. Si une véritable poussée forcée s'est produite, l'avis indique "Force poussée. La pointe de la télécommande remplacée est maintenue à…", et Undo traite une poussée forcée comme un changement vers une télécommande que vous appuyez à nouveau pour revenir en arrière.
Dans la borne
Après le retour, le shared :
git revert --no-edit "$BAD_SHA"
git push origin HEAD:shared
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?La réponse est 0 : l'erreur reste dans l'historique et personne n'a été obligé de réparer un clone.
Le private/lease, avec le commit de Leo déjà sur le serveur, testez le bail épinglé avec le commit que vous avez examiné :
git push --force-with-lease=refs/heads/lease:"$EXPECTED_SHA" origin HEAD:lease; echo $?
git ls-remote origin refs/heads/lease
git status --short ! [rejected] HEAD -> lease (stale info)
error: failed to push some refs to '../origin.git'
1Git refuse ("informations périmées"), le serveur nomme toujours le commit de Leo et le statut est vide. Un simple git push --force-with-lease origin HEAD:lease est également refusé tant que votre référence de suivi à distance est ancienne, mais après git fetch origin lease, la même commande remplace le commit de Leo, car la récupération a déplacé la référence avec laquelle elle se compare. Nommez le commit que vous avez examiné ou effectuez un rapprochement avec un rebase.
Résultat
Where you end: le mauvais commit est toujours dans l'historique de shared et un retour dessus a été poussé normalement. Le lease, le push épinglé a été refusé, le serveur contient toujours le commit de Leo et votre réécriture locale est intacte. Aucune poussée forcée n’a été effectuée.
Erreurs courantes
- Réécrire une branche que d'autres personnes ont déjà tirée alors qu'un retour ferait l'affaire.
- Récupérer puis forcer la poussée avec un simple bail, qui fait désormais confiance à ce que vous venez de télécharger.
- Traiter un bail comme une autorisation de remplacer le commit d'un coéquipier.
- En supposant qu'Undo puisse inverser une poussée forcée sur le serveur.
Si quelque chose ne va pas
Si un push forcé a remplacé le mauvais conseil, le commit remplacé est conservé sous refs/ogt/trash (et, pour les push natifs, dans votre reflog et le clone du coéquipier). Prévenez le coéquipier, remettez la pointe en branche et poussez-la à nouveau avec votre accord. Une poussée refusée n’a rien changé.
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
Signalez la vérification de l'ancêtre sur shared, le code de sortie et le message du push épinglé, le commit ls-remote s'affiche pour lease et si un bail nu aurait été refusé avant et après une récupération.
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
- Préférez un nouveau commit pour tout ce que d’autres pourraient avoir.
- Épinglez le bail au commit que vous avez examiné.
- Un bail vous protège, pas l'intention de votre coéquipier.
En rapport
Termes du glossaire introduits
Bail — قفل; informations obsolètes — معلومات قديمة; pointe remplacée — الرأس المستبدَل.
Transcription vidéo
La narration de la vidéo, repère par repère.
Afficher la transcription
- Vous avez poussé une erreur. Et maintenant ?
- Si d'autres peuvent avoir le commit, réparez-le en ajoutant un commit.
- Un bail dit : remplacez la télécommande seulement si c'est toujours là où je l'attends.
- Mais une récupération déplace ce qu'est un simple bail attend.
- Deux branches sur un serveur local : partagée, et location.
- Sur partagé, annulez le mauvais commit.
- Poussez normalement. Aucune force.
- L'erreur reste dans l'histoire, et personne doit réparer un clone.
- En location, une branche réécrite est refusée.
- Allez seulement chercher et regardez. L'engagement de Leo est là.
- Cela se poursuit uniquement lorsque la télécommande est à ce commit, et conserve l'ancienne astuce.
- Le travail de Leo ne vous appartient pas. Rebase dessus, ou demandez-lui.
- Dans le terminal, l'ancêtre vérifie partagé est nul.
- Nommez le commit que vous avez examiné. Git dit informations obsolètes.
- Le serveur nomme toujours le commit de Leo.
- Un simple bail après récupération aurait l'a remplacé.
- L'annulation n'annule pas une poussée forcée sur un serveur.
- Pratique : signaler le code de sortie, le serveur commit et le statut.
- Ensuite, travaillez sur deux branches à la fois avec arbres de travail.