Was macht "git reset" im Klartext?

673

Ich habe interessante Beiträge gesehen , in denen Feinheiten erklärt wurden git reset.

Je mehr ich darüber lese, desto mehr scheint es leider, dass ich es nicht vollständig verstehe. Ich komme aus einem SVN-Hintergrund und Git ist ein ganz neues Paradigma. Ich habe leicht Quecksilber bekommen, aber Git ist viel technischer.

Ich denke, git resetist nah dran hg revert, aber es scheint, dass es Unterschiede gibt.

Was genau macht es git resetalso? Bitte geben Sie detaillierte Erklärungen zu:

  • die Optionen --hard, --softund --merge;
  • die seltsame Notation, die Sie mit HEADsolchen wie HEAD^und verwenden HEAD~1;
  • konkrete Anwendungsfälle und Arbeitsabläufe;
  • Konsequenzen für die Arbeitskopie, das HEADund Ihr globales Stresslevel.
e-satis
quelle
17
Ich denke, eine Visual Git-Referenz gibt einen guten Einblick in das, was passiert, wenn allgemeine Git-Befehle verwendet werden.

Antworten:

992

Im Allgemeinen besteht git resetdie Funktion darin, den aktuellen Zweig zu nehmen und ihn auf einen anderen Punkt zurückzusetzen und möglicherweise den Index und den Arbeitsbaum mitzubringen. Genauer gesagt, wenn Ihre Hauptniederlassung (derzeit ausgecheckt) so ist:

- A - B - C (HEAD, master)

und Sie erkennen, dass der Meister auf B und nicht auf C zeigen soll. Sie werden ihn verwenden git reset B, um ihn dorthin zu verschieben:

- A - B (HEAD, master)      # - C is still here, but there's no branch pointing to it anymore

Exkurs: Dies unterscheidet sich von einer Kasse. Wenn du rennen würdest git checkout B, würdest du folgendes bekommen:

- A - B (HEAD) - C (master)

Sie sind in einem getrennten HEAD-Zustand gelandet. HEAD, Arbeitsbaum, Index alle übereinstimmen B, aber der Hauptzweig wurde bei zurückgelassen C. Wenn Sie Dzu diesem Zeitpunkt ein neues Commit durchführen , erhalten Sie dieses, was wahrscheinlich nicht das ist, was Sie wollen:

- A - B - C (master)
       \
        D (HEAD)

Denken Sie daran, dass beim Zurücksetzen keine Festschreibungen vorgenommen werden. Es wird lediglich ein Zweig (der ein Zeiger auf eine Festschreibung ist) aktualisiert, um auf eine andere Festschreibung zu verweisen. Der Rest ist nur ein Detail dessen, was mit Ihrem Index und Arbeitsbaum passiert.

Anwendungsfälle

Ich beschreibe viele der Hauptanwendungsfälle git resetin meinen Beschreibungen der verschiedenen Optionen im nächsten Abschnitt. Es kann wirklich für eine Vielzahl von Dingen verwendet werden; Der gemeinsame Thread besteht darin, dass bei allen der Zweig, der Index und / oder der Arbeitsbaum zurückgesetzt werden, um auf ein bestimmtes Commit zu verweisen oder mit diesem übereinzustimmen.

Dinge, auf die man achten muss

  • --hardkann dazu führen, dass Sie wirklich Arbeit verlieren. Es ändert Ihren Arbeitsbaum.

  • git reset [options] commitkann dazu führen, dass Sie Commits (irgendwie) verlieren. Im obigen Spielzeugbeispiel haben wir das Commit verloren C. Es befindet sich immer noch im Repo, und Sie können es finden, indem Sie auf git reflog show HEADoder schauen git reflog show master, aber es ist von keiner Filiale aus mehr zugänglich.

  • Git löscht solche Commits nach 30 Tagen dauerhaft, aber bis dahin können Sie C wiederherstellen, indem Sie erneut auf einen Zweig zeigen ( git checkout C; git branch <new branch name>).

Argumente

Um die Manpage zu paraphrasieren, wird am häufigsten das Formular verwendet git reset [<commit>] [paths...], mit dem die angegebenen Pfade aus dem angegebenen Commit auf ihren Status zurückgesetzt werden. Wenn die Pfade nicht bereitgestellt werden, wird der gesamte Baum zurückgesetzt, und wenn das Commit nicht bereitgestellt wird, wird es als HEAD (das aktuelle Commit) angesehen. Dies ist ein allgemeines Muster für Git-Befehle (z. B. Auschecken, Diff, Protokollieren, obwohl die genaue Semantik variiert), daher sollte es nicht allzu überraschend sein.

Zum Beispiel git reset other-branch path/to/fooalles setzt in path / to / foo in seinen Zustand in anderem Zweig, git reset -- .setzt das aktuelle Verzeichnis auf seinen Zustand in HEAD, und ein einfaches git resetsetzt alles auf seinen Zustand in dem Kopf.

Der Hauptarbeitsbaum und die Indexoptionen

Es gibt vier Hauptoptionen, um zu steuern, was während des Zurücksetzens mit Ihrem Arbeitsbaum und Index passiert.

Denken Sie daran, dass der Index der "Staging-Bereich" von git ist - hier gehen die Dinge, wenn Sie git addin Vorbereitung auf das Festschreiben sagen .

  • --hardpasst alles zu dem Commit, auf das Sie zurückgesetzt haben. Dies ist wahrscheinlich am einfachsten zu verstehen. Alle Ihre lokalen Änderungen werden blockiert. Eine Hauptanwendung besteht darin, Ihre Arbeit wegzublasen, aber keine Commits zu wechseln: git reset --hardbedeutet git reset --hard HEAD, dass Sie den Zweig nicht ändern, sondern alle lokalen Änderungen entfernen . Das andere ist einfach, einen Zweig von einem Ort zum anderen zu verschieben und den Index / Arbeitsbaum synchron zu halten. Dies ist derjenige, der Sie wirklich dazu bringen kann, Arbeit zu verlieren, weil er Ihren Arbeitsbaum ändert. Seien Sie sehr, sehr sicher, dass Sie lokale Arbeit wegwerfen möchten, bevor Sie welche ausführen reset --hard.

  • --mixedist die Standardeinstellung, dh git resetbedeutet git reset --mixed. Es setzt den Index zurück, aber nicht den Arbeitsbaum. Dies bedeutet, dass alle Ihre Dateien intakt sind, aber alle Unterschiede zwischen dem ursprünglichen Commit und dem, auf das Sie zurückgesetzt wurden, als lokale Änderungen (oder nicht verfolgte Dateien) mit Git-Status angezeigt werden. Verwenden Sie diese Option, wenn Sie feststellen, dass Sie einige schlechte Commits durchgeführt haben, aber die gesamte geleistete Arbeit beibehalten möchten, damit Sie sie beheben und erneut festlegen können. Zum Festschreiben müssen Sie dem Index erneut Dateien hinzufügen ( git add ...).

  • --softBerührt den Index oder den Arbeitsbaum nicht. Alle Ihre Dateien sind wie bei intakt --mixed, aber alle Änderungen werden wie changes to be committedbeim Git-Status angezeigt (dh zur Vorbereitung auf das Festschreiben eingecheckt). Verwenden Sie diese Option, wenn Sie feststellen, dass Sie einige schlechte Verpflichtungen eingegangen sind, die Arbeit jedoch gut ist. Sie müssen sie lediglich anders festlegen. Der Index bleibt unberührt, sodass Sie sofort ein Commit durchführen können, wenn Sie möchten. Das resultierende Commit hat denselben Inhalt wie vor dem Zurücksetzen.

  • --mergewurde kürzlich hinzugefügt und soll Ihnen helfen, eine fehlgeschlagene Zusammenführung abzubrechen. Dies ist erforderlich, da Sie git mergetatsächlich eine Zusammenführung mit einem Dirty-Work-Baum (einer mit lokalen Änderungen) versuchen können, solange sich diese Änderungen in Dateien befinden, die von der Zusammenführung nicht betroffen sind. git reset --mergeSetzt den Index zurück (wie --mixed- alle Änderungen werden als lokale Änderungen angezeigt) und setzt die von der Zusammenführung betroffenen Dateien zurück, lässt die anderen jedoch in Ruhe. Dies wird hoffentlich alles wieder so machen, wie es vor der schlechten Zusammenführung war. Normalerweise verwenden Sie es als git reset --merge(Bedeutung git reset --merge HEAD), da Sie nur die Zusammenführung zurücksetzen und den Zweig nicht verschieben möchten. ( HEADwurde noch nicht aktualisiert, da die Zusammenführung fehlgeschlagen ist)

    Nehmen wir an, Sie haben die Dateien A und B geändert und versuchen, in einem Zweig zusammenzuführen, der die Dateien C und D geändert hat. Die Zusammenführung schlägt aus irgendeinem Grund fehl und Sie entscheiden, sie abzubrechen. Sie verwenden git reset --merge. Es bringt C und D zurück zu dem, in dem sie sich befanden HEAD, lässt jedoch Ihre Änderungen an A und B in Ruhe, da sie nicht Teil der versuchten Zusammenführung waren.

Möchten Sie mehr wissen?

Ich denke, das man git resetist wirklich ziemlich gut dafür - vielleicht brauchst du ein bisschen Verständnis dafür, wie Git funktioniert, damit sie wirklich eintauchen. Insbesondere wenn Sie sich die Zeit nehmen, sie sorgfältig zu lesen, sind diese Tabellen, in denen der Status der Dateien im Index und im Arbeitsbaum für alle verschiedenen Optionen und Fälle aufgeführt ist, sehr, sehr hilfreich. (Aber ja, sie sind sehr dicht - sie vermitteln eine Menge der oben genannten Informationen in einer sehr präzisen Form.)

Seltsame Notation

Die "seltsame Notation" ( HEAD^und HEAD~1), die Sie erwähnen, ist lediglich eine Abkürzung für die Angabe von Commits, ohne einen Hash-Namen wie verwenden zu müssen 3ebe3f6. Es ist vollständig dokumentiert im Abschnitt "Festlegen von Revisionen" der Manpage für git-rev-parse mit vielen Beispielen und zugehöriger Syntax. Das Caret und die Tilde bedeuten eigentlich verschiedene Dinge :

  • HEAD~ist die Abkürzung für HEAD~1und bedeutet das erste übergeordnete Element des Commits. HEAD~2bedeutet das erste Elternteil des Commits. Stellen Sie sich HEAD~n"n Commits vor HEAD" oder "den Vorfahren der n-ten Generation von HEAD" vor.
  • HEAD^(oder HEAD^1) bedeutet auch das erste übergeordnete Element des Commits. HEAD^2bedeutet das zweite übergeordnete Element des Commits . Denken Sie daran, dass ein normales Zusammenführungs-Commit zwei übergeordnete Elemente hat - das erste übergeordnete Element ist das zusammengeführte Commit und das zweite übergeordnete Element ist das festgeschriebene Commit. Im Allgemeinen können Zusammenführungen tatsächlich beliebig viele Eltern haben (Octopus-Zusammenführungen).
  • Die ^und ~Betreiber können aneinandergereiht werden, wie in HEAD~3^2den zweit Eltern des dritten Generation Vorfahren HEAD, HEAD^^2die zweite Mutter des ersten Elternteil HEADoder sogar HEAD^^^, was gleichwertig ist HEAD~3.

Caret und Tilde

Cascabel
quelle
"Sie werden Git Reset verwenden, um es dorthin zu verschieben." Warum benutzt du nicht Git Checkout, um das zu tun?
E-Satis
5
@ e-satis: git checkout bewegt HEAD, lässt aber den Zweig dort, wo er war. Dies ist der Fall, wenn Sie den Zweig verschieben möchten.
Cascabel
Wenn ich es gut verstehe, würde das Zurücksetzen von B Folgendes bewirken: - A - B - C - B (Master), während die Kasse B - A - B (Master) ausführen würde?
E-Satis
32
Die Dokumente sind gut, obwohl es ewig dauert, sie zu lesen, und sie sind sehr dicht und es dauert ewig, um zu überprüfen, ob sie sagen, dass es funktioniert, als ob Sie bereits wissen, wie es funktioniert. Klingt nicht so, als wären die Dokumente gut für mich ...
Kirby
4
Eine sehr einfache und verständliche Erklärung liefert diese SO-Antwort: stackoverflow.com/questions/3528245/whats-the-difference-between-git-reset-mixed-soft-and-hard
Nitin Bansal
80

Denken gitSie daran, dass in Ihnen haben:

  • der HEADZeiger , der Ihnen sagt, an welchem ​​Commit Sie arbeiten
  • Der Arbeitsbaum , der den Status der Dateien auf Ihrem System darstellt
  • der Staging-Bereich (auch als Index bezeichnet ), der Änderungen "inszeniert", damit sie später gemeinsam festgeschrieben werden können

Bitte geben Sie detaillierte Erklärungen zu:

--hard, --softUnd --merge;

In aufsteigender Reihenfolge der Gefährlichkeit:

  • --softbewegt sich HEAD, berührt aber nicht den Bereitstellungsbereich oder den Arbeitsbaum.
  • --mixedVerschiebt HEADund aktualisiert den Staging-Bereich, jedoch nicht den Arbeitsbaum.
  • --mergebewegt HEAD, setzt den Staging - Bereich, und versucht , alle Änderungen in Ihrem Arbeits Baum in den neuen Arbeits Baum zu bewegen.
  • --hardVerschiebt HEAD und passt Ihren Bereitstellungsbereich und Ihren Arbeitsbaum an den neuen an HEADund wirft alles weg.

konkrete Anwendungsfälle und Workflows;

  • Verwenden --softSie diese Option, wenn Sie zu einem anderen Commit wechseln und die Dinge reparieren möchten, ohne "Ihren Platz zu verlieren". Es ist ziemlich selten, dass Sie das brauchen.

- -

# git reset --soft example
touch foo                            // Add a file, make some changes.
git add foo                          // 
git commit -m "bad commit message"   // Commit... D'oh, that was a mistake!
git reset --soft HEAD^               // Go back one commit and fix things.
git commit -m "good commit"          // There, now it's right.

- -

  • Verwenden Sie --mixed(dies ist die Standardeinstellung), wenn Sie sehen möchten, wie die Dinge bei einem anderen Commit aussehen, aber keine Änderungen verlieren möchten, die Sie bereits haben.

  • Verwenden --mergeSie diese Option, wenn Sie an einen neuen Ort wechseln möchten, die bereits vorhandenen Änderungen jedoch in den Arbeitsbaum integrieren möchten.

  • Verwenden Sie --harddiese Option, um alles auszulöschen und beim neuen Commit eine neue Tabelle zu erstellen.

John Feminella
quelle
2
Das ist nicht der beabsichtigte Anwendungsfall für reset --merge. Es wird keine Drei-Wege-Zusammenführung durchgeführt. Es ist wirklich nur zum Zurücksetzen von Konflikten, wie in den Dokumenten beschrieben. Sie möchten verwenden checkout --merge, um das zu tun, wovon Sie sprechen. Wenn Sie den Zweig auch verschieben möchten, besteht die einzige Möglichkeit meiner Meinung nach darin, ein Auschecken / Zurücksetzen durchzuführen, um ihn mit sich zu ziehen.
Cascabel
@Jefromi »Ja, das habe ich nicht sehr gut formuliert. Mit "einem neuen Ort" meinte ich "einen neuen Ort, an dem es keine Konflikte gibt".
John Feminella
1
Ah ich sehe. Ich denke, das Wichtigste dabei ist, dass Sie, wenn Sie nicht wirklich wissen, was Sie tun, wahrscheinlich nie reset --mergemit einem anderen Ziel (der Standardeinstellung) arbeiten möchten HEAD, da es in Fällen, in denen es nicht nur zu einem Abbruch einer Konfliktzusammenführung kommt, weggeworfen wird Informationen, die Sie sonst speichern könnten.
Cascabel
2
Ich fand diese Antwort am einfachsten und hilfreichsten
Jazzepi
Bitte fügen Sie Informationen zu diesen Befehlen hinzu: git resetund git reset -- ..
Flimm
35

Der Beitrag Reset Demystified im Blog Pro Git bietet eine sehr einfache Erklärung zu git resetund git checkout.

Nach all den hilfreichen Diskussionen oben in diesem Beitrag reduziert der Autor die Regeln auf die folgenden einfachen drei Schritte:

Das ist es im Grunde. Der resetBefehl überschreibt diese drei Bäume in einer bestimmten Reihenfolge und stoppt, wenn Sie dazu aufgefordert werden.

  1. Bewegen Sie den Zweig, auf den HEAD zeigt (stop if --soft)
  2. DANN lassen Sie den Index so aussehen (hören Sie hier auf, es sei denn --hard)
  3. DANN lassen Sie das Arbeitsverzeichnis so aussehen

Es gibt auch --mergeund --keepOptionen, aber ich würde die Dinge vorerst lieber einfacher halten - das wird für einen anderen Artikel sein.

Daniel Hershcovich
quelle
25

Wenn Sie etwas für Git festlegen, müssen Sie zuerst Ihre Änderungen inszenieren (zum Index hinzufügen). Dies bedeutet, dass Sie git alle Dateien hinzufügen müssen, die in dieses Commit aufgenommen werden sollen, bevor git sie als Teil des Commits betrachtet. Schauen wir uns zuerst das Bild eines Git-Repo an: Geben Sie hier die Bildbeschreibung ein

Also, es ist jetzt einfach. Wir müssen im Arbeitsverzeichnis arbeiten, Dateien, Verzeichnisse und alles erstellen. Diese Änderungen sind nicht verfolgte Änderungen. Um sie nachverfolgen zu können, müssen wir sie mit dem Befehl git add zum Git-Index hinzufügen . Sobald sie zum Git-Index hinzugefügt wurden. Wir können diese Änderungen jetzt festschreiben, wenn wir sie in das Git-Repository verschieben möchten.

Aber plötzlich erfuhren wir beim Festschreiben, dass wir eine zusätzliche Datei haben, die wir im Index hinzugefügt haben, die nicht erforderlich ist, um das Git-Repository einzuschieben. Das heißt, wir wollen diese Datei nicht im Index haben. Die Frage ist nun, wie diese Datei aus dem Git-Index entfernt werden kann. Da wir Git Add verwendet haben , um sie in den Index aufzunehmen, wäre es logisch, Git RM zu verwenden . Falsch! git rm löscht einfach die Datei und fügt die Löschung dem Index hinzu. Was ist jetzt zu tun?

Verwenden:-

Git zurücksetzen

Es löscht Ihren Index und lässt Ihr Arbeitsverzeichnis unberührt. (einfach alles aufheben).

Es kann mit einer Reihe von Optionen verwendet werden. Es gibt drei Hauptoptionen für das Zurücksetzen von Git: --hard, --soft und --mixed . Diese wirken sich beim Zurücksetzen zusätzlich zum HEAD-Zeiger auf das Zurücksetzen von get aus.

Erstens setzt --hard alles zurück. Ihr aktuelles Verzeichnis wäre genau so, als ob Sie diesem Zweig die ganze Zeit gefolgt wären. Das Arbeitsverzeichnis und der Index werden in dieses Commit geändert. Dies ist die Version, die ich am häufigsten benutze. git reset --hard ist so etwas wie svn revert .

Als nächstes setzt das genaue Gegenteil - Soft - weder den Arbeitsbaum noch den Index zurück. Es bewegt nur den HEAD-Zeiger. Dadurch bleiben in Ihrem aktuellen Status alle Änderungen, die sich von dem Commit unterscheiden, zu dem Sie wechseln, in Ihrem Verzeichnis gespeichert und für das Commit „inszeniert“. Wenn Sie lokal ein Commit durchführen, das Commit jedoch nicht auf den Git-Server übertragen haben, können Sie es auf das vorherige Commit zurücksetzen und mit einer guten Commit-Nachricht erneut festschreiben.

Schließlich setzt --mixed den Index zurück, nicht jedoch den Arbeitsbaum. Die Änderungen sind also alle noch vorhanden, aber "nicht inszeniert" und müssten git hinzugefügt oder git commit -a sein . Wir verwenden dies manchmal, wenn wir mit git commit -a mehr als beabsichtigt festgelegt haben. Wir können das Commit mit git reset --mixed zurücksetzen, die Dinge hinzufügen, die wir festschreiben möchten, und diese einfach festschreiben.

Unterschied zwischen Git Revert und Git Reset : -


Mit einfachen Worten, git reset ist ein Befehl zum Beheben von nicht festgeschriebenen Fehlern und git revert ist ein Befehl zum Beheben von festgeschriebenen Fehlern .

Es bedeutet, wenn wir bei einer Änderung einen Fehler gemacht und diesen festgeschrieben und auf git repo verschoben haben, dann ist git revert die Lösung. Und falls wir vor dem Push / Commit denselben Fehler festgestellt haben, können wir das Problem mit git reset beheben.

Ich hoffe, es wird Ihnen helfen, Ihre Verwirrung loszuwerden.

Liebe
quelle
2
Dies ist eine nette einfache englische Antwort, wie von OP gefragt.
Episodex
1
Auch wenn ich das in Ihrer Antwort vielleicht übersehen habe. Was ist git reset HEADstandardmäßig? --hard, --softOder --mixed? Tolle Antwort übrigens.
Giannis Christofakis
1
Tolle Antwort, aber ich würde klarer machen, git reset --harddass Sie einige Daten verlieren. Und es gibt einen Punkt, der falsch sein könnte (obwohl ich nicht 100% sicher bin ... lerne noch!): --mixedWenn Sie über Sie sprechen, sagen Sie: "Wir verwenden dies manchmal, wenn wir mehr begangen haben, als wir mit git commit -a beabsichtigt hatten." Meinten Sie: "Wenn wir mehr inszenieren würden , als wir wollten git stage ."? Wenn Sie es wirklich begangen haben, denke ich, dass es zu spät ist (wie Sie am Ende sagen, ist Git Reset ein Befehl, um "nicht festgeschriebene Fehler zu beheben")
Fabio sagt Reinstate Monica
6

TL; DR

git resetSetzt Staging auf das letzte Commit zurück. Verwenden Sie --harddiese Option, um auch Dateien in Ihrem Arbeitsverzeichnis auf das letzte Festschreiben zurückzusetzen.

LÄNGERE VERSION

Aber das ist offensichtlich simpel, daher die vielen ziemlich ausführlichen Antworten. Für mich war es sinnvoller, git resetim Zusammenhang mit dem Rückgängigmachen von Änderungen nachzulesen . ZB sehen Sie dies:

Wenn das Zurücksetzen von Git ein "sicherer" Weg ist, um Änderungen rückgängig zu machen, können Sie sich das Zurücksetzen von Git als gefährliche Methode vorstellen. Wenn Sie mit git reset rückgängig machen (und die Commits nicht mehr von einem Verweis oder dem Reflog referenziert werden), gibt es keine Möglichkeit, die Originalkopie abzurufen - es handelt sich um ein dauerhaftes Rückgängigmachen. Bei der Verwendung dieses Tools ist Vorsicht geboten, da es einer der wenigen Git-Befehle ist, die möglicherweise Ihre Arbeit verlieren.

Von https://www.atlassian.com/git/tutorials/undoing-changes/git-reset

und das

Auf der Commit-Ebene ist das Zurücksetzen eine Möglichkeit, die Spitze eines Zweigs auf ein anderes Commit zu verschieben. Dies kann verwendet werden, um Commits aus dem aktuellen Zweig zu entfernen.

Unter https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting/commit-level-operations

Snowcrash
quelle
2

Bitte beachten Sie, dass dies eine vereinfachte Erklärung ist, die als erster Schritt zum Verständnis dieser komplexen Funktionalität gedacht ist.

Kann für visuelle Lernende hilfreich sein, die nach jedem dieser Befehle visualisieren möchten, wie ihr Projektstatus aussieht:


Für diejenigen, die Terminal mit aktivierter Farbe verwenden (git config --global color.ui auto):

git reset --soft A und Sie werden B und Cs Zeug in Grün sehen (inszeniert und bereit zu begehen)

git reset --mixed A(oder git reset A) und Sie werden B und Cs Zeug in Rot sehen (nicht inszeniert und bereit, inszeniert zu werden (grün) und dann festgeschrieben)

git reset --hard A und Sie werden die Änderungen von B und C nirgendwo mehr sehen (als ob sie nie existiert hätten)


Oder für diejenigen, die ein GUI-Programm wie 'Tower' oder 'SourceTree' verwenden.

git reset --soft A und Sie werden die Inhalte von B und C im Bereich "Bereitgestellte Dateien" sehen, die zum Festschreiben bereit sind

git reset --mixed A(oder git reset A) und Sie sehen die Inhalte von B und C im Bereich "Nicht bereitgestellte Dateien", die bereit sind, in "Bereitgestellt" verschoben und dann festgeschrieben zu werden

git reset --hard A und Sie werden die Änderungen von B und C nirgendwo mehr sehen (als ob sie nie existiert hätten)

timhc22
quelle
1

Die Kasse zeigt den Kopf auf ein bestimmtes Commit.

Zurücksetzen zeigt einen Zweig auf ein bestimmtes Commit. (Ein Zweig ist ein Zeiger auf ein Commit.)

Übrigens, wenn Ihr Kopf nicht auf ein Commit zeigt, auf das auch ein Zweig zeigt, haben Sie einen abgetrennten Kopf. (stellte sich als falsch heraus. Siehe Kommentare ...)

Ian Warburton
quelle
1
Nicht zu nitpick, aber (ja, in der Tat es ist Erbsenzählerei , sondern fügen wir es für den Abschluss) Ihre dritte Satz technisch falsch ist. Angenommen, Ihr HEAD zeigt auf Zweig B, der wiederum auf Commit abc123 zeigt. Wenn Sie jetzt Commit abc123 auschecken, zeigen Ihr HEAD und Zweig B beide auf Commit abc123 UND Ihr HEAD ist getrennt. Durch Festschreiben an dieser Stelle wird die Position von Zweig B nicht aktualisiert. Sie hätten sagen können: "Wenn Ihr Kopf nicht auf einen Ast zeigt, haben Sie einen abgetrennten Kopf"
RomainValeri
@RomainValeri Was wird das Commit unter diesen Umständen tun?
Ian Warburton
1
Durch das Festschreiben werden Festschreibungen erstellt, auf die von keinem Zweig verwiesen wird, und Zweig B verweist auch dann auf dasselbe Festschreiben abc123, wenn Sie danach mehrere Male festgeschrieben haben. Dies bedeutet, dass diese Commits zu Kandidaten für die Speicherbereinigung werden, wenn HEAD nicht mehr auf das letzte Commit in dieser "wilden" Reihe von Commits zeigt.
RomainValeri