Es gibt hier eine Reihe von Antworten mit einer falschen Vorstellung über git reset --soft
. Es gibt zwar eine besondere Bedingung, unter der git reset --soft
wird sich nur ändern HEAD
(ausgehend von einem losgelösten Kopfzustand), typischerweise (und für den vorgesehenen Verwendungszweck), verschiebt er den Verweis auf den Zweig, den Sie gerade ausgecheckt haben. Natürlich kann es das nicht tun, wenn Sie keinen Zweig ausgecheckt haben (daher die spezielle Bedingung, bei der git reset --soft
wird sich nur ändern HEAD
).
Ich habe festgestellt, dass dies die beste Art ist, über folgende Dinge nachzudenken git reset
. Sie bewegen sich nicht nur HEAD
( alles tut das ), verschieben Sie auch die Filialreferenz , z.B., master
. Dies ist vergleichbar mit dem, was passiert, wenn Sie git commit
(der aktuelle Zweig bewegt sich mit HEAD
), nur dass anstelle der Erstellung (und des Wechsels zu) einer neu übertragen, gehen Sie zu einer vor verpflichten.
Dies ist der Sinn von reset
, die Änderung eines Zweigstelle auf etwas anderes als eine neue Übergabe, nicht die Änderung HEAD
. Sie können dies am Beispiel der Dokumentation sehen:
Eine Übergabe rückgängig machen und einen Themenzweig daraus machen
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Sie haben einige Übertragungen vorgenommen, stellen aber fest, dass es zu früh war, sie in den "Master"-Zweig aufzunehmen. Sie wollen sie in einem Themenzweig weiter bearbeiten, also erstellen Sie den Zweig "topic/wip" aus dem aktuellen HEAD.
- Spulen Sie den Master-Zweig zurück, um die drei Commits zu entfernen.
- Wechseln Sie zum Zweig "topic/wip" und arbeiten Sie weiter.
Was ist der Sinn dieser Befehlsserie? Sie wollen eine Zweigstelle , hier master
so haben Sie zwar master
ausgecheckt haben, führen Sie git reset
.
Die am häufigsten gewählte Antwort hier ist im Allgemeinen gut, aber ich dachte, ich füge dies hinzu, um die verschiedenen Antworten mit falschen Vorstellungen zu korrigieren.
Ändern Sie Ihre Branche
git reset --soft <ref>
: Setzt den Zweigzeiger für den aktuell ausgecheckten Zweig auf den Commit mit der angegebenen Referenz zurück, <ref>
. Die Dateien in Ihrem Arbeitsverzeichnis und Index werden nicht geändert. Ein Commit in diesem Stadium bringt Sie wieder dorthin zurück, wo Sie vor der Änderung waren. git reset
Befehl.
Ändern Sie auch Ihren Index
git reset --mixed <ref>
oder gleichwertig
git reset <ref>
:
Was bedeutet --soft
tut UND setzt auch den Index auf die Übereinstimmung mit der Übergabe an der angegebenen Referenz zurück. Während git reset --soft HEAD
bewirkt nichts (weil es heißt, dass der ausgecheckte Zweig in den ausgecheckten Zweig verschoben wird), git reset --mixed HEAD
, oder gleichwertig git reset HEAD
ist ein gängiger und nützlicher Befehl, da er den Index auf den Stand der letzten Übertragung zurücksetzt.
Ändern Sie auch Ihr Arbeitsverzeichnis
git reset --hard <ref>
Was tun? --mixed
tut UND überschreibt auch Ihr Arbeitsverzeichnis. Dieser Befehl ist vergleichbar mit git checkout <ref>
mit der Ausnahme, dass (und dies ist der entscheidende Punkt bei reset
) alle Formen von git reset
die Verzweigungsnummer verschieben HEAD
zeigt auf.
Ein Hinweis zu "dieser und jener Befehl bewegt den HEAD":
Es ist nicht sinnvoll, zu sagen, dass ein Befehl die HEAD
. Jeder Befehl, der die Position in Ihrem Commit-Verlauf ändert, verschiebt die HEAD
. Das ist es, was die HEAD
でございます einen Hinweis darauf, wo Sie sich befinden. HEAD
bist du und wird sich daher bewegen, wenn Sie es tun.