2015-01-26 6 views
14

Bis jetzt habe ich immer git checkout <branch_name>; git reset --hard <hash> verwendet, um einen Zweig zurück zu einem früheren Commit zu verschieben.Unterschied zwischen `git branch -f <branch_name><hash>` und `git checkout <branch_name>; git reset --hard <hash> `unter einem sauber arbeitenden Baum?

Dann stieß ich auf this question, aber die Antworten und Kommentare erklären nicht im Detail die Unterschiede zwischen ihnen.

Angenommen, ich habe einen sauberen Arbeits Baum, was interne Unterschiede gibt es zwischen

git branch -f <branch_name> <hash> 

und

git checkout <branch_name> 
git reset --hard <hash> 

und solche Unterschiede tun, wenn überhaupt, haben alle subtile Auswirkungen auf die erweiterte Nutzung?

Antwort

15

Der Hauptunterschied besteht darin, dass git branch -f <branchname> <commitref> bewegt <branchname> der Commit angegeben Punkt ohneHEAD zu berühren, die Index oder Arbeitskopie, während alle drei git checkout <branchname> && git reset --hard <commitref> modifiziert.

Wenn Sie Zweige schnell verschieben möchten, ohne sich zu bewegen HEAD oder Ihren aktuellen Arbeitsbaum zu ändern, dann ist git branch -f ein guter Weg, es zu tun. Es funktioniert auch, wenn Sie nicht festgeschriebene Änderungen haben, was nicht immer möglich ist, wenn Sie git checkout verwenden.

Ein weiterer Unterschied bezieht sich auf die Leistung, aber es ist nur relevant für sehr große Projekte.
In diesen Fällen könnte die Änderung Ihres Arbeitsbaums mit git checkout und git reset --hard möglicherweise eine teure Operation mit vielen Festplatten-E/A sein. Andererseits wird mit git branch -f nur eine einzelne Datei auf die Platte geschrieben, d. H. Diejenige, die die <commithash> enthält, auf die durch <branchname> verwiesen wird.

+0

Gute vollständige Antwort. Ich habe meins entfernt. +1 – VonC