Zawsze o tym myślałem git reset
i git checkout
tak samo, w tym sensie, że oba przywracają projekt do konkretnego zatwierdzenia. Uważam jednak, że nie mogą być dokładnie takie same, ponieważ byłoby to zbędne. Jaka jest faktyczna różnica między nimi? Jestem trochę zdezorientowany, ponieważ svn musi tylko svn co
cofnąć zatwierdzenie.
DODANY
VonC i Charles wyjaśnia różnice między git reset
i git checkout
naprawdę dobrze. Moje obecne rozumienie jest takie, że git reset
przywraca wszystkie zmiany do konkretnego zatwierdzenia, podczas gdy git checkout
mniej więcej przygotowuje się do odgałęzienia. Znalazłem następujące dwa diagramy całkiem przydatne w zrozumieniu:
DODANO 3
Od http://think-like-a-git.net/sections/rebase-from-the-ground-up/using-git-cherry-pick-to-simulate-git-rebase.html , kasy i reset mogą emulować rebase.
git checkout bar
git reset --hard newbar
git branch -d newbar
źródło
-- files
wariantów; nie jestem pewien.) Ten schemat pokazuje, że główna różnica polega na tym, czy wpływają one na indeks, czy na WD. Zobacz moją odpowiedź na ten temat. Drugi i trzeci schemat są bardzo pomocne, aby zobaczyć prawdziwą różnicę. Czwarty i piąty schemat są przydatne do sprawdzenia, czy rozumiesz, co robią te polecenia, ale tak naprawdę nie pomoże ci się tam dostać.think-like-a-git.net
artykule) są wymagane, aby zapobiec utracie danych.Odpowiedzi:
git reset
dotyczy w szczególności aktualizacji indeksu , przesunięcia HEAD.git checkout
dotyczy aktualizacji drzewa roboczego (do indeksu lub określonego drzewa). Zaktualizuje HEAD tylko wtedy, gdy kasujesz gałąź (jeśli nie, kończy się odłączoną HEAD ).(w rzeczywistości w przypadku Git 2.23 Q3 2019 nie będzie to
git restore
koniecznegit checkout
)Dla porównania, ponieważ svn nie ma indeksu, tylko działające drzewo
svn checkout
skopiuje daną wersję do osobnego katalogu.Bliższy odpowiednik dla
git checkout
:svn update
(jeśli jesteś w tej samej gałęzi, co oznacza ten sam adres URL SVN)svn switch
(jeśli kasujesz na przykład ten sam oddział, ale z innego adresu URL repozytorium SVN)Wszystkie te trzy pracujące modyfikacje drzewa (
svn checkout
,update
,switch
) mają tylko jedno polecenie git:git checkout
.Ale ponieważ git ma również pojęcie indeksu („obszaru przejściowego” między repozytorium a działającym drzewem), ty także
git reset
.Thinkeye wspomina w komentarzach artykuł „ Reset Demystified ”.
Jednak w tych kwestiach:
LarsH dodaje w komentarzach :
De Novo zgadza się w komentarzach :
źródło
git reset
chodzi o modyfikację „etykiety” gałęzi i opcjonalną aktualizację indeksu lub drzewa roboczego jako efekt uboczny.git checkout
dotyczy aktualizacji działającego drzewa i przełączania aktualnie „wybranej” gałęzi (theHEAD
).git reset
jest w 100% na tematHEAD
. Działa nawet w odłączonym trybie HEAD ( stackoverflow.com/a/3965714/6309 ), co oznacza, że nie ma gałęzi (!). git checkout działa również w trybie odłączonej HEAD, lub może być użyty do wyewidencjonowania SHA1 w odłączonym trybie HEAD: ponownie żadna gałąź nie jest w tym przypadku zaangażowana.git checkout a839e8f
aktualizuje HEAD, aby wskazywał na zatwierdzeniea839e8f
.W najprostszej formie
reset
resetuje indeks bez dotykania działającego drzewa, natomiastcheckout
zmienia działające drzewo bez dotykania indeksu.Resetuje indeks, aby dopasować
HEAD
, działające drzewo pozostawione w spokoju:Koncepcyjnie, to sprawdza indeks do działającego drzewa. Aby to zrobić, musisz zrobić to,
-f
aby wymusić zastąpienie wszelkich lokalnych zmian. Jest to funkcja bezpieczeństwa zapewniająca, że forma „bez argumentów” nie jest destrukcyjna:Po rozpoczęciu dodawania parametrów prawdą jest, że nakładają się na siebie.
checkout
jest zwykle używany z odgałęzieniem, znacznikiem lub zatwierdzeniem. W takim przypadku zresetuje sięHEAD
i indeks do danego zatwierdzenia, a także indeksu do działającego drzewa.Ponadto, jeśli dostarczy
--hard
sięreset
można zwrócićreset
, aby zastąpić drzewo pracuje jak resetowanie indeksu.Jeśli obecnie masz sprawdzony oddział, istnieje zasadnicza różnica między nimi
reset
icheckout
kiedy podasz alternatywny oddział lub zatwierdzasz.reset
zmieni bieżącą gałąź, aby wskazywała na wybrane zatwierdzenie, podczas gdycheckout
pozostawi bieżącą gałąź w spokoju, ale zamiast tego pobierze dostarczoną gałąź lub zatwierdzenie.Inne formy
reset
icommit
ścieżki zaopatrzenia.Jeśli podasz ścieżki do
reset
, nie możesz podać--hard
ireset
zmienisz tylko wersję indeksu dostarczonych ścieżek do wersji w dostarczonym zatwierdzeniu (lubHEAD
jeśli nie określisz zatwierdzenia).Jeśli podasz ścieżki do
checkout
,reset
to tak jak zaktualizuje wersję indeksu podanych ścieżek, aby pasowała do podanego zatwierdzenia (lubHEAD
), ale zawsze będzie pobierać wersję indeksu podanych ścieżek do działającego drzewa.źródło
Jeden prosty przypadek użycia podczas
cofania zmiany: 1. Użyj resetowania, jeśli chcesz cofnąć inscenizację zmodyfikowanego pliku.
2. Użyj kasy, jeśli chcesz odrzucić zmiany w niestabilnych plikach.
źródło
Najważniejsza różnica w pigułce polega na tym, że
reset
przenosi bieżące odniesienie do gałęzi , natomiastcheckout
nie przesuwa (przesuwa HEAD).Jak wyjaśnia książka Pro Git w temacie Reset Demystified ,
Zobacz także odpowiedź VonC na bardzo pomocny fragment tekstu i diagramu z tego samego artykułu, którego tutaj nie powielę.
Oczywiście jest o wiele więcej szczegółów na temat tego, jakie efekty
checkout
i jakiereset
mogą mieć na indeks i drzewo robocze, w zależności od używanych parametrów. Istnieje wiele podobieństw i różnic między tymi dwoma poleceniami. Ale, jak widzę, najważniejsza różnica polega na tym, czy poruszają wierzchołkiem bieżącej gałęzi.źródło
Te dwa polecenia (reset i kasy) są całkowicie różne.
checkout X
NIE JESTreset --hard X
Jeśli X jest nazwą gałęzi,
checkout X
zmieni bieżącą gałąź, areset --hard X
nie zmieni.źródło
krótkie mnemoniki:
źródło