Odpowiedzi:
Te trzy polecenia mają zupełnie inne cele. Nie są nawet do siebie podobne.
git revertTo polecenie tworzy nowe zatwierdzenie, które cofa zmiany z poprzedniego zatwierdzenia. To polecenie dodaje nową historię do projektu (nie modyfikuje istniejącej historii).
git checkoutTo 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 resetTo 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łąź).
Jeśli dokonano zatwierdzenia gdzieś w historii projektu, a później zdecydujesz, że zatwierdzenie jest nieprawidłowe i nie powinno być wykonane, to git revertjest 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 checkoutdo 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 resetprzepisania 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 reseti git checkoutmoż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 --hardi git checkout -- .zrobi dokładnie to samo. I logicznie rzecz biorąc, git reset --hard <path>i git 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żesz git checkout <path>dokładnie, ponieważ te dwa polecenia robią coś zupełnie innego. git resetkaże Gitowi przenieść HEAD do innego zatwierdzenia. git checkoutz 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:
C
B
A
git revert B, utworzy zatwierdzenie, które cofnie zmiany w B.
git revert A, utworzy zatwierdzenie, które cofnie zmiany w A, ale nie dotknie zmian wB
Należy zauważyć, że jeśli zmiany w Bsą zależne od zmian w A, przywrócenie Anie jest możliwe.
git reset --soft A, zmieni historię zatwierdzeń i repozytorium; katalog roboczy i roboczy nadal będzie w stanie C.
git reset --mixed A, zmieni historię zatwierdzeń, repozytorium i inscenizację; katalog roboczy nadal będzie w stanie C.
git reset --hard A, zmieni historię zatwierdzeń, repozytorium, katalog przemieszczania i katalog roboczy; wrócisz do stanu Acałkowicie.
git revertsł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 checkoutsłuży do kopiowania pliku z innego zatwierdzenia do bieżącego drzewa roboczego. Nie zatwierdza automatycznie pliku.git reset --softresetuje tylko HEAD, git reset --hardresetuje 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.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óć
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