Zum Inhalt springen
GitTree

Lektion 22 · Geschichte und Integration

Lokale Commits neu anordnen, stauchen, umformulieren und löschen

Verwandeln Sie fünf grobe private Commits in zwei saubere: Verschieben Sie einen abhängigen Fix, formulieren Sie eine Nachricht um, falten und stauchen Sie Schritte, löschen Sie nur das Rauschen und überprüfen Sie, ob das Ergebnis genau die Dateien enthält, die Sie gemeint haben.

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

  • Lesen Sie einen Wiederholungsplan: Ältester Schritt zuerst, von oben nach unten angewendet.
  • Wählen Sie die richtige Aktion: Umformulieren, Squash, Fixup oder Drop.
  • Bewegen Sie einen Schritt, ohne den Schritt zu unterbrechen, von dem er abhängt.
  • Überprüfen Sie anschließend die neuen Commits, die Dateien und den Rettungszweig.

Bevor Sie beginnen

Ihr Zweig private/signup-polish verfügt über fünf Commits, die nur auf Ihrem Computer vorhanden sind, zusätzlich zum Commit M. Der Arbeitsbaum ist sauber und rescue/before-polish zeigt auf den fünften Commit. Der Reihe nach, Älteste zuerst:

SchrittBegehenWas es bewirkt
C1Kunststück: Anmeldeentwurf hinzufügenfügt das Anmeldeformular hinzu
C2Dokumente: Anmeldeüberprüfung erklärenfügt docs/replay-a.md hinzu
C3Dokumente: Validierung erklärenfügt docs/replay-b.md hinzu
C4Reparatur! Kunststück: Anmeldeentwurf hinzufügenkorrigiert die Beschriftung des Formulars
C5Hausarbeit: vorübergehende Notizfügt docs/temporary-review.md hinzu

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 durch und schreiben Sie niemals Commits neu, die andere Leute bereits haben.

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

Eine interaktive Rebase ist ein Plan, kein Sortierspiel. Git spielt die aufgelisteten Commits einzeln auf der Basis ab, vom Anfang der Liste bis zum Ende, sodass der älteste Schritt zuerst kommt. Jede Aktion sagt Git, was mit einem Schritt zu tun ist:

  • Pick behält den Commit bei, wie er ist.
  • Reword behält seinen Inhalt und ermöglicht Ihnen das Schreiben einer neuen Nachricht.
  • Squash faltet den Commit in den darüber liegenden beibehaltenen Commit ein und lässt Sie eine kombinierte Nachricht schreiben.
  • Fixup faltet es ebenfalls ein, wirft aber seine eigene Nachricht weg.
  • Drop lässt die Änderung des Commits vollständig weg.

Ordnung ist wichtig. Ein Schritt, der von einem anderen abhängt (hier benötigt der Label-Fix das Formular aus C1), muss darunter bleiben. Der Editor erlaubt Ihnen, es nach oben zu verschieben, und dann stoppt die Wiedergabe mit einem Konflikt. GitTree lehnt auch Pläne ab, die Git nicht ausführen kann: einen Plan, der jedes Commit verwirft, einen Squash, über dem sich nichts befindet, in das man sich falten kann, und eine leere Nachricht.

Jeder wiederholte Commit erhält eine neue ID, da sich sein übergeordneter Commit ändert. Nur dieser Zweig wird neu geschrieben; Die Rettungsabteilung behält die alten fünf. Commits, die sich bereits auf einer Fernbedienung befinden, sind mit „Auf einer Fernbedienung“ gekennzeichnet und das Umschreiben dieser Commits erfordert eine explizite Bestätigung. Diese Lektion bestätigt das niemals.

Der Plan, den Sie erstellen werden, verwandelt fünf Commits in zwei:

SchrittBegehenAktionErgebnis
1C1UmformulierenKunststück: Füllen Sie das lokale Anmeldeformular aus
2C4Reparaturin Schritt 1 gefaltet
3C3Wählengehalten; das Squash-Ziel
4C2KürbisDokumente: Erläutern Sie die Überprüfung und Validierung der Anmeldung
5C5Tropfenweg

Bereiten Sie den genauen Projektstand vor

Beginnen Sie mit einer separaten, gewöhnlichen Kopie des Projekts, so wie es in Lektion 18 hinterlassen wurde. Lassen Sie Ihr Original gittree-features unberührt. Erstellen Sie die folgenden fünf Commits in einem neuen Zweig, jeweils eine Datei, und speichern Sie jeden vollständigen Text nur im benannten Schritt.

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.

index.html – ANMELDEN

Aktenauszug · html
<!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>
    <section aria-labelledby="signup-title">
      <h2 id="signup-title">Try the demo form</h2>
      <form id="signup-form" novalidate>
        <label for="demo-email">Demo email</label>
        <input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
        <p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
        <button type="submit">Check the address locally</button>
        <p id="signup-result" role="status"></p>
      </form>
    </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>

docs/replay-a.md – DOC_A

Ausgabe
# Local signup review

Review the label and hint together.

docs/replay-b.md – DOC_B

Ausgabe
# Local validation review

No address leaves this demonstration.

index.html – SIGNUP_LABEL

Aktenauszug · html
<!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>
    <section aria-labelledby="signup-title">
      <h2 id="signup-title">Try the demo form</h2>
      <form id="signup-form" novalidate>
        <label for="demo-email">Fictional email address</label>
        <input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
        <p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
        <button type="submit">Check the address locally</button>
        <p id="signup-result" role="status"></p>
      </form>
    </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>

docs/temporary-review.md – DOC_NOISE

Ausgabe
Temporary rehearsal note, deliberately dropped.

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 die fünf Commits und den Rettungszweig, wie im nächsten Abschnitt gezeigt, wobei private/signup-polish ausgecheckt und bereinigt ist. Beachten Sie M und die fünf Themen.
  2. Klicken Sie mit der rechten Maustaste auf M, das Commit direkt unter der Fünf, und wählen Sie Edit History → Interactive Rebase of the Commits Above…. Der Editor öffnet sich mit den fünf privaten Schritten, die ältesten zuerst.
  3. Lassen Sie unter Options for this rebase alle drei Optionen deaktiviert, einschließlich Arrange fixup!, squash! and amend! commits. Sie werden die Korrektur selbst verschieben.
  4. Fokussieren Sie die Zeile C4 und drücken Sie zweimal Alt+ ↑, dann fokussieren Sie C3 und drücken Sie einmal Alt+ ↑. Die Reihenfolge ist jetzt C1, C4, C3, C2, C5. Durch Drücken von p, r, e, s, f oder d in einer fokussierten Zeile wird „Auswählen“, „Umformulieren“, „Bearbeiten“, „Squash“, „Korrigieren“ oder „Ablegen“ aktiviert.
  5. Setzen Sie C1 auf Reword und geben Sie feat: complete the local signup form in das Nachrichtenfeld ein. Setzen Sie C4 auf Fixup.
  6. Behalten Sie C3 auf Pick und setzen Sie C2 auf Squash. Unter Squashed commits wird in der Gruppe „2 Commits in Dokumente: Validierung erklären“ eine kombinierte Meldung angezeigt. Ersetzen Sie es durch docs: explain signup review and validation.
  7. Setzen Sie C5 auf Drop. Lesen Sie jede Zeile und die kombinierte Nachricht noch einmal. Da nichts mit „Auf einer Fernbedienung“ gekennzeichnet ist, ist keine Bestätigung erforderlich.
  8. Wählen Sie einmal Start Rebase und warten Sie. Wenn es stoppt, verwenden Sie das Banner, um fortzufahren. Starten Sie nicht den gesamten Plan erneut.
  9. Überprüfen Sie zwei neue Commits, den Label-Fix auf der Seite, beide Dokumente und keine temporäre Notiz. Behalten Sie rescue/before-polish und lassen Sie den Arbeitsbaum sauber.

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

Erstellen Sie die fünf Commits in einem neuen Zweig und speichern Sie dabei jeden vollständigen Text in seinem jeweiligen Schritt:

Command · bash
git switch --create private/signup-polish

Speichern Sie die Anmeldung als index.html, dann:

Command · bash
git add -- index.html
git commit --quiet -m "feat: add signup draft"

Speichern Sie DOC_A als docs/replay-a.md, dann:

Command · bash
git add -- docs/replay-a.md
git commit --quiet -m "docs: explain signup review"

Speichern Sie DOC_B als docs/replay-b.md, dann:

Command · bash
git add -- docs/replay-b.md
git commit --quiet -m "docs: explain validation"

Speichern Sie SIGNUP_LABEL als index.html, dann:

Command · bash
git add -- index.html
git commit --quiet -m "fixup! feat: add signup draft"

Speichern Sie DOC_NOISE als docs/temporary-review.md, dann:

Command · bash
git add -- docs/temporary-review.md
git commit --quiet -m "chore: temporary note"

Schützen Sie die alte Spitze und listen Sie den Bereich auf, älteste zuerst:

Command · bash
git branch rescue/before-polish
BASE_SHA="$(git rev-parse HEAD~5)"
git log --reverse --format=%s "$BASE_SHA"..HEAD

Starten Sie nun den interaktiven Rebase (-i ist die Kurzform von --interactive). Git öffnet Ihren Editor mit der Aufgabenliste (Ihre IDs unterscheiden sich):

Command · bash
git rebase --interactive --no-autosquash --no-update-refs --no-autostash "$BASE_SHA"
Ausgabe
pick 1a2b3c4 feat: add signup draft
pick 2b3c4d5 docs: explain signup review
pick 3c4d5e6 docs: explain validation
pick 4d5e6f7 fixup! feat: add signup draft
pick 5e6f708 chore: temporary note

Schreiben Sie die fünf Zeilen neu in den Plan, behalten Sie dabei die eigene ID jeder Zeile bei und speichern Sie:

Ausgabe
reword 1a2b3c4 feat: add signup draft
fixup 4d5e6f7 fixup! feat: add signup draft
pick 3c4d5e6 docs: explain validation
squash 2b3c4d5 docs: explain signup review
drop 5e6f708 chore: temporary note

Git öffnet den Editor dann noch zweimal. Ersetzen Sie für die Umformulierung die Nachricht durch feat: complete the local signup form. Für den Squash werden beide Meldungen angezeigt; Ersetzen Sie sie durch eine Zeile, docs: explain signup review and validation. Überprüfen Sie das Ergebnis:

Command · bash
git rev-list --count "$BASE_SHA"..HEAD
git log --reverse --format=%s "$BASE_SHA"..HEAD
git status --short
Ausgabe
2
feat: complete the local signup form
docs: explain signup review and validation

Der Status ist leer. index.html ist SIGNUP_LABEL, beide Dokumente existieren und docs/temporary-review.md nicht.

Wenn Sie in der ersten Zeile einen Squash einfügen, stoppt Git sofort mit error: cannot 'squash' without a previous commit. Korrigieren Sie die Liste mit git rebase --edit-todo und git rebase --continue oder verlassen Sie sie mit git rebase --abort. Mit --autosquash übernimmt Git den Umzug und die Aktion für fixup! Commits für Sie; Diese Lektion schaltet es aus, um den Plan anzuzeigen.

Ergebnis

Where you end: zwei neu geschriebene Commits über M, „feat: Vervollständigen Sie das lokale Anmeldeformular“ und „docs: erklären Sie die Überprüfung und Validierung der Anmeldung“. Die Seite hat das Label „Fix“, beide Dokumente sind vorhanden und die temporäre Notiz ist nicht vorhanden. Die alten fünf Commits werden vom Rettungszweig aufbewahrt und der Arbeitsbaum ist sauber.

Häufige Fehler

  • Verwenden Sie Drop, um ein möglicherweise benötigtes Commit auszublenden. Die Änderung liegt überhaupt nicht in der neuen Geschichte vor.
  • Einen Fix über den Commit verschieben, den er behebt.
  • Zerquetscht die erste Stufe, über der es nichts gibt, in das man hineinfalten kann.
  • Starten Sie den Plan nach Abschluss erneut, anstatt zuerst das Ergebnis zu überprüfen.

Wenn etwas schief geht

Bevor Sie beginnen, lässt Cancel den Zweig unverändert. Wenn GitTree angibt, dass sich der Zweig seit dem Öffnen des Editors geändert hat, schließen Sie den Editor und öffnen Sie ihn erneut. Wenn das Rebase stoppt, beheben Sie den Konflikt oder die Nachricht und fahren Sie mit dem Banner fort oder brechen Sie es absichtlich ab. Vergleichen Sie nach Abschluss den Vorgang mit rescue/before-polish, bevor Sie versuchen, etwas wiederherzustellen.

Ü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

    Welcher Commit wird in der Todo-Liste einer interaktiven Rebase zuerst wiedergegeben?

    Wählen Sie eine Antwort.

  2. Frage 2 von 6

    Welcher dieser Pläne kann nicht funktionieren?

    Wählen Sie jede zutreffende Antwort aus.

  3. Frage 3 von 6
    Erforderlich

    Der Plan ist: C1 umformulieren, C4 korrigieren, C3 auswählen, C2 quetschen, C5 weglassen. Wie viele Commits liegen nach der Ausführung über M und wohin wird die Datei der temporären Notiz verschoben?

    Wählen Sie eine Antwort.

  4. Frage 4 von 6

    Ändern Sie die Eingabe: Sie belassen C5 als Pick statt Drop. Was ist anders?

    Wählen Sie eine Antwort.

  5. Frage 5 von 6
    Erforderlich

    Sie setzen Schritt 1 auf „Squash“ und GitTree weigert sich zu starten: „Schritt 1 wird in nichts gequetscht: Verschieben Sie ihn unter einen beibehaltenen Commit.“ Was bedeutet das und was machen Sie?

    Wählen Sie eine Antwort.

  6. Frage 6 von 6
    Erforderlich

    Welche Rückmeldungen beweisen, dass das Ergebnis das ist, was der Plan hervorbringen sollte?

    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

Erklären Sie den Plan C1, C4, C3, C2, C5 und die beiden erhaltenen Botschaften. Überprüfen Sie den alten Bereich 5, den neuen Bereich 2, die erwarteten Dateien und keine Notiz. Sagen Sie dann voraus, ohne es auszuführen, warum das Verschieben von C4 über C1 oder das Zusammendrücken von Schritt 1 nicht funktionieren kann.

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

  • Ein Wiederholungsplan hat eine Reihenfolge und Abhängigkeiten.
  • Squash speichert beide Nachrichten, damit Sie sie kombinieren können. Fixup verwirft sein eigenes.
  • Drop entfernt die Änderung selbst, sodass nur echtes Rauschen gelöscht wird.

Glossarbegriffe eingeführt

Umformulieren – إعادة صياغة; Kürbis – ضمّ; Fixup – ضمّ مع تجاهل الرسالة; fallen lassen – إسقاط; Wiederholungsplan – خطة إعادة تطبيق.

Videotranskript

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

Zeigen Sie das Transkript
  1. Aus fünf groben Commits werden zwei saubere, sicher.
  2. Interaktive Rebase ist ein Plan: eine Liste von Schritte, die Ältesten zuerst.
  3. Git spielt die Liste von oben nach unten ab eine Basis.
  4. Jeder Schritt erhält eine Aktion: auswählen, umformulieren, Squash, Fixup oder Drop.
  5. Erstellen Sie zunächst fünf private Commits und ein Rettungszweig.
  6. Drei sind echte Arbeit. Eins ist eine Lösung und eins ist vorübergehender Lärm.
  7. Klicken Sie mit der rechten Maustaste auf das Commit darunter und Öffnen Sie Verlauf bearbeiten.
  8. Wählen Sie Interaktives Rebase der Commits Oben.
  9. Der Herausgeber listet die fünf Schritte auf, die ältesten zuerst.
  10. Lassen Sie alle drei Optionen ausgeschaltet. Wir werden umziehen die Reparatur selbst.
  11. Das Fixup gehört direkt nach dem Commit es behebt. Bewegen Sie es zweimal nach oben.
  12. Bewegen Sie nun den Validierungshinweis über das Rezensionsnotiz.
  13. Die Reihenfolge ist jetzt eins, vier, drei, zwei, fünf.
  14. Stellen Sie den ersten Schritt auf „Umformulieren“ und schreiben Sie die neue Nachricht.
  15. Setzen Sie den Fixup-Schritt auf Fixup. Seine Botschaft wird weggeworfen.
  16. Bewahren Sie den Validierungsvermerk auf und zerquetschen Sie ihn Rezensionsnotiz hinein.
  17. Squash zeigt beide Nachrichten an. Schreiben Sie eins Nachricht für das Paar.
  18. Lassen Sie die temporäre Notiz fallen. Seine Veränderung wird nicht überleben.
  19. Lesen Sie jede Zeile noch einmal. Nichts ist auf einem entfernt.
  20. Wählen Sie einmal Start Rebase und warten Sie zum Abschluss.
  21. Das Diagramm hat jetzt zwei Commits über dem Basis.
  22. Beide haben neue Ausweise. Die alten fünf sind auf dem Rettungszweig.
  23. Öffnen Sie die Seite: Der Label-Fix ist da. Die Lärm ist weg.
  24. Jetzt der gleiche Plan im Terminal, mit git rebase -i.
  25. Git öffnet die Todo-Liste. Die Ältesten zuerst eingestellt, um zu pflücken.
  26. Schreiben Sie die Zeilen in unseren Plan um: umformulieren, reparieren, pflücken, quetschen, fallen lassen.
  27. Git fragt nach den beiden Nachrichten. Schreiben Sie eins Zeile für jeden.
  28. Zählen Sie die Commits über der Basis: zwei.
  29. Listen Sie die Themen auf. Das sind die beiden wir schrieb.
  30. Der Status ist leer und die temporäre Notiz ist leer weg.
  31. Ändern Sie die Eingabe: Legen Sie den Kürbis auf erster Schritt.
  32. Es gibt also nichts darüber, in das man hineinfalten könnte Git lehnt ab.
  33. Oder verschieben Sie das Fixup über seinen Commit: den Die Wiedergabe stoppt mit einem Konflikt.
  34. Wenn es stoppt, beheben Sie es und fahren Sie fort. Oder Abbruch, und nichts ändert sich.
  35. Der Rettungszweig hält Sie immer noch fest Ursprüngliche fünf Commits.
  36. Schreiben Sie niemals Commits von jemand anderem um schon hat.
  37. Übung: Erklären Sie den Plan und warum Man kann kein Squash sein.
  38. Als nächstes lösen Sie Konflikte, wenn eine Zusammenführung oder ein Rebase stoppt.