1170 Stimmen

Was ist der Unterschied zwischen git reset --mixed, --soft und -hard?

Ich möchte eine Übertragung aufteilen und bin mir nicht sicher, welche Rücksetzoption ich verwenden soll.

Ich habe mir die Seite angesehen Was bedeutet "git reset" im Klartext? aber ich habe gemerkt, dass ich nicht wirklich verstehe, was der Git-Index oder der Staging-Bereich ist, und daher waren die Erklärungen nicht hilfreich.

Auch die Anwendungsfälle für --mixed y --soft sehen für mich in dieser Antwort gleich aus (wenn Sie die Sache in Ordnung bringen und erneut in Angriff nehmen wollen). Kann das jemand noch weiter aufschlüsseln? Mir ist klar --mixed ist wahrscheinlich die beste Lösung, aber ich möchte wissen warum . Und schließlich, was ist mit --hard ?

Kann mir jemand ein Beispiel für einen Arbeitsablauf geben, wie die Auswahl der 3 Optionen erfolgen würde?

55voto

Tomer Ben David Punkte 7227

In diesen Fällen mag ich ein Bild, das dies hoffentlich erklären kann:

git reset --[hard/mixed/soft] :

enter image description here

Jede dieser Maßnahmen betrifft also unterschiedliche Bereiche:

  1. Hart => WorkingDir + Index + HEAD
  2. Gemischt => Index + HEAD
  3. Soft => nur HEAD (Index und Arbeitsverzeichnis unverändert).

35voto

magentaqin Punkte 1183

Sie müssen sich nicht zwingen, sich an die Unterschiede zwischen ihnen zu erinnern. Denken Sie daran, wie Sie tatsächlich eine Übergabe gemacht haben.

  1. Nehmen Sie einige Änderungen vor.

  2. git add .

  3. git commit -m "I did Something"

Soft, Mixed und Hard ist der Weg, der es Ihnen ermöglicht, die Operationen, die Sie von 3 bis 1 gemacht haben, aufzugeben.

  • Weich "vorgab", Sie nie gesehen zu haben git commit .
  • Gemischt "vorgab", Sie nie gesehen zu haben git add .
  • Hart "so tun, als würden Sie nicht sehen, dass Sie Änderungen an den Dateien vorgenommen haben.

26voto

James Lawruk Punkte 27947

Hier ist eine grundlegende Erklärung für TortoiseGit Benutzer:

git reset --soft y --mixed lassen Sie Ihre Dateien unangetastet.

git reset --hard eigentlich Ihre Dateien ändern um mit dem Commit übereinzustimmen, auf das Sie zurückgesetzt haben.

In TortoiseGit wird das Konzept der der Index ist durch die grafische Benutzeroberfläche sehr versteckt. Wenn Sie eine Datei ändern, müssen Sie nicht die Funktion git add um die Änderung in den Staging-Bereich/Index aufzunehmen. Wenn es sich lediglich um Änderungen an bestehenden Dateien handelt, bei denen keine Dateinamen geändert werden, git reset --soft y --mixed sind identisch! Sie werden nur dann einen Unterschied feststellen, wenn Sie neue Dateien hinzugefügt oder Dateien umbenannt haben. Wenn Sie in diesem Fall git reset --mixed ausführen, müssen Sie Ihre Datei(en) erneut aus dem Nicht versionierte Dateien Liste.

16voto

Vivek Maru Punkte 7031

Die Antwort von mkarasek ist großartig, in einfachen Worten können wir sagen...

  • git reset --soft : Setzen Sie die HEAD zu der beabsichtigten Übergabe, aber behalten Sie Ihre Änderungen aus den letzten Übergaben
  • git reset --mixed : Es ist dasselbe wie git reset --soft aber der einzige Unterschied ist, dass die Änderungen der letzten Übertragungen aufgehoben werden
  • git reset --hard : Stellen Sie Ihr HEAD auf die von Ihnen angegebene Übergabe und setzt alle Änderungen der letzten Übergaben zurück, einschließlich der nicht übergebenen Änderungen.

--soft y --mixed sind ein wenig ähnlich, der einzige Unterschied ist, wenn Sie Ihre Änderungen im Staging-Bereich behalten wollen, verwenden Sie --soft und wenn Sie Ihre Änderungen nicht im Bereitstellungsbereich haben wollen, verwenden Sie --mixed stattdessen.

11voto

De Novo Punkte 6203

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)
  1. 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.
  2. Spulen Sie den Master-Zweig zurück, um die drei Commits zu entfernen.
  3. 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X