Git, jak przywrócić rebase

112

Jak w Git wycofać rebase, jeśli nie jesteś z niego zadowolony?

Git nie ma możliwości uruchomienia na sucho dla rebase. Jeśli zrobiłem rebase i jeszcze go nie pchnąłem, jak mogę cofnąć się do wcześniej, jakby to się nigdy nie wydarzyło?

user1615666
źródło
4
git rebase --abort
olibiaz
2
Co masz na myśli przez „przegrany”? Czy ukończyłeś rebase i nie podobają Ci się wyniki? A może doszło do konfliktów i chciałeś zatrzymać rebase w środku? Zakładam to pierwsze, ponieważ nie można wcisnąć sprzecznej, niedokończonej rebase, ale pytam, ponieważ są to dwa różne pytania.
Edward Thomson,
tak, były. dzięki.
user1615666
3
Możliwy duplikat Undoing a git rebase
Jon Schneider,

Odpowiedzi:

226

Możesz użyć reflog, aby znaleźć pierwszą akcję przed rozpoczęciem rebase, a następnie zresetować - trudno do niej wrócić. na przykład

$ git reflog

b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...

$ git reset HEAD@{2} --hard

Teraz powinieneś wrócić przed rozpoczęciem rebase.

Aby znaleźć właściwe miejsce do zresetowania, wystarczy wybrać wpis znajdujący się najbliżej góry, który nie zaczyna się od „rebase”.

Alternatywne podejście

Jeśli rebase jest jedyną rzeczą, którą zrobiłeś na gałęzi, tj. Nie masz niezakończonych zatwierdzeń / zmian - możesz po prostu usunąć lokalną gałąź za pomocą, git branch -Da następnie sprawdzić ją ponownie:

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

Lub dla tego samego efektu możesz zresetować - twardo do gałęzi pochodzenia:

$ git reset --hard origin/my-branch

Jeśli zrobiłeś to, gdy miałeś inne niezakończone commity, stracisz je. W takim przypadku po prostu użyj metody reflog powyżej, aby wskoczyć z powrotem do wpisu reflog, w którym dokonałeś zatwierdzeń.

Robbie
źródło
11
Jeszcze jeden przydatny skrót: rebase ustawia ORIG_HEADoryginalną wartość skrótu gałęzi podlegającej zmianie bazy. Więc zamiast znaleźć numer 2 dla HEAD@{2}, możesz po prostu użyć ORIG_HEAD... ale tylko wtedy, gdy ORIG_HEADnadal jest niezakłócony. Zestaw poleceń Gita ustawia to (rebase, am, reset i merge, w różnych okolicznościach).
torek
1
Dziękuję Panu! Wielka pomoc w tym :)
Alec
1
dziękuję z powrotem mój kod źródłowy ... po użyciu tego $ git reset HEAD @ {2} --hard
reza rahmad
Otrzymuję moje poparcie za sugestię usunięcia lokalnego oddziału i wyciągnięcia go ponownie!
quicklikerabbit
1
To ratuje życie. Dziękuję @Robbie
Nelson Katale
45

Rebase zachowuje kopię zapasową starego stanu jako ORIG_HEAD.
Możesz więc przywrócić ostatnią rebase, uruchamiając:

git reset --hard ORIG_HEAD
Meligy
źródło
1
Czy wiesz, gdzie jest udokumentowany ten tag?
Ben S
Czy jest jakiś minus, czy jest to nowa funkcja? Wydaje się to o wiele łatwiejsze niż przesiewanie przez reflog.
1252748
To nie jest nowe. Ale zwykle używałbyś go zaraz po ponownym bazowaniu, nie mógłbyś cofnąć się wstecz po kilku ponownych bazach itp. W tych złożonych sytuacjach szukałbyś rzeczy relogowych, ale po prostu „Ups, co ja właśnie zrobiłem? W tej chwili?" działa dobrze.
Meligy