Lektion 32 · Erholung
Machen Sie Fehler nach dem Drücken wieder gut
Reparieren Sie einen Fehler, den andere möglicherweise bereits gemacht haben: Bevorzugen Sie ein neues Commit, und wenn Sie einen Zweig, den Sie besitzen, neu schreiben müssen, erzwingen Sie dies mit einem Lease, das genau an den Remote-Tipp angeheftet ist, den Sie überprüft haben.
- Ebene: Fortgeschritten
- 8 Min. gelesen
- 4 Min. Video
- Aktualisiert
- Vor dieser Lektion: Push-Commits und Veröffentlichung eines Branchs, Machen Sie eine Änderung im freigegebenen Verlauf rückgängig, Finden Sie einen verlorenen Commit mit Reflog
In diesem Browser gespeicherter Fortschritt.
Beim Abspielen wird das Video von YouTube geladen (erweiterter Datenschutzmodus).
Englische Erzählung · English and Arabic Bildunterschriften
Öffnen Sie die VideoseiteAuf YouTube ansehenWas Sie lernen werden
- Wählen Sie zwischen einer additiven Reparatur und einer Neufassung eines verschobenen Fehlers.
- Erklären Sie, was ein Leasing überprüft und warum der erwartete Commit wichtig ist.
- Sagen Sie eine Ablehnung eines veralteten Mietvertrags voraus und behalten Sie die Arbeit eines Teamkollegen.
- Wissen Sie, was GitTree behält, bevor es Push-Operationen erzwingt.
Bevor Sie beginnen
Zwei Situationen auf einem lokalen Probeserver. Am shared wurde bereits ein fehlerhafter Commit gepusht und andere haben ihn möglicherweise bereits. Am lease haben Sie einen Entwurf gepusht und ihn dann lokal umgeschrieben, aber Leo hat in der Zwischenzeit einen neueren Commit in denselben Zweig gepusht.
Alles ist lokal und im kostenlosen Plan (GitTree fordert Sie auf, sich anzumelden): kein Hosting-Konto, kein Anbieter, kein Internet. Jede Identität ist fiktiv (example.com). Führen Sie diese Lektion niemals in einem echten Projekt aus.
Nehmen Sie die Änderungen in GitTree oder mit den nativen Git-Befehlen vor, nicht beides in derselben Kopie. Das Ablesen des Ergebnisses ist immer sicher. Die Menübezeichnungen stammen aus den eigenen Strings von GitTree 2.0 und die nativen Befehle wurden mit Git 2.43 in Einwegkopien ausgeführt. Die GitTree-Schritte wurden nicht auf macOS, Windows oder Linux ausgeführt.
Konzept und Zustandswirkungen
Wenn Teamkollegen möglicherweise den fehlerhaften Commit haben, reparieren Sie ihn mit einem neuen Commit (ein Zurücksetzen, Lektion 28) und pushen Sie normal: Der Fehler bleibt im Verlauf erhalten und der Klon von niemandem wird ungültig. Schreiben Sie einen veröffentlichten Zweig nur dann um, wenn Sie dessen Eigentümer sind.
Ein lease macht einen Force-Push bedingt: Git ersetzt den Remote-Zweig nur, wenn er immer noch dorthin zeigt, wo Sie es erwarten. --force-with-lease=<ref>:<commit> benennt den erwarteten Commit. Ein bloßes --force-with-lease verwendet Ihre Remote-Tracking-Referenz, und ein git fetch verschiebt diese Referenz, sodass das Abrufen und anschließende Übertragen möglicherweise überschreibt, was Sie gerade heruntergeladen haben. GitTree pinnen den zuletzt abgerufenen Commit an, zeigen ihn in seinem Dialog an und behalten den ersetzten Tipp unter refs/ogt/trash.
Ein Mietvertrag entscheidet nicht darüber, ob Sie die Arbeit eines Teamkollegen überschreiben dürfen. Es schützt Sie nur davor, etwas zu überschreiben, was Sie nicht gesehen haben.
Bereiten Sie den genauen Projektstand vor
Beginnen Sie mit einer separaten, gewöhnlichen Kopie des Ergebnisses von Lektion 18 mit einem neuen lokalen Bare-Repository als einzigem Remote-Repository. RECOVERY_BAD ist das fehlerhafte Stylesheet; LEASE_A, LEASE_B und LEASE_REWRITE sind die drei Versionen einer Notiz.
Vollständige Dateieingaben
Speichern Sie jede Datei unten genau wie gezeigt: UTF-8, LF-Zeilenenden und eine letzte neue Zeile, ohne die Markdown-Zaunlinien. Nicht aufgeführte Dateien behalten ihren Inhalt von 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.In GitTree
Öffnen Sie die Palette mit Befehl+Umschalt+P (Strg+Umschalt+P bei Ubuntu).
- Erstellen Sie die Probe, wie der nächste Abschnitt zeigt: Der fehlerhafte Commit wird an
sharedgesendet und derlease-Zweig mit Leos neuerem Commit auf dem Server. - Additive repair. Klicken Sie am
sharedmit der rechten Maustaste auf den fehlerhaften Commit, wählen Sie Revert Commit und klicken Sie dann auf Push. Dies ist ein normaler Push; Wählen Sie nicht Force Push (With Lease)…. - Stale lease. Schreiben Sie am
private/leaseden Entwurf lokal neu, sodass der Zweig den gepushten Commit nicht mehr enthält, und versuchen Sie, ihn mit der Symbolleiste zu pushen Push. GitTree fragt zunächst, wohin verschoben werden soll, daprivate/leaseorigin/leaseunter einem anderen Namen verfolgt: Wählen Sie Push to origin/lease. Ein Dialog mit dem Titel „Die Fernbedienung verweigerte Private/Lease“ bietet dann Fetch Only, Rebase and Push, Merge and Push und Force Push… an. - Wählen Sie zuerst Fetch Only und lesen Sie die Grafik: Der Remote-Zweig verfügt jetzt über Leos Commit, das in Ihrer Umschreibung nicht enthalten ist. Das ist die Arbeit eines Teamkollegen.
- Öffnen Sie Force Push…. Der Dialog „Push Private/Lease auf Origin/Lease erzwingen?“ wird angezeigt. besagt, dass Commits, die in Ihrem Zweig fehlen, von der Fernbedienung entfernt werden, dass der Push nur durchgeführt wird, während sich die Fernbedienung noch beim angezeigten Commit befindet, und dass der ersetzte Tipp unter
refs/ogt/trashaufbewahrt wird. Stornieren; Leos Arbeit kann nicht von Ihnen ersetzt werden. - Versöhnen Sie sich stattdessen: Rebase and Push legt Ihren Entwurf auf den von Leo oder fragen Sie ihn zuerst. Wenn ein echter Force-Push ausgeführt wurde, heißt es in der Meldung „Force Push. Die ersetzte Remote-Spitze bleibt bei …“ und Undo behandelt einen Force-Push als eine Änderung an einer Fernbedienung, die Sie erneut drücken, um den Wechsel zurückzusetzen.
Im Terminal
Nach der Wiederherstellung am shared:
git revert --no-edit "$BAD_SHA"
git push origin HEAD:shared
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?Die Antwort lautet 0: Der Fehler bleibt in der Geschichte und niemand war gezwungen, einen Klon zu reparieren.
Testen Sie am private/lease, wenn Leos Commit bereits auf dem Server ist, die angeheftete Lease mit dem von Ihnen überprüften Commit:
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 weigert sich („stale info“), der Server benennt Leos Commit immer noch und der Status ist leer. Ein einfacher git push --force-with-lease origin HEAD:lease wird ebenfalls abgelehnt, solange Ihre Remote-Tracking-Referenz alt ist, aber nach git fetch origin lease ersetzt derselbe Befehl Leos Commit, da der Abruf die Referenz verschoben hat, mit der er vergleicht. Benennen Sie den Commit, den Sie überprüft haben, oder gleichen Sie ihn mit einem Rebase ab.
Ergebnis
Where you end: Das fehlerhafte Commit befindet sich immer noch im Verlauf von shared und ein darüber hinausgehendes Zurücksetzen wurde normal gepusht. Am lease wurde der angeheftete Push abgelehnt, der Server speichert immer noch Leos Commit und Ihr lokales Rewrite ist intakt. Es wurde kein gewaltsamer Druck ausgeübt.
Häufige Fehler
- Einen Zweig neu schreiben, den andere Leute bereits gezogen haben, als ein Zurücksetzen ausreichen würde.
- Abrufen und anschließendes erzwingen des Pushens mit einem Bare-Lease, das nun dem vertraut, was Sie gerade heruntergeladen haben.
- Einen Lease als Erlaubnis behandeln, den Commit eines Teamkollegen zu ersetzen.
- Angenommen, „Rückgängig“ kann einen Force-Push auf dem Server rückgängig machen.
Wenn etwas schief geht
Wenn ein Force-Push den falschen Tipp ersetzt hat, wird der ersetzte Commit unter refs/ogt/trash (und bei nativen Pushs in Ihrem Reflog und dem Klon des Teamkollegen) gespeichert. Sagen Sie es dem Teamkollegen, stellen Sie die Spitze als Zweig wieder her und pushen Sie sie mit Ihrer Zustimmung erneut. Ein abgelehnter Vorstoß änderte nichts.
Überprüfen Sie Ihr Verständnis
Beantworten Sie jede Frage und lesen Sie dann, warum. Mit „erforderlich“ gekennzeichnete Fragen zählen zum Abschluss der Lektion.
0 von 6 korrekt
Beantworten Sie die erforderlichen Fragen richtig, um die Lektion abzuschließen.
In diesem Browser überprüft.
Üben
Melden Sie die Ancestor-Prüfung für shared, den Exit-Code und die Nachricht des angehefteten Pushs, die Commit-Anzeigen ls-remote für lease und ob ein Bare-Lease vor und nach einem Abruf abgelehnt worden wäre.
Ihre eigene Bestätigung: Die Website kann Ihren Computer nicht sehen.
Um die Lektion abzuschließen, beantworten Sie die erforderlichen Fragen richtig und bestätigen Sie die praktische Übung.
Zusammenfassung
- Bevorzugen Sie ein neues Commit für alles, was andere möglicherweise haben.
- Hängen Sie den Mietvertrag an den Commit an, den Sie überprüft haben.
- Ein Mietvertrag schützt Sie, nicht die Absichten Ihres Teamkollegen.
Verwandt
Glossarbegriffe eingeführt
Miete – قفل; veraltete Informationen – معلومات قديمة; ersetzte Spitze – الرأس المستبدَل.
Videotranskript
Die Erzählung des Videos, Stichwort für Stichwort.
Zeigen Sie das Transkript
- Du hast einen Fehler gemacht. Was nun?
- Wenn andere das Commit haben, reparieren Sie es durch Hinzufügen eines Commits.
- In einem Mietvertrag steht: Ersetzen Sie die Fernbedienung nur, wenn Es ist immer noch dort, wo ich es erwartet habe.
- Aber ein Abruf bewegt, was für ein bloßer Mietvertrag erwartet.
- Zwei Zweige auf einem lokalen Server: gemeinsam genutzt, und verpachten.
- Bei Shared den fehlerhaften Commit zurücksetzen.
- Normal drücken. Keine Kraft.
- Der Fehler bleibt in der Geschichte und niemandem muss einen Klon reparieren.
- Bei Mietvertrag wird ein umgeschriebener Zweig verweigert.
- Nur holen und schauen. Leos Engagement ist dort.
- Dies geschieht nur, solange die Fernbedienung eingeschaltet ist dieses Commit und behält den alten Tipp.
- Leos Arbeit kann nicht von Ihnen ersetzt werden. Rebase darauf, oder fragen Sie ihn.
- Im Terminal erfolgt die Ahnenprüfung geteilt ist Null.
- Benennen Sie das Commit, das Sie überprüft haben. Git sagt veraltete Informationen.
- Der Server benennt immer noch Leos Commit.
- Ein bloßer Mietvertrag nach einem Abruf wäre gewesen ersetzte es.
- Durch das Rückgängigmachen wird ein Kraftstoß auf a nicht rückgängig gemacht Server.
- Übung: Melden Sie den Exit-Code dem Server Commit und den Status.
- Als nächstes bearbeiten Sie zwei Zweige gleichzeitig mit Arbeitsbäume.