Ich habe immer git reset
und git checkout
in dem Sinne daran gedacht , dass beide das Projekt zu einem bestimmten Commit zurückbringen. Ich bin jedoch der Meinung, dass sie nicht genau gleich sein können, da dies überflüssig wäre. Was ist der tatsächliche Unterschied zwischen den beiden? Ich bin etwas verwirrt, da der SVN nur svn co
das Commit zurücksetzen muss .
HINZUGEFÜGT
VonC und Charles haben die Unterschiede zwischen git reset
und git checkout
wirklich gut erklärt. Mein derzeitiges Verständnis ist, dass git reset
alle Änderungen auf ein bestimmtes Commit zurückgesetzt werden, während git checkout
mehr oder weniger auf einen Zweig vorbereitet wird. Ich fand die folgenden zwei Diagramme sehr nützlich, um zu diesem Verständnis zu gelangen:
HINZUGEFÜGT 3
Unter http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html kann das Auschecken und Zurücksetzen emuliert werden die Rebase.
git checkout bar
git reset --hard newbar
git branch -d newbar
quelle
-- files
Varianten in Ordnung sein ; ich bin mir nicht sicher.) In diesem Diagramm sieht es so aus, als ob der Hauptunterschied darin besteht, ob sie den Index oder den WD beeinflussen. Siehe meine Antwort dazu. Das 2. und 3. Diagramm sind sehr hilfreich, um den tatsächlichen Unterschied zu erkennen. Das 4. und 5. Diagramm sind nützlich, um zu überprüfen, ob Sie verstehen, was diese Befehle bewirken, aber nicht wirklich dabei helfen, dorthin zu gelangen.think-like-a-git.net
Artikel angegeben) erforderlich sind, um Datenverlust zu vermeiden.Antworten:
git reset
Es geht speziell darum, den Index zu aktualisieren und den HEAD zu verschieben.git checkout
Hier geht es darum, den Arbeitsbaum (auf den Index oder den angegebenen Baum) zu aktualisieren . Der HEAD wird nur aktualisiert, wenn Sie einen Zweig auschecken (wenn nicht, erhalten Sie einen abgetrennten HEAD ).(Mit Git 2.23 Q3 2019 wird dies
git restore
nicht unbedingt der Fall sein .git checkout
)Zum Vergleich: Da svn keinen Index hat,
svn checkout
kopiert nur ein funktionierender Baum eine bestimmte Revision in ein separates Verzeichnis.Das nähere Äquivalent für
git checkout
würde:svn update
(Wenn Sie sich in derselben Branche befinden, dh dieselbe SVN-URL)svn switch
(Wenn Sie zum Beispiel denselben Zweig auschecken, aber von einer anderen SVN-Repo-URL)Alle diese drei Arbeits Baum Modifikationen (
svn checkout
,update
,switch
) haben nur einen Befehl in git:git checkout
.Aber da Git auch den Begriff Index hat (diesen "Staging-Bereich" zwischen dem Repo und dem Arbeitsbaum), haben Sie auch
git reset
.Thinkeye erwähnt in den Kommentaren den Artikel " Demystified zurücksetzen ".
Zu diesen Punkten jedoch:
LarsH fügt in den Kommentaren hinzu :
De Novo stimmt den Kommentaren zu :
quelle
git reset
es darum geht, das "Label" des Zweigs zu ändern und optional den Index oder den Arbeitsbaum als Nebeneffekt zu aktualisieren.git checkout
Hier geht es darum, den Arbeitsbaum zu aktualisieren und den aktuell "ausgewählten" Zweig (denHEAD
) zu wechseln .git reset
ist 100% über dieHEAD
. Es funktioniert auch in einem getrennten HEAD-Modus ( stackoverflow.com/a/3965714/6309 ), dh es gibt keinen Zweig (!). git checkout funktioniert auch in einem getrennten HEAD-Modus oder kann zum Auschecken eines SHA1 in einem getrennten HEAD-Modus verwendet werden: Auch in diesem Fall ist kein Zweig beteiligt.git checkout a839e8f
aktualisiert HEAD so, dass es auf Commit verweista839e8f
.reset
Setzt in der einfachsten Form den Index zurück, ohne den Arbeitsbaum zu berühren, währendcheckout
der Arbeitsbaum geändert wird, ohne den Index zu berühren.Setzt den Index auf Übereinstimmung zurück
HEAD
, wobei der Arbeitsbaum allein gelassen wird:Konzeptionell wird dadurch der Index in den Arbeitsbaum ausgecheckt. Damit es tatsächlich etwas tut, müssten Sie es
-f
zwingen, lokale Änderungen zu überschreiben. Dies ist eine Sicherheitsfunktion, um sicherzustellen, dass das Formular "kein Argument" nicht destruktiv ist:Sobald Sie mit dem Hinzufügen von Parametern beginnen, gibt es zwar einige Überlappungen.
checkout
wird normalerweise mit einem Zweig, Tag oder Commit verwendet. In diesem Fall wirdHEAD
der Index auf das angegebene Commit zurückgesetzt und das Auschecken des Index in den Arbeitsbaum durchgeführt.Wenn Sie angeben
--hard
, könnenreset
Sie auch darum bittenreset
, den Arbeitsbaum zu überschreiben und den Index zurückzusetzen.Wenn Sie derzeit eine Filiale ausgecheckt haben, gibt es einen entscheidenden Unterschied zwischen
reset
undcheckout
wann Sie eine alternative Filiale oder ein Commit angeben.reset
ändert den aktuellen Zweig so, dass er auf das ausgewählte Commit zeigt, währendcheckout
der aktuelle Zweig in Ruhe bleibt, aber stattdessen den angegebenen Zweig auscheckt oder festschreibt.Andere Formen von
reset
undcommit
beinhalten die Bereitstellung von Pfaden.Wenn Sie Pfade liefern
reset
Sie nicht liefern kann--hard
undreset
wird nur der Index - Version der gelieferten Pfade zu der Version in der Commit geliefert ändern (oder ,HEAD
wenn Sie nicht eine Festschreibung angeben).Wenn Sie Pfade angeben
checkout
,reset
wird die Indexversion der angegebenen Pfade so aktualisiert , dass sie mit dem angegebenen Commit (oderHEAD
) übereinstimmt, aber die Indexversion der angegebenen Pfade wird immer in den Arbeitsbaum eingecheckt.quelle
Ein einfacher Anwendungsfall beim
Zurücksetzen von Änderungen: 1. Verwenden Sie Zurücksetzen, wenn Sie das Staging einer geänderten Datei rückgängig machen möchten.
2. Verwenden Sie checkout, wenn Sie Änderungen an nicht bereitgestellten Dateien verwerfen möchten.
quelle
Der Hauptunterschied auf den Punkt gebracht besteht darin, dass
reset
die aktuelle Zweigreferenz verschoben wird , währendcheckout
dies nicht der Fall ist (es wird HEAD verschoben).Wie das Pro Git-Buch unter Reset Demystified erklärt ,
Siehe auch VonCs Antwort für einen sehr hilfreichen Text- und Diagrammauszug aus demselben Artikel, den ich hier nicht duplizieren werde.
Natürlich gibt es viel mehr Details über das, was Auswirkungen
checkout
undreset
auf dem Index und den Arbeitsbaum haben kann, je nachdem , welche Parameter verwendet werden. Es kann viele Ähnlichkeiten und Unterschiede zwischen den beiden Befehlen geben. Aber aus meiner Sicht ist der wichtigste Unterschied, ob sie die Spitze des aktuellen Zweigs bewegen.quelle
Die beiden Befehle (Zurücksetzen und Auschecken) sind völlig unterschiedlich.
checkout X
IST NICHTreset --hard X
Wenn X ein Zweigname ist,
checkout X
wird der aktuelle Zweig geändert, während diesreset --hard X
nicht der Fall ist.quelle
kurze Mnemonik:
quelle