Ich möchte ein Commit aufteilen und bin mir nicht sicher, welche Reset-Option ich verwenden soll.
Ich habe mir die Seite angesehen . Was macht "git reset" im Klartext? , aber mir wurde klar, dass ich den Git-Index oder den Staging-Bereich nicht wirklich verstehe, und daher halfen die Erklärungen nicht.
Auch die Anwendungsfälle für --mixed
und --soft
sehen für mich in dieser Antwort gleich aus (wenn Sie das Problem beheben und erneut festlegen möchten). Kann jemand es noch mehr kaputt machen? Mir ist klar, dass dies --mixed
wahrscheinlich die Option ist, aber ich möchte wissen, warum . Und was ist mit --hard
?
Kann mir jemand ein Workflow-Beispiel geben, wie die Auswahl der drei Optionen erfolgen würde?
git
version-control
Michael Chinen
quelle
quelle
soft: stage everything
,mixed: unstage everything
,hard: ignore everything
bis zu dem Commit von ich zurückzusetzen.David Zych
mit klarer Erklärung - davidzych.com/difference-between-git-reset-soft-mixed-and-hardAntworten:
Wenn Sie eine Datei in Ihrem Repository ändern, wird die Änderung zunächst nicht bereitgestellt. Um es festzuschreiben, müssen Sie es mit bereitstellen, dh dem Index hinzufügen
git add
. Wenn Sie ein Commit durchführen, werden die Änderungen festgeschrieben, die dem Index hinzugefügt wurden.git reset
ändert mindestens, wohin der aktuelle Zweig (HEAD
) zeigt. Der Unterschied zwischen--mixed
und--soft
besteht darin, ob Ihr Index ebenfalls geändert wird oder nicht. Wenn wir alsomaster
mit dieser Reihe von Commits auf dem Ast sind :HEAD
zeigt aufC
und der Index stimmt übereinC
.Wenn wir laufen
git reset --soft B
, zeigtmaster
(und damitHEAD
) jetzt aufB
, aber der Index hat immer noch die Änderungen vonC
;git status
zeigt sie als inszeniert. Wenn wir alsogit commit
zu diesem Zeitpunkt ausgeführt werden, erhalten wir ein neues Commit mit den gleichen Änderungen wieC
.Okay, also wieder von hier aus:
Jetzt lass es uns tun
git reset --mixed B
. (Hinweis:--mixed
ist die Standardoption). Noch einmalmaster
undHEAD
zeigen Sie auf B, aber dieses Mal wird der Index auch so geändert, dass er übereinstimmtB
. Wenn wirgit commit
zu diesem Zeitpunkt ausgeführt werden, geschieht nichts, da der Index übereinstimmtHEAD
. Wir haben die Änderungen immer noch im Arbeitsverzeichnis, aber da sie nicht im Index enthalten sind,git status
werden sie als nicht bereitgestellt angezeigt. Um sie zu verpflichten, würden Siegit add
und dann wie gewohnt festlegen.Und schließlich
--hard
ist es dasselbe wie--mixed
(es ändert IhrHEAD
und den Index), außer dass--hard
auch Ihr Arbeitsverzeichnis geändert wird . Wenn wir aktiv sindC
und ausgeführt werdengit reset --hard B
, werden die hinzugefügten ÄnderungenC
sowie alle nicht festgeschriebenen Änderungen, die Sie vorgenommen haben, entfernt, und die Dateien in Ihrer Arbeitskopie stimmen mit dem Festschreiben übereinB
. Da Sie Änderungen auf diese Weise dauerhaft verlieren können, sollten Sie sie immer ausführen,git status
bevor Sie einen Hard-Reset durchführen, um sicherzustellen, dass Ihr Arbeitsverzeichnis sauber ist oder dass Sie Ihre nicht festgeschriebenen Änderungen verlieren können.Und zum Schluss noch eine Visualisierung:
quelle
reset --hard
sind für immer verschwunden.--mixed
Ändert Ihren Index, jedoch nicht Ihr Arbeitsverzeichnis, sodass lokale Änderungen davon nicht betroffen sind.- A - B - C′
, wobei C 'die gleichen Änderungen wie C enthält (mit unterschiedlichem Zeitstempel und möglicherweise Commit-Nachricht). 2 und 4 verlassen Sie mit- A - D
, wobei D die kombinierten Änderungen von B und C enthält.Im einfachsten Sinne:
--soft
: Änderungen nicht festschreiben , Änderungen bleiben inszeniert ( Index ).--mixed
(Standard) : Änderungen aufheben + Änderungen aufheben , Änderungen bleiben im Arbeitsbaum .--hard
: Uncit + Unstage + Änderungen löschen , nichts mehr übrig.quelle
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
(odergit 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 sindgit reset --mixed A
(odergit 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 werdengit reset --hard A
und Sie werden die Änderungen von B und C nirgendwo mehr sehen (als ob sie nie existiert hätten)quelle
git reset
nur das Aussehen dergit status
Ausgabe ändern .Alle anderen Antworten sind groß, aber ich finde es am besten , sie zu verstehen , indem Sie Dateien in drei Kategorien brechen:
unstaged
,staged
,commit
:--hard
sollte leicht zu verstehen sein, es stellt alles wieder her--mixed
(Standard) :unstaged
Dateien: nicht ändernstaged
Dateien: Verschieben nachunstaged
commit
Dateien: Verschieben nachunstaged
--soft
::unstaged
Dateien: nicht ändernstaged
Dateien: nicht änderncommit
Dateien: Verschieben nachstaged
Zusammenfassend:
--soft
Option verschiebt alles (außerunstaged
Dateien) instaging area
--mixed
Option verschiebt alles inunstaged area
quelle
Hier ist eine grundlegende Erklärung für TortoiseGit-Benutzer:
git reset --soft
und--mixed
lassen Sie Ihre Dateien unberührt.git reset --hard
Ändern Sie Ihre Dateien tatsächlich so , dass sie dem Commit entsprechen, auf das Sie zurückgesetzt haben.In TortoiseGit ist das Konzept des Index durch die GUI sehr verborgen. Wenn Sie eine Datei ändern, müssen Sie sie nicht ausführen
git add
, um die Änderung dem Staging-Bereich / Index hinzuzufügen. Wenn Sie einfach Änderungen an vorhandenen Dateien vornehmen, die die Dateinamen nicht änderngit reset --soft
und gleich--mixed
sind! Sie werden einen Unterschied nur bemerken, wenn Sie neue Dateien hinzugefügt oder Dateien umbenannt haben. In diesem Fall müssen Sie, wenn Sie git reset --mixed ausführen, Ihre Datei (en) erneut aus der Liste " Nicht versionierte Dateien" hinzufügen .quelle
--mixed
und verwirrt bin--soft
.In diesen Fällen mag ich ein Bild, das dies hoffentlich erklären kann:
git reset --[hard/mixed/soft]
::Jeder Effekt hat also unterschiedliche Bereiche
quelle
Drei Arten von Bedauern
Viele der vorhandenen Antworten scheinen die eigentliche Frage nicht zu beantworten. Es geht darum, was die Befehle tun, nicht darum, was Sie (der Benutzer) wollen - den Anwendungsfall . Aber darum hat das OP gebeten!
Es kann hilfreicher sein, die Beschreibung dahingehend zu formulieren, was genau Sie zum Zeitpunkt der Befehlserteilung bereuen
git reset
. Nehmen wir an, wir haben Folgendes:Hier sind einige mögliche Bedauern und was Sie dagegen tun können:
1. Ich bedauere, dass B, C und D kein einziges Commit sind.
git reset --soft A
. Ich kann jetzt sofort begehen und presto, werden alle Änderungen , die seit A sind ein begehen.2. Ich bedauere, dass B, C und D keine zehn Commits sind.
git reset --mixed A
. Die Commits sind weg und der Index ist wieder bei A, aber der Arbeitsbereich sieht immer noch so aus wie nach D. Jetzt kann ich in einer ganz anderen Gruppierung hinzufügen und festschreiben.3. Ich bedauere, dass B, C und D in diesem Zweig passiert sind . Ich wünschte, ich hätte mich nach A verzweigt und sie wären auf diesem anderen Zweig passiert.
Machen Sie einen neuen Zweig
otherbranch
und danngit reset --hard A
. Der aktuelle Zweig endet jetzt bei A undotherbranch
stammt daraus.(Natürlich können Sie auch einen Hard-Reset verwenden, da Sie sich wünschen, B, C und D wären noch nie passiert.)
quelle
Sie müssen sich nicht zwingen, sich an Unterschiede zwischen ihnen zu erinnern. Überlegen Sie, wie Sie tatsächlich eine Verpflichtung eingegangen sind.
1. Nehmen Sie einige Änderungen vor.
2.git hinzufügen.
3.gc -m "Ich habe etwas getan"
Mit Soft, Mixed und Hard können Sie die von Ihnen durchgeführten Operationen von 3 auf 1 aufgeben.
Soft "gab vor" nie zu sehen, dass Sie "gc -m" getan haben.
Gemischt "vorgetäuscht", nie zu sehen, dass Sie "git add" getan haben.
Schwer "vorgetäuscht", nie zu sehen, dass Sie Dateiänderungen vorgenommen haben.
quelle
Bevor man auf diese drei Optionen eingeht, muss man drei Dinge verstehen.
1) Geschichte / KOPF
2) Stufe / Index
3) Arbeitsverzeichnis
reset --soft: Verlauf geändert, HEAD geändert, Arbeitsverzeichnis nicht geändert.
reset --mixed: Verlauf geändert, HEAD geändert, Arbeitsverzeichnis mit nicht bereitgestellten Daten geändert.
reset --hard: Verlauf geändert, HEAD geändert, Arbeitsverzeichnis wird mit verlorenen Daten geändert.
Es ist immer sicher, mit Git --soft zu gehen. Bei komplexen Anforderungen sollte eine andere Option verwendet werden.
quelle
Hier gibt es eine Reihe von Antworten mit einem Missverständnis über
git reset --soft
. Während es einen bestimmten Zustand gibt, in demgit reset --soft
sich nurHEAD
(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 (dahergit reset --soft
ändert sich nur die spezifische BedingungHEAD
).Ich habe festgestellt, dass dies der beste Weg ist, darüber nachzudenken
git reset
. Sie bewegen sich nicht nurHEAD
( alles macht das ), Sie bewegen auch den Zweig ref , zmaster
. Dies ähnelt dem, was beim Ausführen passiertgit commit
(der aktuelle Zweig bewegt sich mitHEAD
), 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 wirdHEAD
. Sie können dies im Dokumentationsbeispiel sehen:Was ist der Sinn dieser Reihe von Befehlen? Sie möchten hier einen Zweig verschieben .
master
Während Siemaster
ausgecheckt haben, werden Sie ausgeführtgit 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 demgit 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. Whilegit reset --soft HEAD
tut nichts (weil es heißt, dass der ausgecheckte Zweig in den ausgecheckten Zweig verschoben wird)git reset --mixed HEAD
odergit 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 ähneltgit checkout <ref>
, mit der Ausnahme, dass (und dies ist der entscheidende Punktreset
) alle Formen dergit reset
Bewegung sind, auf die der Zweig refHEAD
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 denHEAD
. Das ist was dasHEAD
ist , ein Zeiger darauf, wo immer du bist.HEAD
bist du und wirst dich bewegen, wann immer du es tust.quelle
Eine kurze Antwort, in welchem Kontext die 3 Optionen verwendet werden:
So behalten Sie die aktuellen Änderungen im Code bei, schreiben jedoch den Festschreibungsverlauf neu:
soft
: Sie können alles auf einmal festschreiben und ein neues Festschreiben mit einer neuen Beschreibung erstellen (wenn Sie torotise git oder die meisten anderen GUIs verwenden, ist dies das zu verwendende, da Sie immer noch ankreuzen können, welche Dateien Sie im Festschreiben haben möchten, und mehrere erstellen können Commits auf diese Weise mit verschiedenen Dateien. In Sourcetree werden alle Dateien für das Commit bereitgestellt.)mixed
: Sie müssen die einzelnen Dateien erneut zum Index hinzufügen, bevor Sie Commits ausführen (in Sourcetree werden alle geänderten Dateien nicht bereitgestellt).So verlieren Sie auch Ihre Änderungen im Code:
hard
: Sie schreiben nicht nur den Verlauf neu, sondern verlieren auch alle Änderungen bis zu dem Punkt, den Sie zurückgesetzt habenquelle
Der grundlegende Unterschied zwischen verschiedenen Optionen des Befehls zum Zurücksetzen des Git ist wie folgt.
quelle
--soft
: Weist Git an, HEAD auf ein anderes Commit zurückzusetzen, damit der Index und das Arbeitsverzeichnis in keiner Weise geändert werden. Alle Dateien, die zwischen dem ursprünglichen HEAD und dem Commit geändert wurden, werden bereitgestellt.--mixed
: Genau wie beim Soft wird dadurch HEAD auf ein anderes Commit zurückgesetzt. Außerdem wird der Index zurückgesetzt, damit er mit ihm übereinstimmt, während das Arbeitsverzeichnis nicht berührt wird. Alle Änderungen bleiben im Arbeitsverzeichnis und werden als geändert angezeigt, jedoch nicht bereitgestellt.--hard
: Dies setzt alles zurück - es setzt HEAD auf ein anderes Commit zurück, setzt den Index zurück, um mit ihm übereinzustimmen, und setzt das Arbeitsverzeichnis zurück, um ebenfalls mit ihm übereinzustimmen.Der Hauptunterschied zwischen
--mixed
und--soft
besteht darin, ob Ihr Index ebenfalls geändert wird oder nicht. Weitere Informationen hierzu finden Sie hier .quelle
mkaraseks Antwort ist großartig, in einfachen Worten können wir sagen ...
git reset --soft
: Setzen Sie dasHEAD
auf das beabsichtigte Commit, aber behalten Sie Ihre Änderungen aus den letzten Commits beigit reset --mixed
: Es ist dasselbe wie,git reset --soft
aber der einzige Unterschied besteht darin, dass Ihre Änderungen gegenüber den letzten Commits nicht mehr vorgenommen werdengit reset --hard
: Setzen Sie Ihre OptionHEAD
auf das von Ihnen angegebene Commit und setzen Sie alle Änderungen aus den letzten Commits zurück, einschließlich nicht festgeschriebener Änderungen.quelle