Lektion 31 · Erholung
Behalten Sie die getrennte Arbeit bei und starten Sie eine verwaiste Geschichte
Benennen Sie einen Commit, der auf einem abgetrennten HEAD durchgeführt wurde, bevor Sie ihn verlassen. Starten Sie dann einen verwaisten Zweig in einer separaten Kopie und sehen Sie, was er entfernt und was er behält.
- Ebene: Mittelstufe
- 11 Min. gelesen
- 5 Min. Video
- Aktualisiert
- Vor dieser Lektion: Erstellen Sie einen Feature-Zweig und entfernen Sie nur die verfügbare Referenz, 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
- Erzählen Sie den anhaftenden, den losgelösten und den ungeborenen KOPF auseinander.
- Fügen Sie einem getrennten Commit einen Zweig hinzu, damit dieser erreichbar bleibt.
- Sagen Sie voraus, was ein verwaister Zweig mit nachverfolgten Dateien, nicht nachverfolgten Dateien und dem alten Zweig macht.
- Lesen Sie eine Zahlungsverweigerung aufgrund lokaler Änderungen.
Bevor Sie beginnen
Zwei verfügbare Kopien des Ergebnisses M aus Lektion 18. Im ersten überprüfen Sie das Commit M selbst anstelle des Zweigs, nehmen dort eine kleine Stylesheet-Änderung vor und möchten diese beibehalten. Im zweiten Schritt möchten Sie einen brandneuen, unabhängigen Verlauf für einen reinen Dokumentationszweig, ohne main zu berühren.
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
HEAD benennt normalerweise einen Zweig und das Festschreiben verschiebt diesen Zweig. Wenn HEAD einen Commit direkt benennt, ist er detached: Ein neuer Commit ist real, aber nichts benennt ihn. Wenn Sie ihn also wegschalten, ist er nur über das Reflog erreichbar. Das wird durch das Anbringen eines Zweigs behoben. Durch das Erstellen eines Zweigs wird nicht zu diesem gewechselt, es sei denn, Sie entscheiden sich dafür.
Ein orphan-Zweig ist anders. HEAD benennt einen Zweig, der noch kein Commit hat (einen ungeborenen Zweig). Sein erster Commit hat kein übergeordnetes Element, daher teilt er keinen Verlauf mit main. Git entfernt die verfolgten Dateien aus dem Arbeitsordner; Nicht verfolgte und ignorierte Dateien bleiben bestehen. Wenn das alte .gitignore verfolgt wurde, gelten seine Regeln und Dateien, die es ignoriert hat, können jetzt als nicht verfolgt angezeigt werden. Ihr alter Zweig behält jedes Commit.
Beide Zustände sind normal, kein Schaden. Ein Auschecken wird abgelehnt, wenn dadurch lokale Änderungen überschrieben würden; nichts geht verloren.
Bereiten Sie den genauen Projektstand vor
Beginnen Sie mit zwei separaten, gewöhnlichen Kopien des Ergebnisses von Lektion 18 und lassen Sie Ihr Original unberührt. Die folgenden Körper sind das Basis-Stylesheet (BASE_CSS), das erweiterte Stylesheet (LAYOUT), eine schmutzige Bearbeitung (DIRTY_LAYOUT), die Readme-Datei für Waisenkinder (ORPHAN_README), eine lokale Notiz (LOCAL_NOTE) und eine ignorierte Notiz (IGNORED_NOTE).
Vollständige Dateieingaben
Speichern Sie jeden vollständigen UTF-8/LF-Körper nur in der angegebenen Phase, mit einer abschließenden neuen Zeile und ohne Markdown-Zäune. BASE_CSS ist die geerbte 48rem-Referenz; LAYOUT ist das 52rem-Commit; DIRTY_LAYOUT ist eine separate, nicht inszenierte 56rem-Wiederholung. Die beiden Notizdateien gehören nur zur Survivor-Variante. Unveränderte Hauptdateien erben die komplette L018/M-Eingabe.
style.css – BASE_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;
}style.css – LAYOUT
: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: 52rem;
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;
}styles.css – DIRTY_LAYOUT
: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: 56rem;
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;
}README.md – ORPHAN_README
# GitTree Features documentation
This branch contains a documentation-only history for the fictional course project.
The landing page remains on main; no form submits information to a server.
Keep useful detached experiments under a branch name before switching away.local-review.txt – LOCAL_NOTE
Local rehearsal note; preserve this file.Reports/preview.txt – IGNORED_NOTE
Ignored rehearsal preview; preserve these bytes.In GitTree
Öffnen Sie die Palette mit Befehl+Umschalt+P (Strg+Umschalt+P bei Ubuntu).
- Klicken Sie in der ersten Kopie mit der rechten Maustaste auf das Commit M im Diagramm und wählen Sie Check Out This Commit. Die Zweigauswahl lautet „Getrennt um …“ und die Grafik zeigt HEAD, detached.
- Speichern Sie LAYOUT als
styles.css, stellen Sie diese Datei bereit und übergeben Sie sie mit der Zusammenfassungstyle: widen the hero reading measure. Das Panel zählt die Veränderung „am abgetrennten KOPF“, während Sie arbeiten. - Klicken Sie mit der rechten Maustaste auf das neue Commit und wählen Sie Create Branch Here…. Nennen Sie es
experiment/layout, lassen Sie die Option zum Auschecken ausgeschaltet und wählen Sie Create Branch. Der Hinweis lautet „Experiment/Layout erstellt“. und HEAD ist immer noch abgetrennt. - Klicken Sie mit der rechten Maustaste auf die Beschriftung
experiment/layoutund wählen Sie Check Out Branch. HEAD ist wieder angehängt,styles.cssist LAYOUT undmainzeigt immer noch auf M. - Dirty checkout. Trennen Sie in einer anderen Kopie bei
experiment/layout, bearbeiten Siestyles.cssin DIRTY_LAYOUT, ohne es zu bestätigen, und versuchen Sie,mainauszuchecken. Der Dialog „Lokale Änderungen stehen der Hauptdatei im Weg“ listet die Datei auf und bietet Commit First, Stash and Switch und Discard and Switch an. Wählen Sie „Abbrechen“; Durch das Verwerfen bleibt eine Kopie unterrefs/ogt/trash, ist hier aber nicht erforderlich. - Orphan. Führen Sie in der zweiten Kopie mit einem sauberen Arbeitsbaum Create Orphan Branch… aus der Palette aus. Unter „Eine verwaiste Filiale erstellen in …?“ Geben Sie
orphan-docsein. Das Dialogfeld gibt an, wie viele verfolgte Dateien den Arbeitsordner verlassen, welche nicht verfolgten und ignorierten Dateien verbleiben und dass der alte Commit unterrefs/ogt/trashaufbewahrt wird. Abbrechen hat den Fokus. Wählen Sie Create Orphan Branch. - In der Benachrichtigung heißt es: „Auf den neuen Orphan-Branch „Orphan-Docs“ umgestellt. Wechsel rückgängig machen.“ Der Ordner enthält keine nachverfolgten Dateien und das Diagramm zeigt kein Commit für den neuen Zweig. Erstellen Sie
README.mdaus ORPHAN_README, stellen Sie es bereit und übergeben Sie es mit der Zusammenfassungdocs: start the separate project guide. Der neue Commit hat kein übergeordnetes Element. - Vergleiche:
mainhat immer noch jedes Commit; Der verwaiste Zweig ist eine separate Wurzel. Drücken Sie keine Kopie.
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
Im ersten Exemplar:
BASE_SHA="$(git rev-parse main)"
git switch --detach "$BASE_SHA"
git symbolic-ref --quiet --short HEAD; echo $?Der letzte Befehl gibt 1 aus: HEAD ist kein Zweig. LAYOUT als styles.css speichern, dann:
git commit --quiet -am "style: widen the hero reading measure"
git branch experiment/layout
git symbolic-ref --quiet --short HEAD; echo $?
git rev-parse HEAD^ main
git switch --quiet experiment/layout
git symbolic-ref --short HEAD
git status --short1
experiment/layoutDer Erstellungsbefehl hängt HEAD nicht an (die zweite Abfrage gibt weiterhin 1 aus), die beiden IDs von rev-parse sind gleich (M) und der Status ist leer. Bearbeiten Sie in einer anderen, bei experiment/layout abgetrennten Kopie styles.css und führen Sie git switch main aus: Git weigert sich mit „Ihre lokalen Änderungen an den folgenden Dateien würden durch das Auschecken überschrieben werden“ und die Datei bleibt unberührt.
In der zweiten Kopie mit sauberem Baum:
git switch --orphan orphan-docs
git symbolic-ref --short HEAD
git rev-parse --verify --quiet HEAD; echo $?
git ls-filesorphan-docs
1Der Zweig existiert, hat aber kein Commit (rev-parse beendet 1) und ls-files gibt nichts aus. Verfolgte Dateien sind aus dem Ordner verschwunden, während local-review.txt und reports/ bestehen bleiben und nun als nicht verfolgt angezeigt werden. Erstellen Sie README.md, dann:
git add -- README.md
git commit --quiet -m "docs: start the separate project guide"
git ls-tree -r --name-only HEAD
git rev-list --max-parents=0 --count HEAD
git merge-base --all main orphan-docs; echo $?README.md
1
1Der neue Zweig hat einen Root-Commit und keinen gemeinsamen Vorfahren mit main (merge-base gibt nichts aus und beendet 1).
Ergebnis
Where you end: Das abgetrennte Commit heißt experiment/layout und ist ausgecheckt, main zeigt immer noch auf M und der Baum ist sauber. Die verwaiste Kopie hat orphan-docs mit einem Root-Commit ohne übergeordnetes Element, die alten verfolgten Dateien sind aus dem Ordner verschwunden, werden aber von main behalten, und es wurde nichts gepusht.
Häufige Fehler
- Festschreiben auf einem abgetrennten HEAD und Wechseln ohne Zweig, wodurch das Festschreiben nur über das Reflog erreichbar bleibt.
- Es wird erwartet, dass
Create Branch Here…zum neuen Zweig wechselt. - Starten Sie einen verwaisten Zweig mit nicht festgeschriebenen, nachverfolgten Änderungen oder denken Sie, dass dadurch
maingelöscht wird. - Angenommen, eine Datei, die ignoriert wurde, bleibt ignoriert, nachdem ihr
.gitignoreden Ordner verlässt.
Wenn etwas schief geht
Wenn Sie ein losgelöstes Commit ohne Namen hinterlassen haben, öffnen Sie das Reflog (Lektion 29) und legen Sie einen Zweig darauf ab. Wenn ein verwaister Zweig ein Fehler war, wechselt Undo zurück, während der neue Zweig kein Commit hat; Andernfalls schauen Sie sich main noch einmal an. Eine verweigerte Kasse ä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
Geben Sie an, wohin HEAD in jedem Status zeigt (Zweig, abgetrennt, ungeboren), die ID des abgetrennten Commits und des darauf befindlichen Zweigs sowie was git ls-files auf dem verwaisten Zweig ausgegeben hat. Sagen Sie dann voraus, was mit einer ignorierten Datei passiert, wenn .gitignore nicht mehr vorhanden ist.
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 losgelöster Commit benötigt einen Branch, um erreichbar zu bleiben.
- Ein verwaister Zweig startet einen separaten Stamm und entfernt verfolgte Dateien aus dem Ordner.
- Eine abgelehnte Kaufabwicklung schützt Ihre Bearbeitung.
Verwandt
Glossarbegriffe eingeführt
Freistehender KOPF – KOPF منفصل; Waisenzweig – فرع يتيم; ungeborener Zweig – فرع غير مولود; Root-Commit – nicht verfügbar.
Videotranskript
Die Erzählung des Videos, Stichwort für Stichwort.
Zeigen Sie das Transkript
- Wo ist HEAD? Drei Staaten.
- HEAD kann einen Zweig, ein Commit oder ein benennen Zweig ohne Commit noch.
- Ein Commit, der während der Trennung durchgeführt wird, ist real, aber nichts benennt es.
- Ein Zweig auf diesem Commit behält es erreichbar.
- Klicken Sie mit der rechten Maustaste auf das Commit-M und wählen Sie „Überprüfen“. Verlassen Sie diesen Commit.
- Ändern Sie das Stylesheet, stellen Sie es bereit und einmal verpflichten.
- Klicken Sie mit der rechten Maustaste auf das neue Commit und erstellen Sie ein Hier verzweigen, ohne es auszuprobieren.
- Schauen Sie sich jetzt die Filiale an. KOPF ist angebracht wieder.
- Bei einer nicht gespeicherten Bearbeitung erfolgt ein Auschecken abgelehnt. Abbrechen behält alles.
- Zuerst festschreiben, verstauen und wechseln, oder verwerfen. Wegwerfen ist das, was man vermeiden sollte.
- Für einen neuen Verlauf führen Sie „Orphan erstellen“ aus Verzweigen Sie von der Palette.
- Es zählt die verfolgten Dateien, die verlassen werden. Unverfolgte und ignorierte bleiben bestehen.
- Bestätigen. Der Ordner enthält keine nachverfolgten Dateien.
- Fügen Sie eine Readme-Datei hinzu und übernehmen Sie den Commit. Dieses Commit hat kein Elternteil.
- Im Terminal beendet symbolic-ref den Wert 1, wenn KOPF ist abgetrennt.
- Rev-Parse von HEAD auf einem ungeborenen Zweig scheitert.
- Nach dem Commit findet merge-base keine gemeinsamer Vorfahre.
- Wenn Sie ohne Zweig abgereist sind, erfolgt das Reflog Habe es immer noch.
- Übung: Nennen Sie dann HEAD in jedem Bundesstaat eine ignorierte Datei vorhersagen.
- Erholen Sie sich als Nächstes von Fehlern nach dem Drücken.