521 Stimmen

Was ist der Unterschied zwischen "git reset" und "git checkout"?

Ich habe immer gedacht, dass git reset y git checkout in dem Sinne, dass beide das Projekt zu einem bestimmten Commit zurückbringen. Ich bin jedoch der Meinung, dass sie nicht genau dasselbe sein können, da dies überflüssig wäre. Was ist der eigentliche Unterschied zwischen den beiden? Ich bin ein wenig verwirrt, da das svn nur über svn co um die Übergabe rückgängig zu machen.

HINZUFÜGEN

VonC und Charles erklärten die Unterschiede zwischen git reset y git checkout wirklich gut. Mein derzeitiges Verständnis ist, dass git reset macht alle Änderungen an einer bestimmten Übertragung rückgängig, während git checkout bereitet sich mehr oder weniger auf eine Niederlassung vor. Die folgenden beiden Diagramme waren für mich sehr hilfreich, um zu diesem Verständnis zu gelangen:

http://a.imageshack.us/img651/1559/86421927.png http://a.imageshack.us/img801/1986/resetr.png

ZUSÄTZLICH 3

De http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html können Checkout und Reset die Umbasierung emulieren.

enter image description here

git checkout bar 
git reset --hard newbar 
git branch -d newbar 

enter image description here

233voto

VonC Punkte 1117238
  • git reset geht es speziell um Aktualisierung des Indexes , die den HEAD bewegen.
  • git checkout ist über die Aktualisierung des Arbeitsbaums (auf den Index oder den angegebenen Baum). Es wird den HEAD nur aktualisieren, wenn Sie einen Zweig auschecken (wenn nicht, enden Sie mit einer abgetrennter KOPF ).
    (tatsächlich wird dies mit Git 2.23 Q3 2019 sein git restore , nicht unbedingt git checkout )

Zum Vergleich: svn hat keinen Index, sondern nur einen Arbeitsbaum, svn checkout kopiert eine bestimmte Revision in ein separates Verzeichnis.
Die nähere Entsprechung für git checkout würde:

  • svn update (wenn Sie sich im selben Zweig befinden, d.h. dieselbe SVN-URL haben)
  • svn switch (wenn Sie zum Beispiel denselben Zweig auschecken, aber von einer anderen SVN-Repository-URL)

Alle diese drei Arbeitsbaumänderungen ( svn checkout , update , switch ) haben nur einen Befehl in git: git checkout .
Da Git aber auch den Begriff des Index kennt (der "Staging-Bereich" zwischen dem Repo und dem Arbeitsbaum), haben Sie auch git reset .


Thinkeye Erwähnt in den Kommentaren den Artikel " Zurücksetzen entmystifiziert ".

Wenn wir zum Beispiel zwei Zweige haben, ' master ' und ' develop ', die auf verschiedene Commits verweisen, und wir sind derzeit auf ' develop ' (also zeigt HEAD darauf) und wir führen git reset master , ' develop ' selbst verweist nun auf die gleiche Übergabe, die ' master ' tut.

Wenn wir jedoch stattdessen git checkout master , ' develop ' wird sich nicht bewegen, HEAD selbst wird. HEAD verweist nun auf ' master '.

In beiden Fällen bewegen wir uns also HEAD auf die Übergabe verweisen A aber die Art und Weise, wie wir dies tun, ist sehr unterschiedlich. reset wird die Verzweigung verschieben HEAD zeigt auf, Kasse bewegt sich HEAD selbst auf einen anderen Zweig verweisen.

http://git-scm.com/images/reset/reset-checkout.png

Aber zu diesen Punkten:

LarsH fügt hinzu. in den Kommentaren :

Der erste Absatz dieser Antwort ist jedoch irreführend: " git checkout ... aktualisiert den HEAD nur, wenn Sie einen Zweig auschecken (wenn nicht, haben Sie am Ende einen abgetrennten HEAD)".
Das stimmt nicht: git checkout aktualisiert den HEAD auch dann, wenn Sie einen Commit auschecken, der kein Branch ist (und ja, am Ende haben Sie einen abgetrennten HEAD, aber er wurde trotzdem aktualisiert).

git checkout a839e8f updates HEAD to point to commit a839e8f.

De Novo stimmt zu. in den Kommentaren :

@LarsH hat Recht.
Der zweite Aufzählungspunkt hat eine falsche Vorstellung davon, was HEAD in ist, aktualisiert den HEAD nur, wenn Sie einen Zweig auschecken.
HEAD geht dahin, wo du bist, wie ein Schatten.
Das Auschecken eines nicht verzweigten Refs (z.B. eines Tags) oder eines Commits direkt, verschiebt HEAD. Abgetrennter Kopf bedeutet nicht, dass Sie sich vom HEAD abgetrennt haben, es bedeutet, dass der Kopf von einer Verzweigungsreferenz abgetrennt ist, was Sie z.B. sehen können, git log --pretty=format:"%d" -1 .

  • Die beigefügten Kopfstaaten beginnen mit (HEAD -> ,
  • abgetrennt wird noch angezeigt (HEAD , hat aber keinen Pfeil zu einer Verzweigung ref.

75voto

CB Bailey Punkte 693084

In ihrer einfachsten Form, reset setzt den Index zurück, ohne den Arbeitsbaum zu verändern, während checkout ändert den Arbeitsbaum, ohne den Index zu berühren.

Setzt den Index auf den Wert HEAD , Arbeitsbaum in Ruhe gelassen:

git reset

Konzeptionell wird damit der Index in den Arbeitsbaum ausgecheckt. Um es dazu zu bringen, tatsächlich etwas zu tun, müssten Sie -f um zu erzwingen, dass es alle lokalen Änderungen überschreibt. Dies ist eine Sicherheitsfunktion, um sicherzustellen, dass die Form "kein Argument" nicht destruktiv ist:

git checkout

Sobald man anfängt, Parameter hinzuzufügen, gibt es tatsächlich einige Überschneidungen.

checkout wird in der Regel mit einem Branch, Tag oder Commit verwendet. In diesem Fall wird es zurückgesetzt HEAD und den Index zu der gegebenen Übergabe sowie das Auschecken des Index in den Arbeitsbaum durchführen.

Auch wenn Sie die --hard a reset können Sie fragen reset um den Arbeitsbaum zu überschreiben und auch den Index zurückzusetzen.

Wenn Sie derzeit eine Filiale auschecken lassen, gibt es einen entscheidenden Unterschied zwischen reset y checkout wenn Sie einen alternativen Branch oder Commit angeben. reset ändert den aktuellen Zweig so, dass er auf die ausgewählte Übertragung zeigt, während checkout lässt den aktuellen Zweig in Ruhe und checkt stattdessen den angegebenen Zweig oder die angegebene Übergabe aus.

Andere Formen von reset y commit die Bereitstellung von Pfaden beinhalten.

Wenn Sie die Pfade zu reset Sie können nicht liefern --hard y reset ändert nur die Indexversion der übergebenen Pfade auf die Version in der übergebenen Übergabe (oder HEAD wenn Sie keinen Commit angeben).

Wenn Sie die Pfade zu checkout , wie reset wird die Indexversion der angegebenen Pfade so aktualisiert, dass sie mit dem angegebenen Commit übereinstimmt (oder HEAD ), aber es wird immer die Indexversion der angegebenen Pfade in den Arbeitsbaum einchecken.

63voto

John Doe Punkte 1294

Ein einfacher Anwendungsfall bei der Rückgängigmachung von Änderungen:
1. Verwenden Sie reset, wenn Sie das Staging einer geänderten Datei rückgängig machen wollen.
2. Verwenden Sie checkout, wenn Sie Änderungen an nicht bereitgestellten Dateien verwerfen wollen.

19voto

LarsH Punkte 26458

Der Hauptunterschied besteht darin, dass reset verschiebt die aktuelle Verzweigungsreferenz , während checkout nicht (es bewegt sich HEAD).

Wie das Pro Git Buch erklärt unter Zurücksetzen entmystifiziert ,

Die erste Sache reset tun wird, ist verschieben, worauf HEAD zeigt . Das ist nicht dasselbe wie HEAD selbst verändern (das ist das, was checkout tut); reset bewegt den Ast auf die HEAD verweist. Das heißt, wenn HEAD auf auf den master Zweig (d. h. Sie befinden sich derzeit auf dem master Zweig), läuft git reset 9e5e6a4 beginnt mit der Herstellung von master zeigen auf 9e5e6a4 . [Hervorhebung hinzugefügt]

Siehe auch VonCs Antwort für eine sehr hilfreicher Text- und Diagrammauszug aus demselben Artikel, den ich hier nicht wiederholen werde.

Natürlich gibt es noch viele weitere Details über die Auswirkungen checkout y reset auf den Index und den Arbeitsbaum haben kann, je nachdem, welche Parameter verwendet werden. Es kann viele Ähnlichkeiten und Unterschiede zwischen den beiden Befehlen geben. Meines Erachtens besteht der wichtigste Unterschied darin, ob sie die Spitze des aktuellen Zweigs verschieben.

6voto

Kurze Gedächtnisstützen:

git reset HEAD           :             index = HEAD
git checkout             : file_tree = index
git reset --hard HEAD    : file_tree = index = HEAD

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