Jaka jest różnica między Git Revert, Checkout i Reset?

273

Próbuję dowiedzieć się, jak przywrócić lub wycofywania plików i projektów do wcześniejszego stanu, a nie zrozumieć różnicę między git revert, checkouti reset. Dlaczego istnieją 3 różne polecenia do pozornie tego samego celu i kiedy ktoś powinien wybrać jedno z nich?

haziz
źródło

Odpowiedzi:

461

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 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.

Dan Molding
źródło
13
Tak więc trzy komendy mogą być użyte do cofnięcia jakiejś pracy, co oznacza, że ​​nie są one tak „zupełnie inne”. Ta sama koncepcja, różne konteksty.
Bruno Santos,
16
@BrunoSantos: Świeczniki, rury ołowiane, sztylety i lina mogą być używane do mordowania ludzi, ale to nie znaczy, że żadna z tych rzeczy nie jest szczególnie podobna.
Dan Molding
12
@Dan Mounlding - Faktycznie, istnieje wiele przypadków, w których 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.
DanGordon
5
@ DanGordon Zdaję sobie sprawę, że prawdopodobnie będziemy mieli tutaj różnicę zdań. Niemniej jednak uważam, że powinienem podać jakieś wyjaśnienie. Nie możesz zrobić 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.
Dan Molding
46

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.

Akavall
źródło
1
Tak intuicyjna odpowiedź .. co powiesz na kasę
MJ Studio
29
  • 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.
Jonathan
źródło
7
Uważam, że mylisz się co do „git reset”. „git reset” resetuje HEAD do jednego z poprzednich zatwierdzeń, nie resetuje twojego katalogu roboczego. Katalog roboczy jest „resetowany” przez „git checkout [nazwa pliku]”
luigi7up
11
git reset --softresetuje tylko HEAD, git reset --hardresetuje HEAD i katalog roboczy.
Ehryk,
git reset --mixed (domyślnie): niezalecane + zmiany
sceniczne
21
  • git checkout modyfikuje twoje drzewo robocze,
  • git reset modyfikuje odniesienie do gałęzi, na której wskazujesz,
  • git revert dodaje zmiany cofania zmian.
dan_waterworth
źródło
4
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).
git reset --soft: niezalecane zmiany, zmiany są pozostawione w fazie (indeks). git reset --mixed (domyślnie): niezalecane + zmiany sceniczne, zmiany pozostawia się w działającym drzewie. git reset --hard: unommit + unstage + usuń zmiany, nic nie zostało.
NattyC,
6

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óć

Sachchidanand Singh
źródło