Jak cofnąć „git reset”?

1311

Jaki jest najprostszy sposób na cofnięcie

git reset HEAD~

Komenda? Obecnie jedynym sposobem, jaki mogę wymyślić, jest wykonanie „git clone http: // ...” ze zdalnego repozytorium.

Andrij Drozdyuk
źródło
2
Jeśli ktoś szuka sposobu cofnięcia twardego resetu, zaznacz Cofanie resetu git - twarda GŁOWA ~ 1 . Rozwiązania są bardzo podobne.
1
Możliwy duplikat Jak mogę cofnąć reset git - hard HEAD ~ 1?
underscore_d
2
To nie jest duplikat pytań związanych z --hard! Ryzyko przypadkowego uruchomienia tego polecenia jest znacznie wyższe. Na przykład chcesz usunąć scenę z jednego pliku git reset foo-file. Piszecie tylko pierwszą część nazwy pliku, wciskamy tab do autouzupełniania, faktycznie kończy się ona na nazwie oddziału, nie zauważacie jej i git reset foo-branchzamiast tego uruchamiacie polecenie . Voilà
Yushin Washio

Odpowiedzi:

2387

Krótka odpowiedź:

git reset 'HEAD@{1}'

Długa odpowiedź:

Git prowadzi dziennik wszystkich aktualizacji referencji (np. Kasy, resetowania, zatwierdzania, scalania). Możesz go wyświetlić, wpisując:

git reflog

Gdzieś na tej liście jest utracone zatwierdzenie. Powiedzmy, że właśnie wpisałeś git reset HEAD~i chcesz go cofnąć. Mój dziennik logowania wygląda następująco:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

Pierwszy wiersz mówi, że HEAD0 pozycji temu (innymi słowy, bieżąca pozycja) to 3f6db14; uzyskano go poprzez zresetowanie do HEAD~. Drugi wiersz mówi, że HEAD1 pozycja temu (innymi słowy stan przed resetowaniem) to d27924e. Zostało to uzyskane poprzez sprawdzenie konkretnego zatwierdzenia (choć w tej chwili nie jest to ważne). Aby cofnąć reset, uruchom git reset HEAD@{1}(lub git reset d27924e).

Jeśli, z drugiej strony, uruchomiłeś kilka innych poleceń od tej aktualizacji HEAD, żądane zatwierdzenie nie będzie na górze listy i będziesz musiał przeszukać reflog.

Ostatnia uwaga: może być łatwiej spojrzeć na reflogkonkretną gałąź, którą chcesz zresetować, powiedzmy master, niż HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

Powinno to mieć mniej hałasu niż w ogóle HEAD reflog.

Mark Lodato
źródło
25
Jako bardziej wizualną i ładniejszą alternatywę do reflogtego celu, lubię używać git log --graph --decorate --oneline $(git rev-list -g --all). Pokazuje drzewo wszystkich zatwierdzeń, w tym zwisające gałęzie nienazwane
texasflood
1
Powiedzmy, że mam katalog z istniejącymi plikami. W tym katalogu uruchamiam git init, a potem zaraz potem git reset --hard. Na początku nie ma żadnych rejestrów ani nawet dzienników. Czy te pliki są teraz prawie toastem?
AlanSE
@AlanSE, niestety te pliki tosty, o ile mi wiadomo. Jeśli nigdy tego nie zrobiłeś git add(tzn. Nigdy nie wystawiłeś tej wersji pliku), to git checkoutlub git reset --hardzniszczy jedyną kopię (katalog roboczy) bez kopii zapasowej. Chciałbym, żeby tak nie było.
Mark Lodato
2
git reset HEAD~12oops ... git reset HEAD@{12}nooo .. 'git reflog' na ratunek! och, to tylkogit reset HEAD@{1}
Dennis,
Po przeczytaniu doskonałego artykułu git-scm.com/blog/2011/07/11/reset.html git-reset jestem trochę mniej zdziwiony.
Andriy Drozdyuk
192

Stare pytanie i wysłane odpowiedzi działają świetnie. Wpadnę jednak z inną opcją.

git reset ORIG_HEAD

ORIG_HEADodwołuje się do zatwierdzonego HEADwcześniej odwołania.

Dan Fischer
źródło
1
Wydaje się to świetne - czy byłbyś w stanie to rozwinąć? Czy „ORIG” jest tu skrótem od „oryginał” czy „pochodzenie”? … To znaczy, czy resetuje się tam, gdzie HEAD, zanim zaczął z nim łowić małpy? A gdzie jest HEAD? Co się stanie, jeśli kilkakrotnie przeniosłeś HEAD git reset ORIG_HEAD? Dzięki.
Benjohn
ORIG oznacza oryginał, ORIG_HEAD oznacza oryginalny HEAD, przed resetem
Sam Gallagher
„Niektóre operacje, takie jak scalanie i resetowanie, rejestrują poprzednią wersję HEAD w ORIG_HEAD tuż przed dostosowaniem jej do nowej wartości. Możesz użyć ORIG_HEAD, aby przywrócić lub przywrócić poprzedni stan lub dokonać porównania.” Fragment książki: „Kontrola wersji za pomocą Gita”
Amirreza,
56

Moja sytuacja była nieco inna, zrobiłem to git reset HEAD~trzy razy.

Aby to cofnąć, musiałem to zrobić

git reset HEAD@{3}

więc powinieneś być w stanie to zrobić

git reset HEAD@{N}

Ale jeśli zrobiłeś git reset za pomocą

git reset HEAD~3

musisz zrobić

git reset HEAD@{1}

Ponieważ {N} reprezentuje liczbę operacji w Reflog. Jak zauważył Mark w komentarzach.

zainengineer
źródło
2
zaakceptowana opcja nie podaje przykładu przejścia do przodu NI był w sytuacji, w której przed godziną chciałem przekazać więcej niż 1. Próbowałem z wieloma i działało. Chciałem to dodać tutaj. Przyda się osobom szukającym cofnięcia resetu za pomocą git reset HEAD ~ 3
zainengineer
3
ale jeśli ktoś zrobił git reset HEAD ~ 3, może szybko zobaczyć, jak go cofnąć, git reset HEAD @ {3} jest wymagany bez wchodzenia w ponowne logowanie git reset HEAD ~ 3 itp. to częsta sytuacja
zainengineer
1
Myślę, że każdy, kto zobaczy {1} / {2}, zda sobie sprawę, że liczba ta może być dowolnym numerem wersji, który reflogudostępnia ci polecenie. Zgodziłem się, że twój punkt widzenia jest taki sam dla obu kierunków ~ 3 / @ {3}, ale tak naprawdę nie musiał być nową odpowiedzią.
Clint
30

1.Użyj, git reflogaby uzyskać aktualizację wszystkich referencji.

2)git reset <id_of_commit_to_which_you_want_restore>

omilus
źródło