Zapomniałem o „git rebase --continue” i wykonałem „git commit”. Jak naprawić?


112

Ponownie bazowałem kod w git, wystąpiły konflikty podczas łączenia. Rozwiązałem konflikty i:

git add

W tym momencie zapomniałem zrobić:

git rebase --continue

Kontynuowałem kodowanie i zrobiłem:

git commit

za zmiany. Teraz jestem włączony "no branch"i nie mogę:

git rebase --continue 

Jak to naprawić?


# Obecnie nie w żadnym oddziale. nic do wykonania (katalog roboczy czysty)
Abhilash,

Odpowiedzi:


4

EDYCJA : spójrz również na odpowiedź poniżej, aby sprawdzić, czy jest to dla Ciebie łatwiejsze rozwiązanie. https://stackoverflow.com/a/12163247/493106


Musiałbym to wypróbować, ale myślę, że tak bym zrobił:

  1. Oznacz swoje ostatnie zatwierdzenie (lub po prostu zapisz gdzieś jego SHA1, aby go nie zgubić): git tag temp
  2. git rebase --abort
  3. Ponownie wykonaj rebase. Będziesz musiał ponownie rozwiązać połączenie. :(
  4. git rebase --continue
  5. git cherry-pick temp

Problem polega na tym, że Twoje tempzatwierdzenie prawdopodobnie zawiera zarówno rozwiązanie scalania, jak i nowy kod. Może to być trudne, ale spróbuję i zobaczę, czy zadziała.


Albo możesz oznaczyć tak, jak mówi @MatrixFrog, albo możesz zapisać go również jako łatkę. Następnie wykonaj przerwanie operacji rebase. Sprawdź stan, aby upewnić się, że repozytorium jest w stanie, o którym wiesz, że nie ma żadnych problemów, a następnie rozpocznij pobieranie i ponowne bazowanie.
yasouser

18
Nie rób tego. Zobacz odpowiedź kirikazy poniżej, aby uzyskać znacznie prostszy / czystszy sposób. Nie próbuj ponownie wybierać i rozwiązywać konfliktów.
tandrewnichols

4
@Abhilash Proszę przyjąć odpowiedź kirikaza. Ja (podobnie jak tandrewnichols) zrobiłem to i był o wiele łatwiejszy sposób (a internet wydaje się zgadzać, ponieważ ta odpowiedź ma 4x więcej głosów).
David Doria

To teraz 10x więcej głosów ... również użyj git rerere, aby zapamiętać rozwiązania konfliktów (przydatne, chyba że czasami robisz złe postanowienia, których nie chcesz, aby pamiętały).
Ajax

217

Po prostu zrób git reset --soft HEAD^. Przenosi wskaźnik HEAD do swojego rodzica, ale zachowuje drzewo robocze i dodaje zmianę scalającą do indeksu. Możesz więc kontynuować zmianę bazy git rebase --continuetak jak poprzednio.


1
To całkowicie zadziałało i był to także pierwszy raz, kiedy znalazłem zastosowanie --soft. Miło wiedzieć, jak to działa, dzięki!
mmocny

1
Mam nadzieję, że ludzie zobaczą wszystkie pozytywne głosy na tę odpowiedź i podążą za sugestią tutaj!
Raghu

1
To jest dokładnie to, co myślałem (ale może minęło ciężko przez przypadek). Nie byłem jednak pewien, czy HEAD był aktualizowany podczas ponownego bazowania. Dziękuję za potwierdzenie! Tak się cieszę, że przewinąłem trochę dalej, zanim zepsułem powyższy ból głowy.
DeezCashews

Zredagowałem zaakceptowaną odpowiedź, aby umieścić link tutaj - nie widziałem tej odpowiedzi, dopóki nie wykonałem powyższych wskazówek.
xaxxon

0

Mam ten sam problem, a co gorsza, zmieniałem bazę trzech zatwierdzeń, a po rozwiązaniu konfliktów na drugim zatwierdzeniu, „popełniłem” zamiast „rebase --continue”.

W rezultacie miałem ten reflog git

Kiedy zastosowałem rozwiązanie kirikazy, po prostu cofnąłem trzecie zatwierdzenie, a nie drugie, co było problematyczne.

Jak widać, rebase rozpoczyna się od pobrania z gałęzi zdalne / origin / master, a następnie stosuje moje trzy zatwierdzenia, które pojawiają się jako trzy poprzednie operacje (przed kasą) w reflogu.

Następnie, jeśli chcesz ponownie uruchomić z czystej bazy, przed ponownym bazowaniem, możesz po prostu mocno zresetować do skrótu tuż przed wyrejestrowaniem operacji rebase. W moim przypadku (patrz zdjęcie):

git reset --hard 859ed3c

Następnie możesz rozpocząć nowy git rebase.


0

Miałem git rebased, naprawiłem konflikty, git dodał plik z konfliktami i (omyłkowo) popełniłem.

Wypróbowałem git reset --soft HEAD^igit reset --hard podane rozwiązania , ale żadne z nich nie zadziałało.

Jednak po prostu git rebase --abortzadziałało: zabrało mnie to z powrotem do przed rozpoczęciem rebase z czystym drzewem roboczym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.