Passer au contenu
GitTree

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.

Progression enregistrée dans ce navigateur.

La lecture charge la vidéo depuis YouTube (mode de confidentialité amélioré).

Narration en anglais · English and Arabic légendes

Ouvrez la page vidéoRegarder sur YouTube

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

Extrait de fichier · css
: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

Sortie
# Private release rehearsal

The reviewed draft is still private.

docs/lease-note.md — LEASE_B

Sortie
# Private release rehearsal

Leo added a review that must not be overwritten.

docs/lease-note.md — LEASE_REWRITE

Sortie
# 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).

  1. Construisez la répétition comme le montre la section suivante : le mauvais commit poussé vers shared et la branche lease avec le nouveau commit de Leo sur le serveur.
  2. 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)….
  3. 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, car private/lease suit origin/lease sous 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….
  4. 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.
  5. 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.
  6. 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 :

Command · bash
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é :

Command · bash
git push --force-with-lease=refs/heads/lease:"$EXPECTED_SHA" origin HEAD:lease; echo $?
git ls-remote origin refs/heads/lease
git status --short
Sortie
 ! [rejected]        HEAD -> lease (stale info)
error: failed to push some refs to '../origin.git'
1

Git 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.

  1. Question 1 de 6

    Un mauvais commit est déjà sur la branche partagée. Quelle est la réparation la plus sûre ?

    Choisissez une réponse.

  2. Question 2 de 6

    Lesquelles de ces affirmations sont vraies à propos de --force-with-lease ? (choix multiple)

    Choisissez chaque réponse qui s'applique.

  3. Question 3 de 6
    Obligatoire

    Vous poussez avec le bail épinglé au commit que vous avez examiné, mais Leo a poussé après cela. Ce qui se produit?

    Choisissez une réponse.

  4. Question 4 de 6

    Modifiez l'entrée : vous exécutez git fetch origin lease puis un simple git push --force-with-lease origin HEAD:lease. Ce qui se produit?

    Choisissez une réponse.

  5. Question 5 de 6
    Obligatoire

    Un collègue dit que « la force avec bail rend la poussée forcée sûre pour tout le monde ». Quelle est la bonne réponse ?

    Choisissez une réponse.

  6. Question 6 de 6
    Obligatoire

    Après le push épinglé, quelles relectures montrent que rien n'a été perdu ? (choix multiple)

    Choisissez chaque réponse qui s'applique.

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.

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
  1. Vous avez poussé une erreur. Et maintenant ?
  2. Si d'autres peuvent avoir le commit, réparez-le en ajoutant un commit.
  3. Un bail dit : remplacez la télécommande seulement si c'est toujours là où je l'attends.
  4. Mais une récupération déplace ce qu'est un simple bail attend.
  5. Deux branches sur un serveur local : partagée, et location.
  6. Sur partagé, annulez le mauvais commit.
  7. Poussez normalement. Aucune force.
  8. L'erreur reste dans l'histoire, et personne doit réparer un clone.
  9. En location, une branche réécrite est refusée.
  10. Allez seulement chercher et regardez. L'engagement de Leo est là.
  11. Cela se poursuit uniquement lorsque la télécommande est à ce commit, et conserve l'ancienne astuce.
  12. Le travail de Leo ne vous appartient pas. Rebase dessus, ou demandez-lui.
  13. Dans le terminal, l'ancêtre vérifie partagé est nul.
  14. Nommez le commit que vous avez examiné. Git dit informations obsolètes.
  15. Le serveur nomme toujours le commit de Leo.
  16. Un simple bail après récupération aurait l'a remplacé.
  17. L'annulation n'annule pas une poussée forcée sur un serveur.
  18. Pratique : signaler le code de sortie, le serveur commit et le statut.
  19. Ensuite, travaillez sur deux branches à la fois avec arbres de travail.