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:
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}
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.
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.
--hard
! Ryzyko przypadkowego uruchomienia tego polecenia jest znacznie wyższe. Na przykład chcesz usunąć scenę z jednego plikugit 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 igit reset foo-branch
zamiast tego uruchamiacie polecenie . VoilàOdpowiedzi:
Krótka odpowiedź:
Długa odpowiedź:
Git prowadzi dziennik wszystkich aktualizacji referencji (np. Kasy, resetowania, zatwierdzania, scalania). Możesz go wyświetlić, wpisując:
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:Pierwszy wiersz mówi, że
HEAD
0 pozycji temu (innymi słowy, bieżąca pozycja) to 3f6db14; uzyskano go poprzez zresetowanie doHEAD~
. Drugi wiersz mówi, żeHEAD
1 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, uruchomgit reset HEAD@{1}
(lubgit 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
reflog
konkretną gałąź, którą chcesz zresetować, powiedzmy master, niżHEAD
:Powinno to mieć mniej hałasu niż w ogóle
HEAD reflog
.źródło
reflog
tego celu, lubię używaćgit log --graph --decorate --oneline $(git rev-list -g --all)
. Pokazuje drzewo wszystkich zatwierdzeń, w tym zwisające gałęzie nienazwanegit init
, a potem zaraz potemgit reset --hard
. Na początku nie ma żadnych rejestrów ani nawet dzienników. Czy te pliki są teraz prawie toastem?git add
(tzn. Nigdy nie wystawiłeś tej wersji pliku), togit checkout
lubgit reset --hard
zniszczy jedyną kopię (katalog roboczy) bez kopii zapasowej. Chciałbym, żeby tak nie było.git reset HEAD~12
oops ...git reset HEAD@{12}
nooo .. 'git reflog' na ratunek! och, to tylkogit reset HEAD@{1}
Stare pytanie i wysłane odpowiedzi działają świetnie. Wpadnę jednak z inną opcją.
git reset ORIG_HEAD
ORIG_HEAD
odwołuje się do zatwierdzonegoHEAD
wcześniej odwołania.źródło
git reset ORIG_HEAD
? Dzięki.Moja sytuacja była nieco inna, zrobiłem to
git reset HEAD~
trzy razy.Aby to cofnąć, musiałem to zrobić
więc powinieneś być w stanie to zrobić
Ale jeśli zrobiłeś git reset za pomocą
musisz zrobić
Ponieważ {N} reprezentuje liczbę operacji w Reflog. Jak zauważył Mark w komentarzach.
źródło
reflog
udostę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ą.1.Użyj,
git reflog
aby uzyskać aktualizację wszystkich referencji.2)
git reset <id_of_commit_to_which_you_want_restore>
źródło