Te trzy polecenia mają zupełnie inne cele. Nie są nawet do siebie podobne.
git revert
To polecenie tworzy nowe zatwierdzenie, które cofa zmiany z poprzedniego zatwierdzenia. To polecenie dodaje nową historię do projektu (nie modyfikuje istniejącej historii).
git checkout
To polecenie pobiera zawartość z repozytorium i umieszcza ją w drzewie roboczym. Może mieć również inne efekty, w zależności od sposobu wywołania polecenia. Na przykład może również zmienić gałąź, nad którą obecnie pracujesz. To polecenie nie wprowadza żadnych zmian w historii.
git reset
To polecenie jest nieco bardziej skomplikowane. W rzeczywistości robi kilka różnych rzeczy w zależności od tego, w jaki sposób jest wywoływany. Zmienia indeks (tak zwany „obszar przejściowy”). Lub zmiany, na które aktualnie wskazuje szef oddziału. To polecenie może zmienić istniejącą historię (zmieniając zatwierdzenie, do którego odwołuje się gałąź).
Za pomocą tych poleceń
Jeśli dokonano zatwierdzenia gdzieś w historii projektu, a później zdecydujesz, że zatwierdzenie jest nieprawidłowe i nie powinno być wykonane, to git revert
jest to narzędzie do zadania. Cofa zmiany wprowadzone przez złe zatwierdzenie, rejestrując „cofnięcie” w historii.
Jeśli zmodyfikowałeś plik w swoim drzewie roboczym, ale nie zatwierdziłeś zmiany, możesz użyć go git checkout
do pobrania nowej kopii pliku z repozytorium.
Jeśli dokonałeś zatwierdzenia, ale nie udostępniłeś go nikomu i zdecydujesz, że go nie chcesz, możesz użyć git reset
przepisania historii, aby wyglądało to tak, jakbyś nigdy tego nie zrobił.
To tylko niektóre z możliwych scenariuszy użytkowania. Istnieją inne polecenia, które mogą być przydatne w niektórych sytuacjach, a powyższe trzy polecenia mają również inne zastosowania.
git reset
igit checkout
może zrobić dokładnie to samo. Mówienie, że „nie są nawet do siebie podobne”, to nie tylko przesada: nie jest to nawet prawda. Te dwa polecenia mogą wykonywać tak wiele różnych czynności, z których niektóre całkowicie się pokrywają. Przykład:git reset --hard
igit checkout -- .
zrobi dokładnie to samo. I logicznie rzecz biorąc,git reset --hard <path>
igit checkout <path>
powinna też zrobić dokładnie to samo - jednak git uniemożliwia to robić. Pomylenie tych dwóch poleceń jest BARDZO łatwe.git reset --hard <path>
tak, jak możeszgit checkout <path>
dokładnie, ponieważ te dwa polecenia robią coś zupełnie innego.git reset
każe Gitowi przenieść HEAD do innego zatwierdzenia.git checkout
z drugiej strony wcale nie prosi Gita o zrobienie czegokolwiek z HEAD. Pozostawia HEAD w spokoju i jedynie sprawdza plik. Tak, możesz je wytwarzać w taki sposób, aby miały podobne efekty. Ale to, co faktycznie robią, jest zupełnie inne.Powiedzmy, że miałeś zobowiązania:
git revert B
, utworzy zatwierdzenie, które cofnie zmiany wB
.git revert A
, utworzy zatwierdzenie, które cofnie zmiany wA
, ale nie dotknie zmian wB
Należy zauważyć, że jeśli zmiany w
B
są zależne od zmian wA
, przywrócenieA
nie jest możliwe.git reset --soft A
, zmieni historię zatwierdzeń i repozytorium; katalog roboczy i roboczy nadal będzie w stanieC
.git reset --mixed A
, zmieni historię zatwierdzeń, repozytorium i inscenizację; katalog roboczy nadal będzie w stanieC
.git reset --hard A
, zmieni historię zatwierdzeń, repozytorium, katalog przemieszczania i katalog roboczy; wrócisz do stanuA
całkowicie.źródło
git revert
służy do cofnięcia poprzedniego zatwierdzenia. W git nie możesz zmienić ani usunąć wcześniejszego zatwierdzenia. (Właściwie możesz, ale może to powodować problemy.) Zamiast edycji wcześniejszego zatwierdzenia, cofnij wprowadza nowe zatwierdzenie, które odwraca wcześniejsze.git reset
służy do cofnięcia zmian w katalogu roboczym, które nie zostały jeszcze zatwierdzone.git checkout
służy do kopiowania pliku z innego zatwierdzenia do bieżącego drzewa roboczego. Nie zatwierdza automatycznie pliku.źródło
git reset --soft
resetuje tylko HEAD,git reset --hard
resetuje HEAD i katalog roboczy.git checkout
modyfikuje twoje drzewo robocze,git reset
modyfikuje odniesienie do gałęzi, na której wskazujesz,git revert
dodaje zmiany cofania zmian.źródło
git reset
nie tylko modyfikuje zatwierdzenie wskazane przez gałąź , ale także służy do wycofywania plików z indeksu i może modyfikować kopię roboczą za pomocągit reset --mixed
(domyślnie).Reset - na poziomie zatwierdzenia resetowanie jest sposobem na przeniesienie wierzchołka gałęzi do innego zatwierdzenia. Można tego użyć do usunięcia zatwierdzeń z bieżącej gałęzi.
Cofnij - Cofanie anuluje zatwierdzenie poprzez utworzenie nowego zatwierdzenia. Jest to bezpieczny sposób na cofnięcie zmian, ponieważ nie ma szans na ponowne zapisanie historii zmian. Porównaj to z git reset, który zmienia istniejącą historię zatwierdzeń. Z tego powodu git revert powinien być używany do cofania zmian w oddziale publicznym, a git reset powinien być zarezerwowany dla cofania zmian w oddziale prywatnym.
Możesz zajrzeć na ten link - Zresetuj, Do kasy i Przywróć
źródło
Jeśli złamałeś drzewo, ale nie zatwierdziłeś kodu, możesz go użyć
git reset
, a jeśli chcesz przywrócić tylko jeden plik, możesz go użyćgit checkout
.Jeśli złamałeś drzewo i zatwierdziłeś kod, możesz użyć
git revert HEAD
.http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html
źródło