Hier gibt es eine Reihe von Antworten mit einem Missverständnis über git reset --soft
. Während es einen bestimmten Zustand gibt, in dem git reset --soft
sich nur HEAD
(ausgehend von einem Zustand mit abgenommenem Kopf) normalerweise (und für den beabsichtigten Gebrauch) etwas ändert , wird die aktuell ausgecheckte Zweigreferenz verschoben. Dies ist natürlich nicht möglich, wenn Sie keinen Zweig ausgecheckt haben (daher git reset --soft
ändert sich nur die spezifische Bedingung HEAD
).
Ich habe festgestellt, dass dies der beste Weg ist, darüber nachzudenken git reset
. Sie bewegen sich nicht nur HEAD
( alles macht das ), Sie bewegen auch den Zweig ref , z master
. Dies ähnelt dem, was beim Ausführen passiert git commit
(der aktuelle Zweig bewegt sich mit HEAD
), außer dass Sie, anstatt ein neues Commit zu erstellen (und zu diesem zu wechseln), zu einem vorherigen Commit wechseln .
Dies ist der Punkt reset
, an dem ein Zweig in etwas anderes als ein neues Commit geändert wird und nicht geändert wird HEAD
. Sie können dies im Dokumentationsbeispiel sehen:
Machen Sie ein Commit rückgängig und machen Sie es zu einem Themenzweig
$ git branch topic/wip (1)
$ git reset --hard HEAD~3 (2)
$ git checkout topic/wip (3)
- Sie haben einige Verpflichtungen eingegangen, stellen jedoch fest, dass sie verfrüht waren, um im "Master" -Zweig zu sein. Sie möchten sie in einem Themenzweig weiter polieren, erstellen Sie also einen "Topic / Wip" -Zweig aus dem aktuellen HEAD.
- Spulen Sie den Hauptzweig zurück, um diese drei Commits zu entfernen.
- Wechseln Sie zum Zweig "Thema / Löschen" und arbeiten Sie weiter.
Was ist der Sinn dieser Reihe von Befehlen? Sie möchten hier einen Zweig verschieben . master
Während Sie master
ausgecheckt haben, werden Sie ausgeführt git reset
.
Die Antwort mit der höchsten Bewertung hier ist im Allgemeinen gut, aber ich dachte, ich würde dies hinzufügen, um die verschiedenen Antworten mit falschen Vorstellungen zu korrigieren.
Ändern Sie Ihren Zweig
git reset --soft <ref>
: Setzt den Verzweigungszeiger für den aktuell ausgecheckten Zweig auf das Commit an der angegebenen Referenz zurück <ref>
. Dateien in Ihrem Arbeitsverzeichnis und Index werden nicht geändert. Wenn Sie sich ab dieser Phase festlegen, kehren Sie direkt dorthin zurück, wo Sie vor dem git reset
Befehl waren.
Ändern Sie auch Ihren Index
git reset --mixed <ref>
oder äquivalent
git reset <ref>
::
Tut was --soft
macht UND setzt auch den Index so zurück, dass er mit dem Commit an der angegebenen Referenz übereinstimmt. While git reset --soft HEAD
tut nichts (weil es heißt, dass der ausgecheckte Zweig in den ausgecheckten Zweig verschoben wird) git reset --mixed HEAD
oder git reset HEAD
ist ein gleichwertiger und nützlicher Befehl, da der Index auf den Status Ihres letzten Commits zurückgesetzt wird.
Ändern Sie auch Ihr Arbeitsverzeichnis
git reset --hard <ref>
: macht was --mixed
macht UND überschreibt auch Ihr Arbeitsverzeichnis. Dieser Befehl ähnelt git checkout <ref>
, mit der Ausnahme, dass (und dies ist der entscheidende Punkt reset
) alle Formen der git reset
Bewegung sind, auf die der Zweig ref HEAD
zeigt.
Ein Hinweis zu "so und so Befehl bewegt den KOPF":
Es ist nicht sinnvoll zu sagen, dass ein Befehl das bewegt HEAD
. Jeder Befehl, der ändert, wo Sie sich in Ihrem Commit-Verlauf befinden, verschiebt den HEAD
. Das ist was das HEAD
ist , ein Zeiger darauf, wo immer du bist. HEAD
bist du und wirst dich bewegen, wann immer du es tust.