Próbowałem cofnąć zatwierdzenie w git. Czy używanie jest niebezpieczne git reset --hard HEAD~1
?
Jaka jest różnica między różnymi opcjami git reset
?
Odpowiedzi:
git reset
zna pięć „trybów”: miękki, mieszany, twardy, scalaj i zachowaj. Zacznę od pierwszych trzech, ponieważ są to tryby, z którymi zwykle się spotykasz. Potem znajdziesz miły mały bonus, więc bądź na bieżąco.
Podczas używania git reset --soft HEAD~1
usuniesz ostatnie zatwierdzenie z bieżącej gałęzi, ale zmiany w pliku pozostaną w twoim drzewie roboczym . Również zmiany pozostaną w twoim indeksie, więc po dodaniu a git commit
stworzysz zatwierdzenie z dokładnie takimi samymi zmianami, jak zatwierdzenie, które "usunąłeś" wcześniej.
Jest to tryb domyślny i podobny do trybu miękkiego. Kiedy "usuwasz" zatwierdzenie git reset HEAD~1
, nadal zachowasz zmiany w swoim drzewie roboczym, ale nie w indeksie; więc jeśli chcesz "ponawiać" zatwierdzenie, będziesz musiał dodać zmiany ( git add
) przed zatwierdzeniem.
Podczas korzystania git reset --hard HEAD~1
będziesz stracić wszystkie uncommited zmian w uzupełnieniu do zmian wprowadzonych w ostatnim popełnić. Zmiany nie pozostaną w twoim drzewie roboczym, więc wykonanie git status
polecenia powie ci, że nie masz żadnych zmian w swoim repozytorium.
Ostrożnie chodź z tym. Jeśli przypadkowo usuniesz niezatwierdzone zmiany, które nigdy nie były śledzone przez git
(mów: zatwierdzone lub przynajmniej dodane do indeksu), nie masz możliwości przywrócenia ich za pomocą git
.
git reset --keep HEAD~1
jest interesujący i przydatny. Resetuje tylko pliki, które różnią się między bieżącym HEAD
a podanym zatwierdzeniem. Przerywa resetowanie, jeśli którykolwiek z tych plików ma niezatwierdzone zmiany. Zasadniczo działa jako bezpieczniejsza wersja hard
.
Ten tryb jest szczególnie przydatny, gdy masz kilka zmian i chcesz przełączyć się na inną gałąź bez utraty tych zmian - na przykład gdy zacząłeś pracować na niewłaściwej gałęzi.
Możesz przeczytać więcej na ten temat w dokumentacji resetowania git .
Uwaga
Podczas git reset
usuwania zatwierdzenia, zatwierdzenie nie jest tak naprawdę utracone, po prostu nie ma odniesienia do niego ani żadnego z jego elementów podrzędnych. Nadal można odzyskać zatwierdzenie, które zostało „usunięte” git reset
przez znalezienie jego klucza SHA-1, na przykład za pomocą polecenia takiego jak git reflog
.
--hard
prawie nigdy nie jest to właściwe, ponieważ --keep
jest znacznie bezpieczniejsze i dotyczy większości senariuszy, w których --hard
działa. Ćwiczenie palców --keep
może cię uratować pewnego dnia ...
keep
. ;)
Reset Gita ma 5 głównych trybów: miękki, mieszany, scalony, twardy, zachowaj . Różnica między nimi polega na zmianie lub niezmienności nagłówka, etapu (indeksu), katalogu roboczego .
Reset Gita - hard zmieni nagłówek, indeks i katalog roboczy.
Reset Gita - soft zmieni tylko głowę. Brak zmian w indeksie, katalogu roboczym.
Innymi słowy, jeśli chcesz cofnąć zatwierdzenie, opcja --soft powinna być wystarczająco dobra. Ale po tym nadal masz zmiany ze złego zatwierdzenia w indeksie i katalogu roboczym. Możesz modyfikować pliki, naprawiać je, dodawać do indeksowania i ponownie zatwierdzać.
Dzięki --twardemu projektowi otrzymujesz czysty plan. Jakby nie było żadnej zmiany od ostatniego zatwierdzenia. Jeśli jesteś pewien, że tego właśnie chcesz, przejdź dalej. Ale kiedy to zrobisz, całkowicie stracisz ostatnie zatwierdzenie. (Uwaga: nadal istnieją sposoby na odzyskanie utraconego zatwierdzenia).
Jest to przydatny artykuł, który w sposób graficzny przedstawia wyjaśnienie polecenia resetowania.
https://git-scm.com/docs/git-reset
Reset - twardy może być dość niebezpieczny, ponieważ nadpisuje kopię roboczą bez sprawdzania, więc jeśli w ogóle nie zatwierdziłeś pliku, zniknie.
Jeśli chodzi o drzewo źródłowe, nie mam możliwości cofnięcia zatwierdzeń. Najprawdopodobniej i tak użyłby resetu pod osłonami
git reset --help
które dość dobrze (moim zdaniem) wyjaśnia pięć trybów, a przynajmniej dwa, o które poprosił PO.
To jest główna różnica między use git reset --hard i git reset --soft:
--soft
W ogóle nie dotyka pliku indeksu ani drzewa roboczego (ale resetuje głowicę do, tak jak robią to wszystkie tryby). To pozostawia wszystkie zmienione pliki jako „Zmiany do zatwierdzenia”, jak określiłby to status git.
--hard
Resetuje indeks i drzewo robocze. Wszelkie zmiany w śledzonych plikach w drzewie roboczym są odrzucane.