Gibt es einen Unterschied zwischen „git reset --hard Hash“ und „git Kasse hash“?
-
23-09-2019 - |
Frage
Während reset
und checkout
haben unterschiedliche Nutzungen die meiste Zeit, ich kann nicht sehen, was Unterschied zwischen diesen beiden ist.
Es ist wahrscheinlich ein oder niemand die Mühe gemacht hätte eine --hard
Option Hinzufügen von etwas, das die grundlegenden checkout
tun tun können.
Vielleicht gibt es einen Unterschied in der Art und Weise ist, werden Sie die Geschichte sehen?
Lösung
Diese Antwort ist meist aus meiner Antwort auf eine frühere Anfrage zitiert: git reset in einfachem Englisch .
Die beiden sind sehr unterschiedlich. Sie ergeben sich im gleichen Zustand für Zeige- und Arbeit Baum, aber die daraus resultierende Geschichte und Stromzweig nicht gleich sind.
Angenommen, Ihre Geschichte wie folgt aussieht, mit dem Master-Zweig zur Zeit ausgecheckt:
- A - B - C (HEAD, master)
und Sie laufen git reset --hard B
. Sie werden diese:
- A - B (HEAD, master) # - C is still here, but there's no
# branch pointing to it anymore
Sie würden tatsächlich bekommen diese Wirkung, wenn Sie --mixed
oder --soft
zu verwenden - der einzige Unterschied ist, was Ihre Arbeit Baum und Index geschieht. Im --hard
Fall der Arbeit Baum und Indexanpassung B
.
Nun nehmen wir Sie git checkout B
stattdessen laufen würde. Sie würden diese:
- A - B (HEAD) - C (master)
Sie haben in einem frei stehenden HEAD Zustand enden. HEAD
, Arbeit Baum, Index all Spiele B
, gleich wie mit dem Hard-Reset, aber der Master-Zweig wurde hinter am C
links. Wenn Sie ein neues begehen D
an dieser Stelle machen, werden Sie dies nicht erhalten, das ist wahrscheinlich nicht das, was Sie wollen:
- A - B - C (master)
\
D (HEAD)
So verwenden Sie Kasse, na ja, überprüfen, die zu begehen. Sie können mit ihm Geige, das tun, was Sie wollen, aber Sie haben Ihre Branche hinter sich gelassen. Wenn Sie die Verzweigung bewegt zu wollen, verwenden Sie zurückgesetzt.
Andere Tipps
Wenn Dokumentation mit Git zur Verfügung gestellt hilft Ihnen nicht, einen Blick auf Ein Visual Git Referenz von Mark Lodato.
Insbesondere wenn Sie vergleichen git checkout <non-branch>
mit git reset --hard <non-branch>
(hotlinked):
(Quelle: github.com )
Beachten Sie, dass im Fall von git reset --hard master~3
Sie hinter einem Teil der DAG von Revisionen verlassen - einige Commits werden nicht von jeder Filiale verwiesen. Diese sind geschützt für (Standard) 30 Tage nach reflog ; sie würden schließlich beschnitten (entfernt) werden.
git-reset hash
setzt den Zweig Bezug auf die gegebenen Hash und gegebenenfalls überprüft es aus, with--hard
.
git-checkout hash
setzt den Arbeits Baum auf den angegebenen Hash; und es sei denn, Hash ein Zweig Name ist, werden Sie mit einem frei stehenden Kopf enden.
schließlich, git beschäftigt sich mit 3 Dinge:
working tree (your code)
-------------------------------------------------------------------------
index/staging-area
-------------------------------------------------------------------------
repository (bunch of commits, trees, branch names, etc)
git-checkout
standardmäßig aktualisiert nur den Index und den Arbeitsbaum und kann optional Update etwas im Repository (mit -b
Option)
git-reset
standardmäßig aktualisiert nur das Repository und den Index, und gegebenenfalls den Arbeits Baum (mit --hard
Option)
Sie können denken Sie an das Repository wie folgt aus:
HEAD -> master
refs:
master -> sha_of_commit_X
dev -> sha_of_commit_Y
objects: (addressed by sha1)
sha_of_commit_X, sha_of_commit_Y, sha_of_commit_Z, sha_of_commit_A ....
git-reset
manipuliert, was die Zweig Referenzen verweisen auf.
Angenommen, Ihre Geschichte sieht wie folgt aus:
T--S--R--Q [master][dev]
/
A--B--C--D--E--F--G [topic1]
\
Z--Y--X--W [topic2][topic3]
Beachten Sie, dass Zweige sind nur Namen, die vorher automatisch, wenn Sie zu begehen.
So können Sie die folgenden Zweige haben:
master -> Q
dev -> Q
topic1 -> G
topic2 -> W
topic3 -> W
Und Ihr aktueller Zweig ist topic2
, das heißt, die HEAD zeigt auf Thema2.
HEAD -> topic2
Dann wird git reset X
setzen Sie den Namen topic2
zu Punkt X; wenn das heißt, Sie machen ein P auf Zweig Thema2 begehen, wird es wie folgt aussehen:
T--S--R--Q [master][dev]
/
A--B--C--D--E--F--G [topic1]
\
Z--Y--X--W [topic3]
\
P [topic2]