Zum Inhalt springen
GitTree

Lektion 28 · Erholung

Machen Sie eine Änderung im freigegebenen Verlauf rückgängig

Machen Sie eine fehlerhafte Änderung, die andere bereits vorgenommen haben, rückgängig, indem Sie einen neuen Commit hinzufügen, der sie abbricht, anstatt den Verlauf zu löschen, und veröffentlichen Sie den Fix mit einem normalen Push.

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 ansehen

Was Sie lernen werden

  • Erklären Sie „Revert“ als inverses Commit und warum es zur Geschichte anderer passt.
  • Sagen Sie das übergeordnete Element des neuen Commits und die Datei, die es hinterlässt, voraus.
  • Behandeln Sie ein Zurücksetzen, bei dem ein Konflikt auftritt, und erfahren Sie, warum beim Zurücksetzen einer Zusammenführung ein übergeordnetes Element erforderlich ist.
  • Veröffentlichen Sie den Fix ohne Gewalt.

Bevor Sie beginnen

Sie befinden sich auf shared/dark-regression, einem Zweig aus dem Ergebnis M von Lektion 18. Sein letztes Commit, „Stil: Einführung der Rehearsal-Kontrastregression“, fügt eine Regel zu styles.css, body { color: #f7f8fa; } hinzu, die dem Seitentext die gleiche blasse Farbe wie den Hintergrund verleiht. Dieser Commit befindet sich bereits auf einem lokalen Server, den Sie für diese Lektion eingerichtet haben, sodass möglicherweise ein Teamkollege ihn hat. Sie möchten, dass der Text wieder lesbar ist, ohne etwas neu zu schreiben, was andere bereits haben.

Alles ist lokal und im kostenlosen Plan (GitTree fordert Sie auf, sich anzumelden): kein Hosting-Konto, kein Anbieter, kein Internet. Der Server ist ein lokales Bare-Repository, nicht GitHub. 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

Revert prüft, was ein Commit geändert hat, und fügt ein new commit hinzu, das die gegenteilige Änderung anwendet. Der fehlerhafte Commit bleibt im Verlauf, ebenso wie der Beweis, dass er stattgefunden hat. Reset bewirkt das Gegenteil: Es verschiebt den Zweig zurück und lässt den Commit weg, was für die Arbeit, die nur Sie haben, in Ordnung ist, aber es zwingt jeden, der bereits den Commit hat, dazu, seine Kopie zu reparieren.

Hier ist das übergeordnete Element des neuen Commits der fehlerhafte Commit, und die Datei bleibt genau so, wie sie vorher war. Der Zweig bewegt sich um einen Commit vorwärts und der Server akzeptiert ihn mit einem gewöhnlichen Push, da er nur zu dem hinzufügt, was bereits vorhanden ist.

Eine umgekehrte Änderung hängt von der Umgebung ab. Wenn jemand nach dem fehlerhaften Commit dieselben Zeilen geändert hat, stoppt das Zurücksetzen mit einem Konflikt und Sie lösen ihn wie jeden anderen (Lektion 23) oder brechen ab. Beim Zurücksetzen eines merge-Commits werden Sie aufgefordert, auszuwählen, an welchem ​​übergeordneten Element die Änderung gemessen werden soll: normalerweise das erste, mit dem der Zweig zusammengeführt wurde. Durch das Rückgängigmachen einer Zusammenführung wird Git auch mitgeteilt, dass die Änderungen verarbeitet wurden, sodass bei einer späteren Zusammenführung desselben Zweigs möglicherweise nichts zum Zusammenführen gemeldet wird. Diese Lektion macht einen gewöhnlichen Commit rückgängig und zeigt nur diesen Dialog.

Nur der aktuelle Zweig erhält ein Commit. Nichts anderes bewegt sich, bis Sie drücken.

Bereiten Sie den genauen Projektstand vor

Beginnen Sie mit einer separaten gewöhnlichen Kopie des Ergebnisses M aus Lektion 18 und lassen Sie Ihr Original unberührt. Erstellen Sie den Zweig, speichern Sie DOC_DARK_BAD über styles.css und übergeben Sie ihn, erstellen Sie ein neues leeres Bare-Repository neben der Kopie, fügen Sie es als Remote mit dem Namen rehearsal hinzu und übertragen Sie den Zweig mit seinem Upstream. CSS_RESTORED ist, wie die Datei nach der Wiederherstellung aussehen muss.

Vollständige Dateieingaben

Speichern Sie nur in der unten genannten Phase. Dabei handelt es sich um vollständige UTF-8/LF-Körper mit einem abschließenden Zeilenumbruch; Fügen Sie niemals Markdown-Zäune ein. Unveränderte ausführbare Dateien erben die benannte Eingabe. Versionen in separaten Varianten dürfen das Original nicht überschreiben.

style.css – DOC_DARK_BAD

Aktenauszug · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --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;
}

body { color: #f7f8fa; }

style.css – CSS_RESTORED

Aktenauszug · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --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;
}

In GitTree

Öffnen Sie die Palette mit Befehl+Umschalt+P (Strg+Umschalt+P bei Ubuntu). Aktionen für einen Commit verwenden das Rechtsklickmenü dieses Commits.

  1. Erstellen Sie den Zweig, das Commit und den lokalen Server, wie im nächsten Abschnitt gezeigt. Halten Sie shared/dark-regression ausgecheckt und den Arbeitsbaum sauber.
  2. Wählen Sie im Diagramm den fehlerhaften Commit aus und lesen Sie seine Details: ein geänderter Pfad, styles.css, und eine hinzugefügte Zeile.
  3. Klicken Sie mit der rechten Maustaste darauf und wählen Sie Revert Commit. Es gilt sofort für die Filiale, in der Sie sich befinden. Es gibt keinen Nachrichteneditor. In der Mitteilung steht „Zurückgesetzt“. Wenn es stattdessen stoppt, bietet das Banner „Reverting … on shared/dark-regression“ Resolve, Continue und Abort….
  4. Wählen Sie das neue Commit aus. Sein Betreff ist Revert "style: introduce the rehearsal contrast regression" und sein übergeordnetes Element ist der fehlerhafte Commit. Der fehlerhafte Commit ist immer noch im Diagramm zu sehen.
  5. Öffnen Sie styles.css: Es ist CSS_RESTORED, ohne die hinzugefügte Regel.
  6. Klicken Sie auf die Symbolleiste Push. Dies ist ein normaler Push des Zweigs zu seinem Upstream; Wählen Sie nicht Force Push (With Lease)…. In der Mitteilung heißt es: „Shared/Dark-Regression auf Probe/Shared/Dark-Regression verschoben.“
  7. Überprüfen Sie das Ergebnis: Der Arbeitsbaum ist sauber, beide Commits befinden sich im Diagramm und der Serverzweig befindet sich auf dem neuen Commit.

Wenn Sie mit der rechten Maustaste auf einen Merge-Commit klicken, öffnet Revert Commit „Merge rückgängig machen …“ mit First parent (the branch merged into) und Second parent (the branch merged in). Führen Sie es hier nicht aus.

Für jeden gewöhnlichen Commit im Kurs: Summary ist das angegebene Subjekt, Description ist leer und die Optionen Amend Previous Commit, Skip Hooks, Add Signed-off-by, Different Author, Push After Commit und Allow Empty Commit bleiben ausgeschaltet.

Im Terminal

In einer separaten Kopie des Ergebnisses von Lektion 18:

Command · bash
git switch --create shared/dark-regression

Speichern Sie DOC_DARK_BAD als styles.css, dann:

Command · bash
git add -- styles.css
git commit --quiet -m "style: introduce the rehearsal contrast regression"
BAD_SHA="$(git rev-parse HEAD)"
git init --quiet --bare --initial-branch=main ../gittree-revert-origin.git
git remote add rehearsal ../gittree-revert-origin.git
git push --quiet --set-upstream rehearsal shared/dark-regression

Jetzt zurücksetzen, veröffentlichen und das Ergebnis lesen:

Command · bash
git revert --no-edit "$BAD_SHA"
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?
git log -1 --format=%s
git push --quiet rehearsal shared/dark-regression
git status --short
git ls-remote --heads rehearsal refs/heads/shared/dark-regression
git rev-parse HEAD
Ausgabe
0
Revert "style: introduce the rehearsal contrast regression"

Die Ancestor-Prüfung gibt 0 aus: Der fehlerhafte Commit liegt immer noch hinter HEAD. styles.css ist CSS_RESTORED, der Status ist leer und die beiden IDs von ls-remote und rev-parse sind gleich. Es war keine Gewaltoption beteiligt. In einer separaten Kopie, in der ein späterer Commit dieselbe Zeile bearbeitet, stoppt git revert mit „CONFLICT (content)“ und den Hinweisen git revert --continue und git revert --abort. Und git revert weigert sich bei einem Zusammenführungs-Commit mit „ist eine Zusammenführung, aber es wurde keine -m-Option angegeben“; -m 1 wählt das erste übergeordnete Element aus.

Ergebnis

Where you end: shared/dark-regression hat einen neuen Commit, der den schlechten abbricht. Die Seite verwendet CSS_RESTORED, der fehlerhafte Commit befindet sich noch im Verlauf, der Serverzweig befindet sich beim neuen Commit, der Arbeitsbaum ist sauber und es wurde nichts erzwungen.

Häufige Fehler

  • Verwenden von Reset und einem Force-Push, um einen Commit zu „entfernen“, den andere bereits haben.
  • Ich erwarte, dass der fehlerhafte Commit aus dem Protokoll verschwindet.
  • Eine Zusammenführung rückgängig machen, ohne absichtlich das übergeordnete Element auszuwählen.
  • Bevor Sie die Datei ansehen, drücken Sie auf die Schaltfläche „Zurück“.

Wenn etwas schief geht

Wenn die Wiederherstellung aufgrund eines Konflikts stoppt, lesen Sie das Banner. Resolve und Continue beenden es wie in Lektion 23; Abort… gibt den Zweig dorthin zurück, wo er war. Wenn das Zurücksetzen selbst nach Abschluss ein Fehler war, machen Sie es rückgängig: Es ist nur ein weiterer Commit.

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

  1. Frage 1 von 6

    Was macht das Zurücksetzen mit dem fehlerhaften Commit?

    Wählen Sie eine Antwort.

  2. Frage 2 von 6

    Welche davon sind nach der Rückkehr wahr?

    Wählen Sie jede zutreffende Antwort aus.

  3. Frage 3 von 6
    Erforderlich

    Sie machen den fehlerhaften Commit rückgängig und pushen normal. Wo ist danach der Serverzweig?

    Wählen Sie eine Antwort.

  4. Frage 4 von 6

    Ändern Sie die Eingabe: Ein späterer Commit bearbeitet dieselbe Zeile, die durch den fehlerhaften Commit hinzugefügt wurde, und Sie machen dann den fehlerhaften Commit rückgängig. Was geschieht?

    Wählen Sie eine Antwort.

  5. Frage 5 von 6
    Erforderlich

    Sie versuchen, einen Merge-Commit rückgängig zu machen, und Git sagt: „Es handelt sich um einen Merge, aber es wurde keine Option -m angegeben.“ Was ist los und was machen Sie?

    Wählen Sie eine Antwort.

  6. Frage 6 von 6
    Erforderlich

    Welche Readbacks zeigen nach dem Zurücksetzen und dem Push, dass es das getan hat, was in der Lektion gesagt wird?

    Wählen Sie jede zutreffende Antwort aus.

0 von 6 korrekt

Beantworten Sie die erforderlichen Fragen richtig, um die Lektion abzuschließen.

In diesem Browser überprüft.

Üben

Melden Sie den Betreff des Zurückgesetzten, sein übergeordnetes Element, ob der fehlerhafte Commit noch ein Vorfahre ist und ob der Serverzweig HEAD entspricht. Sagen Sie dann voraus, was passiert, wenn ein späterer Commit dieselbe Zeile vor dem Zurücksetzen geändert hätte.

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

  • Revert fügt einen Commit hinzu, der einen anderen abbricht.
  • Geschichte bleibt; die Datei geht zurück.
  • Ein normaler Stoß genügt.

Glossarbegriffe eingeführt

Zurücksetzen – عكس; umgekehrte Änderung – تغيير معاكس; Hauptelternteil – Englisch.

Videotranskript

Die Erzählung des Videos, Stichwort für Stichwort.

Zeigen Sie das Transkript
  1. Machen Sie eine Änderung rückgängig, die andere Personen bereits vorgenommen haben habe.
  2. Zurücksetzen verschiebt den Zweig zurück. Zurücksetzen fügt a hinzu stattdessen ein neues Commit.
  3. Andere haben bereits das alte Commit. Zurücksetzen lässt ihre Kopie gültig.
  4. Erstellen Sie den gemeinsam genutzten Zweig mit einem fehlerhaften Commit. und einen lokalen Server, der es hat.
  5. Die Grafik zeigt M und das fehlerhafte Commit oben.
  6. Der fehlerhafte Commit fügt eine Zeile und den Text hinzu wird blass.
  7. Notieren Sie sich die ID.
  8. Klicken Sie mit der rechten Maustaste darauf und wählen Sie Commit zurücksetzen.
  9. Es gilt ab sofort. Es gibt keine Nachricht Herausgeber.
  10. In der Mitteilung heißt es zurückgesetzt.
  11. Der neue Commit ist nach dem alten benannt.
  12. Sein übergeordnetes Element ist der fehlerhafte Commit. Nichts war entfernt.
  13. Die Datei ist wieder so, wie sie war. Die blasse Regel ist weg.
  14. Und die Grafik zeigt beide Commits. Die Die Geschichte ist nur gewachsen.
  15. Nur dieser Zweig ist umgezogen. Nichts ist noch veröffentlicht.
  16. Der Zweig liegt einen Commit vor dem Server.
  17. Klicken Sie auf Push. Das ist ein normaler Push.
  18. In der Bekanntmachung werden die Filiale und die genannt Server.
  19. Es war keine Kraft nötig. Der Push fügte nur a hinzu begehen.
  20. Im Terminal wird Git ohne Bearbeitung zurückgesetzt macht das Gleiche.
  21. Der schlechte Commit ist immer noch ein Vorfahre. Die Die Antwort ist Null.
  22. Und das Thema beginnt mit Revert.
  23. Drücken Sie und vergleichen Sie dann die ID des Servers mit KOPF. Sie sind gleich.
  24. Ändern Sie die Eingabe: Jemand hat dasselbe bearbeitet Zeile später.
  25. Die Rückkehr stoppt mit einem Konflikt. Lösen und fortfahren oder abbrechen.
  26. Beim Rückgängigmachen einer Zusammenführung wird nach einem übergeordneten Element gefragt. Normalerweise ist es das erste.
  27. Nachdem Sie eine Zusammenführung rückgängig gemacht haben, führen Sie diese zusammen Der Zweig wiederum kann möglicherweise nichts tun.
  28. Übung: Melden Sie das Thema, Eltern, Ahnenprüfung und die Server-ID.
  29. Suchen Sie als Nächstes mit dem Reflog nach einem verlorenen Commit.