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.
- Ebene: Fortgeschritten
- 13 Min. gelesen
- 7 Min. Video
- Aktualisiert
- Vor dieser Lektion: Rebasieren Sie unveröffentlichte Arbeiten auf einer neuen Basis
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
- 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:
| Schritt | Begehen | Was es bewirkt |
|---|---|---|
| C1 | Kunststück: Anmeldeentwurf hinzufügen | fügt das Anmeldeformular hinzu |
| C2 | Dokumente: Anmeldeüberprüfung erklären | fügt docs/replay-a.md hinzu |
| C3 | Dokumente: Validierung erklären | fügt docs/replay-b.md hinzu |
| C4 | Reparatur! Kunststück: Anmeldeentwurf hinzufügen | korrigiert die Beschriftung des Formulars |
| C5 | Hausarbeit: vorübergehende Notiz | fü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:
| Schritt | Begehen | Aktion | Ergebnis |
|---|---|---|---|
| 1 | C1 | Umformulieren | Kunststück: Füllen Sie das lokale Anmeldeformular aus |
| 2 | C4 | Reparatur | in Schritt 1 gefaltet |
| 3 | C3 | Wählen | gehalten; das Squash-Ziel |
| 4 | C2 | Kürbis | Dokumente: Erläutern Sie die Überprüfung und Validierung der Anmeldung |
| 5 | C5 | Tropfen | weg |
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
<!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
# Local signup review
Review the label and hint together.docs/replay-b.md – DOC_B
# Local validation review
No address leaves this demonstration.index.html – SIGNUP_LABEL
<!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
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.
- Erstellen Sie die fünf Commits und den Rettungszweig, wie im nächsten Abschnitt gezeigt, wobei
private/signup-polishausgecheckt und bereinigt ist. Beachten Sie M und die fünf Themen. - 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.
- 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.
- 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.
- Setzen Sie C1 auf Reword und geben Sie
feat: complete the local signup formin das Nachrichtenfeld ein. Setzen Sie C4 auf Fixup. - 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. - 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.
- 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.
- Überprüfen Sie zwei neue Commits, den Label-Fix auf der Seite, beide Dokumente und keine temporäre Notiz. Behalten Sie
rescue/before-polishund 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:
git switch --create private/signup-polishSpeichern Sie die Anmeldung als index.html, dann:
git add -- index.html
git commit --quiet -m "feat: add signup draft"Speichern Sie DOC_A als docs/replay-a.md, dann:
git add -- docs/replay-a.md
git commit --quiet -m "docs: explain signup review"Speichern Sie DOC_B als docs/replay-b.md, dann:
git add -- docs/replay-b.md
git commit --quiet -m "docs: explain validation"Speichern Sie SIGNUP_LABEL als index.html, dann:
git add -- index.html
git commit --quiet -m "fixup! feat: add signup draft"Speichern Sie DOC_NOISE als docs/temporary-review.md, dann:
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:
git branch rescue/before-polish
BASE_SHA="$(git rev-parse HEAD~5)"
git log --reverse --format=%s "$BASE_SHA"..HEADStarten Sie nun den interaktiven Rebase (-i ist die Kurzform von --interactive). Git öffnet Ihren Editor mit der Aufgabenliste (Ihre IDs unterscheiden sich):
git rebase --interactive --no-autosquash --no-update-refs --no-autostash "$BASE_SHA"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 noteSchreiben Sie die fünf Zeilen neu in den Plan, behalten Sie dabei die eigene ID jeder Zeile bei und speichern Sie:
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 noteGit ö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:
git rev-list --count "$BASE_SHA"..HEAD
git log --reverse --format=%s "$BASE_SHA"..HEAD
git status --short2
feat: complete the local signup form
docs: explain signup review and validationDer 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.
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.
Verwandt
Glossarbegriffe eingeführt
Umformulieren – إعادة صياغة; Kürbis – ضمّ; Fixup – ضمّ مع تجاهل الرسالة; fallen lassen – إسقاط; Wiederholungsplan – خطة إعادة تطبيق.
Videotranskript
Die Erzählung des Videos, Stichwort für Stichwort.
Zeigen Sie das Transkript
- Aus fünf groben Commits werden zwei saubere, sicher.
- Interaktive Rebase ist ein Plan: eine Liste von Schritte, die Ältesten zuerst.
- Git spielt die Liste von oben nach unten ab eine Basis.
- Jeder Schritt erhält eine Aktion: auswählen, umformulieren, Squash, Fixup oder Drop.
- Erstellen Sie zunächst fünf private Commits und ein Rettungszweig.
- Drei sind echte Arbeit. Eins ist eine Lösung und eins ist vorübergehender Lärm.
- Klicken Sie mit der rechten Maustaste auf das Commit darunter und Öffnen Sie Verlauf bearbeiten.
- Wählen Sie Interaktives Rebase der Commits Oben.
- Der Herausgeber listet die fünf Schritte auf, die ältesten zuerst.
- Lassen Sie alle drei Optionen ausgeschaltet. Wir werden umziehen die Reparatur selbst.
- Das Fixup gehört direkt nach dem Commit es behebt. Bewegen Sie es zweimal nach oben.
- Bewegen Sie nun den Validierungshinweis über das Rezensionsnotiz.
- Die Reihenfolge ist jetzt eins, vier, drei, zwei, fünf.
- Stellen Sie den ersten Schritt auf „Umformulieren“ und schreiben Sie die neue Nachricht.
- Setzen Sie den Fixup-Schritt auf Fixup. Seine Botschaft wird weggeworfen.
- Bewahren Sie den Validierungsvermerk auf und zerquetschen Sie ihn Rezensionsnotiz hinein.
- Squash zeigt beide Nachrichten an. Schreiben Sie eins Nachricht für das Paar.
- Lassen Sie die temporäre Notiz fallen. Seine Veränderung wird nicht überleben.
- Lesen Sie jede Zeile noch einmal. Nichts ist auf einem entfernt.
- Wählen Sie einmal Start Rebase und warten Sie zum Abschluss.
- Das Diagramm hat jetzt zwei Commits über dem Basis.
- Beide haben neue Ausweise. Die alten fünf sind auf dem Rettungszweig.
- Öffnen Sie die Seite: Der Label-Fix ist da. Die Lärm ist weg.
- Jetzt der gleiche Plan im Terminal, mit git rebase -i.
- Git öffnet die Todo-Liste. Die Ältesten zuerst eingestellt, um zu pflücken.
- Schreiben Sie die Zeilen in unseren Plan um: umformulieren, reparieren, pflücken, quetschen, fallen lassen.
- Git fragt nach den beiden Nachrichten. Schreiben Sie eins Zeile für jeden.
- Zählen Sie die Commits über der Basis: zwei.
- Listen Sie die Themen auf. Das sind die beiden wir schrieb.
- Der Status ist leer und die temporäre Notiz ist leer weg.
- Ändern Sie die Eingabe: Legen Sie den Kürbis auf erster Schritt.
- Es gibt also nichts darüber, in das man hineinfalten könnte Git lehnt ab.
- Oder verschieben Sie das Fixup über seinen Commit: den Die Wiedergabe stoppt mit einem Konflikt.
- Wenn es stoppt, beheben Sie es und fahren Sie fort. Oder Abbruch, und nichts ändert sich.
- Der Rettungszweig hält Sie immer noch fest Ursprüngliche fünf Commits.
- Schreiben Sie niemals Commits von jemand anderem um schon hat.
- Übung: Erklären Sie den Plan und warum Man kann kein Squash sein.
- Als nächstes lösen Sie Konflikte, wenn eine Zusammenführung oder ein Rebase stoppt.