Frage

Ich habe immer gedacht, von git reset und git checkout als die gleichen, in dem Sinne, dass beide zu einem bestimmten Projekt zurück bringen begehen. Allerdings fühle ich sie nicht genau das gleiche sein kann, wie überflüssig wäre. Was ist der eigentliche Unterschied zwischen den beiden? Ich bin ein wenig verwirrt, wie die svn nur svn co der Commit zurückkehren hat.

ADDED

VonC und Charles erklärt die Unterschiede zwischen git reset und git checkout wirklich gut. Mein gegenwärtiges Verständnis ist, dass git reset kehrt alle Änderungen an einem bestimmten Back verpflichten, während git checkout mehr oder weniger für einen Zweig bereitet. Ich fand die beiden folgenden Diagramme sehr nützlich dieses Verständnis auf sich warten:

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

ADDED 3

Von http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase .html , Kasse und Reset können die Fütterungsmaterial emulieren.

 image description hier

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

 image description hier

eingeben
War es hilfreich?

Lösung

  • git reset speziell über Aktualisieren des Index , bewegen des Kopfes.
  • git checkout über Aktualisieren der Arbeits Baum ( zu dem Index oder der angegebenen Struktur). Es wird die HEAD nur aktualisieren, wenn Sie einen Zweig Kasse (wenn nicht, Sie mit einem abgelöst HEAD am Ende).
    (Eigentlich mit Git 2,23 Q3 2019, wird dies sein git restore , die nicht unbedingt git checkout)

Zum Vergleich, da svn keinen Index hat, nur einen Arbeits Baum, svn checkout eine bestimmte Revision auf einem separaten Verzeichnis kopieren.
Je näher Äquivalent für git checkout würde:

  • svn update (wenn Sie sind in der gleichen Branche, die gleiche SVN URL)
  • Bedeutung
  • svn switch (wenn Sie Prüfung der gleichen Branche zum Beispiel, aber aus einem anderen SVN-Repo-URL)

All diese drei Arbeitsbaum Modifikationen (svn checkout, update, switch) nur einen Befehl in git:. git checkout
Aber da git hat auch den Begriff des Index (die „Staging-Bereich“ zwischen dem Repo und der Arbeitsbaum), können Sie auch git reset haben.


ThinkEye erwähnt in den Kommentaren den Artikel " Reset Demystified ".

  

Zum Beispiel, wenn wir zwei Zweige, ‚master‘ und ‚develop‘ an verschiedenen Commits zeigen, und wir sind momentan in ‚develop‘ (so HEAD darauf zeigt), und wir laufen git reset master, ‚develop‘ selbst wird jetzt auf die gleiche verpflichten, dass ‚master‘ der Fall ist.

     

Auf der anderen Seite, wenn wir git checkout master statt laufen, ‚develop‘ wird sich nicht bewegen, HEAD selbst wird. HEAD wird zeigen nun auf ‚master‘.

     

Also, in beiden Fällen wir HEAD zu Punkt sich bewegen A zu begehen, sondern wie wir tun, ist sehr unterschiedlich. reset wird die Zweig HEAD Punkte, Kasse bewegt HEAD sich Punkt zu einem anderen Zweig verschieben.

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

Auf diesen Punkten, aber:

Larsh fügt in den Kommentaren :

  

Der erste Absatz dieser Antwort, obwohl, ist irreführend. „git checkout ... nur die HEAD aktualisieren, wenn Sie einen Zweig Kasse (wenn nicht, Sie mit einer frei stehenden HEAD am Ende)“
  Nicht wahr: git checkout die HEAD aktualisieren, auch wenn Sie Prüfung eine Festschreibung das ist kein Zweig (und ja, Sie mit einem frei stehenden HEAD am Ende, aber es wurde noch aktualisiert).

git checkout a839e8f updates HEAD to point to commit a839e8f.

De Novo concurs in den Kommentaren :

  

@LarsH ist richtig.
  Die zweite Kugel hat eine falsche Vorstellung über das, was HEAD ist in den HEAD nur aktualisieren, wenn Sie einen Zweig der Kasse.
  HEAD geht wo immer Sie sind, wie ein Schatten.
  Auschecken einig nicht-Zweig ref (z.B. ein Tag) oder ein Commit direkt, Kopf bewegen. Freistehendes Kopf bedeutet nicht, dass Sie von der HEAD abgelöst haben, es bedeutet, dass der Kopf von einem Ast ref abgenommen wird, von dem aus sehen kann, zum Beispiel git log --pretty=format:"%d" -1.

     
      
  • In festen Händen Kopf Staaten werden mit (HEAD -> beginnen,
  •   
  • abgelöst wird noch (HEAD zeigen, wird aber nicht einen Pfeil auf einem Zweig ref haben.
  •   

Andere Tipps

In ihrer einfachsten Form reset setzt den Index ohne den Arbeits Baum zu berühren, während checkout den Arbeitsbaum ändert, ohne den Index zu berühren.

Setzt der Index Spiel HEAD, Arbeits Baum allein gelassen:

git reset

Konzeptionell diese Kontrollen des Index in den Arbeits Baum. Um es zu erhalten, um tatsächlich alles tun würden, Sie haben verwenden -f es zu zwingen, alle lokalen Änderungen zu überschreiben. Dies ist ein Sicherheitsmerkmal, um sicherzustellen, dass die „kein Argument“ Form nicht destruktiv ist:

git checkout

Sobald Sie anfangen Parameter angeben kann es wahr ist, dass es eine gewisse Überlappung ist.

checkout ist in der Regel mit einem Zweig, Tag oder begehen verwendet. In diesem Fall wird es zurückgesetzt HEAD und den Index des Commit sowie die Durchführung der Kasse des Index in den Arbeits Baum gegeben.

Auch wenn Sie --hard versorgen Sie fragen können reset reset den Arbeits Baum zu überschreiben sowie das Zurücksetzen des Index.

Wenn Sie Strom ein Zweig ausgecheckt haben da draußen ein entscheidender Unterschied zwischen reset und checkout ist, wenn Sie einen alternativen Zweig liefern oder begehen. reset den aktuellen Zweig zu Punkt am begehen während checkout ausgewählt ändert den aktuellen Zweig allein verlassen, sondern wird über das mitgelieferte Zweig oder begeht Kasse statt.

Andere Formen von reset und commit beinhalten Pfade zu liefern.

Wenn Sie Pfade liefern reset können Sie nicht liefern --hard und reset wird nur der Index-Version der mitgelieferten Pfade auf die Version ändern in der Commit geliefert (oder HEAD wenn Sie nicht angeben, eine Festschreibung).

Wenn Sie Pfade zu checkout liefern, wie reset wird es die Index-Version der mitgelieferten Pfade aktualisieren, die mitgelieferte übereinstimmen commit (oder HEAD), aber es wird die Index-Version der mitgelieferten Pfade in den Arbeits Baum immer der Kasse.

Ein einfacher Anwendungsfall bei Änderung zurückkehrt:
1. Verwenden Sie Reset, wenn Sie möchten, Undo Inszenierung einer geänderten Datei.
2. Verwenden Kasse, wenn Sie zu verwerfen Änderungen unstaged Datei wollen / s.

Atlassian geben uns eine ausgezeichnete Erklärung über git reset git Kasse und so, git revert . In diesem Artikel wird erklärt die verschiedenen Einsatzmöglichkeiten dieser Befehle auf einer anderen Ebenen - Datei, inszenierten Momentaufnahme und begeht

.

https://www.atlassian.com/git/ tutorials / Zurücksetzen-Check-out-and-umkehr

Der wesentliche Unterschied auf den Punkt gebracht ist, dass reset verschiebt den aktuellen Zweig Referenz , während checkout nicht (es bewegt sich HEAD).

Wie das Pro Git Buch erklärt unter zurücksetzen Demystified ,

  

Das erste, was reset zu tun ist bewegen, was HEAD Punkte . Dies ist nicht   das gleiche wie Ändern HEAD selbst (das ist, was checkout tut); reset    bewegt den Zweig , dass HEAD zeigt auf. Dies bedeutet, wenn HEAD Satz ist   zum master Zweig (das heißt Sie sind momentan auf dem master Zweig),   git reset 9e5e6a4 ausgeführt wird, indem master Punkt beginnen zu   9e5e6a4. [Hervorhebung hinzugefügt]

Siehe VonC Antwort auch für einen sehr hilfreich Text und Diagramm Auszug aus dem gleichen Artikel, die ich nicht duplizieren hier.

Natürlich gibt es viel mehr Details über das, was Auswirkungen checkout und reset auf dem Index und den Arbeitsbaum haben können, je nachdem, welche Parameter verwendet werden. Es kann viele Ähnlichkeiten und Unterschiede zwischen den beiden Befehlen sein. Aber wie ich es sehe, ist der wichtigste Unterschied ist, ob sie die Spitze des aktuellen Zweiges bewegen.

Die beiden Befehle (Reset und Kasse) sind völlig verschieden.

checkout X IST NICHT reset --hard X

Wenn X ein Zweigname, checkout X den aktuellen Zweig ändern während reset --hard X nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top