Git - Jak naprawić „uszkodzony” interaktywny rebase?

183

Udało mi się stworzyć trochę bałaganu w moim lokalnym repozytorium git. Próbowałem naprawić zepsuty zatwierdzenie, korzystając z poniższych instrukcji . Przed uruchomieniem „git commit --amend” (i po git rebase --interactive) zdecydowałem, że moje zmiany są nieprawidłowe i dlatego wykonałem „git reset HEAD --hard”. Nie jest to dobry pomysł, mówię ci.

Teraz interaktywny rebase wydaje się „utknąć”. Git pokazuje bieżącą gałąź jako (| REBASE-m). Każde polecenie (cd .., ls, git rebase ...) w moim repozytorium powoduje następujący błąd:

cat: .git / rebase-merge / head-name: Brak takiego pliku lub katalogu

Oto jak wygląda git rebase --abort:

$ git rebase --abort
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/head-name: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/orig-head: No such file or directory
HEAD is now at 4c737fb Revert "Modified file names"
rm: cannot remove `c:/_work/project/src/git/.git/rebase-merge/done': Permission denied
rm: cannot remove directory `c:/_work/project/src/git/.git/rebase-merge': Directory
not empty
cat: .git/rebase-merge/head-name: No such file or directory

Oto wynik działania git rebase - kontynuuj:

$ git rebase --continue
cat: c:/_work/project/src/git/.git/rebase-merge/prev_head: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/end: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/msgnum: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/onto: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
prev_head must be defined
cat: .git/rebase-merge/head-name: No such file or directory

Jakieś pomysły? Chciałbym przywrócić sytuację do stanu sprzed rozpoczęcia dobrze przemyślanej operacji bazowania.

Oto jak git log --oneline pokazuje sytuację:

4c737fb Revert "Modified file names"
247ac02 Modified file names
33141e6 Message modifications
10a4a04 Modified db script

I w porządku.

Używam msysgit v1.7.0.2.

Mikael Koskinen
źródło
58
git rebase --quitpracował dla mnie
Juan Caicedo

Odpowiedzi:

160

Wygląda na to, że Git próbował usunąć .git/rebase-mergekatalog, ale nie był w stanie go całkowicie usunąć. Czy próbowałeś skopiować ten folder? Skopiuj również .git/rebase-applyfolder, jeśli jest obecny.

Martin Owen
źródło
7
Dzięki za zwrócenie na to uwagi. Byłem w stanie rozwiązać problem po prostu ponownie uruchamiając komputer. Nie jestem pewien, co poszło nie tak, ponieważ jakoś każdy dostęp do folderu .git \ rebase-merge powodował błąd „odmowa dostępu”.
Mikael Koskinen,
19
Reboot nie działa dla mnie, ale git rebase --abort(z stackoverflow.com/a/4757777/146044 ) zrobił praca.
backus
3
git rebase --abort
Ponowne
3
słowo ostrzeżenia ... miałem 4 godziny zmian w moim katalogu roboczym, kiedy zauważyłem uszkodzony błąd bazy. spróbowałem, git rebase --abortto wyczyściło moje nieetapowane zmiany ... błąd jednak zniknął
George Ananda Eman
116
zrestartowałem się lub git rebase --abortnadal dałem mi błędy. git rebase --quitpracował dla mnie.
Flávio Rodrigues
197

Utknąłem w tym. Utworzyłem plik head-name, a potem napotkałem inny błąd, mówiąc, że nie można znaleźć pliku, więc utworzyłem ten plik. Potem dostałem kolejny błąd, mówiąc, że nie mogę odczytać „.git / rebase-Apply / on”: Brak takiego pliku lub katalogu.

Tak patrzyłem na git dokumentacji dla przebazowania i znalazł inną komendę:

git rebase --quit

To sprawiło, że wróciłem do mojej gałęzi bez żadnych zmian i mogłem zacząć od nowa, tak jak nowy.

Laura Slocum
źródło
51
git rebase --quitto było!
Steven Shaw,
5
--quitpracował --abortnie zrobiono tego, ponieważ rebase został anulowany w połowie
Kalob Taulien
1
Miałem podobny błąd związany z rebase, tylko z innym komunikatem o błędzie. Próbowałem: $ git rebase --abortWyjście: error: could not read '.git/rebase-apply/head-name': No such file or directoryWreszcie to rozwiązanie rozwiązuje mój problem:git rebase --quit
aff
Pozytywne. git rebase --quitcałkowicie mnie uratował. Te same objawy, jak opisano, ale moje pojawiły się po próbie zrobienia git pull --rebaseczegoś, co z jakiegoś powodu się nie udało. Uwaga: Miałem włączony autostash (git w wersji 2.27.0.windows.1) i jednocześnie miałem VS2019 (wskazał na to repozytorium) - podejrzewam, że jakaś kombinacja tych pomieszała.
ErrCode
90

Miałem podobny problem z powodu procesu zombie vim.exe. Zabicie go w Menedżerze zadań, a następnie git rebase --abortnaprawienie.

użytkownik584317
źródło
to też był mój problem. Użyłem handlepolecenia sysinternals i zobaczyłem, że proces (sh.exe) zablokował plik. Za pomocą pskill <pid>naprawiłem to dla mnie.
Paul Oliver,
Miałem ten sam problem, ale dla mnie Sublime Text.
Toivo Säwén
35

Dzięki @Laura Slocum za odpowiedź

Zepsułem wszystko, gdy się opierałem, i miałem odłączoną GŁOWĘ z

 error: could not read orig-head

co uniemożliwiło mi dokończenie bazowania.

Odłączona HEAD wydaje się zawierać dokładnie mój poprawny pożądany stan bazy, więc pobiegłem

rebase --quit

a potem sprawdziłem nową gałąź temp, aby powiązać ją z odłączoną głową.

Porównując go z gałęzią, którą chciałem zmienić, widzę, że nowa gałąź tymczasowa jest dokładnie w stanie, do którego chciałem dotrzeć. Dzięki

Litość
źródło
7

Miałem ten sam problem w Eclipse. Nie można Rebase => przerwać z Eclipse.

Wykonywanie git rebase - abort z Git Bash Pracowało dla mnie.

Praveen Hiremath
źródło
7

W systemie Windows, jeśli nie chcesz lub nie możesz ponownie uruchomić komputera, patrz poniżej.

Zainstaluj Process Explorer: https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

W Process Explorer, Znajdź> Uchwyt pliku lub DLL ...

Wpisz nazwę pliku wymienioną w błędzie (dla mojego błędu było to „git-rebase-todo”, ale w powyższym pytaniu „gotowe”).

Process Explorer podświetli proces z blokadą pliku (dla mnie był to „grep”).

Zabij proces, a będziesz mógł przerwać akcję git w standardowy sposób.

Darren Yeats
źródło
5

Utwórz plik o tej nazwie:

touch .git/rebase-merge/head-name

i niż używać git rebase

Tehila Dabusz
źródło
3

W moim przypadku jeszcze mocniejszy git rebase --aborti git rebase --continuerzucał:

błąd: nie można odczytać „.git / rebase-Apply / head-name”: brak takiego pliku lub katalogu

Udało mi się rozwiązać ten problem, ręcznie usuwając: .git\rebase-applykatalog.

Dariusz
źródło
2

Używam git version 2.19.2.windows.1.

jedyną rzeczą, która działała dla mnie, było usunięcie .git/rebase-apply/katalogu i wykonanie git reset --hard.

Gąbczasty
źródło
1

W moim przypadku było tak, ponieważ otworzyłem Log SmartGit w odpowiednim projekcie Git i Total Commander w odpowiednim katalogu projektu. Kiedy zamknąłem oba, byłem w stanie dokonać bazy bez żadnego problemu.

Im więcej o tym myślę, tym bardziej podejrzewam, że Total Commander, tj. Windows ma blokadę w otwartym katalogu, z którym git rebase próbował coś zrobić.

Przyjazna rada: kiedy próbujesz coś naprawić, zawsze dokonuj jednej zmiany na raz. ;)

południk
źródło
1

Próbowałem wszystkich powyższych kroków, ale nic nie działało dla mnie. Wreszcie ponowne uruchomienie komputera zadziałało w przypadku tego problemu: D

Mohammed Asif
źródło
1

W SublimeText 3 w systemie Windows problem został rozwiązany przez zamknięcie okien Sublime używanych do interaktywnej edycji zatwierdzania.

LeBorgne
źródło
0

Po pomyślnym zakończeniu zmiany liczby X zatwierdzeń, ostatnia komenda musi być git rebase --continue. To kończy proces i wychodzi z trybu rebase.

diptia
źródło
0

Miałem ten sam problem. Użyłem eksploratora procesów, jak sugerowano w innym poście (nie jestem w stanie znaleźć tego postu), i zorientowałem się, który proces ma blokadę pliku i go zabić. następnie wykonaj --continue lub --abort zgodnie z potrzebami

użytkownik3739537
źródło
0

W moim przypadku po przetestowaniu wszystkich tych opcji i nadal występowaniu problemów próbowałem sudo git rebase --aborti zrobiłem to wszystko

Dani.Rangelov
źródło
Bądź ostrożny, jeśli robisz to w trakcie rzeczywistej bazy. Właśnie straciłem swoje zmiany: „(
Freeman L
Uznano to za „skorumpowane”, a potem zaczynasz od
bazy
0

wypróbowałem wszystko inne oprócz ponownego uruchomienia, co zadziałało dla mnie rm -fr .git/REBASE_HEAD

Jeremy Vaught
źródło
0

Jeśli przejdziesz poniżej stanu, a rebase już nie działa,

$ git status
rebase in progress; onto (null)
You are currently rebasing.
  (all conflicts fixed: run "git rebase --continue")

Potem pierwszy bieg

$ git rebase -quit

A następnie przywróć poprzedni stan z reflogu,

$ git reflog
97f7c6f (HEAD, origin/master, origin/HEAD) HEAD@{0}: pull --rebase: checkout 97f7c6f292d995b2925c2ea036bb4823a856e1aa
4035795 (master) HEAD@{1}: commit (amend): Adding 2nd commit
d16be84 HEAD@{2}: commit (amend): Adding 2nd commit
8577ca8 HEAD@{3}: commit: Adding 2nd commit
3d2088d HEAD@{4}: reset: moving to head~
52eec4a HEAD@{5}: commit: Adding initial commit

Za pomocą,

$ git checkout HEAD@{1} #or
$ git checkout master #or
$ git checkout 4035795 #or
Sazzad Hissain Khan
źródło
-3

Używam git w zaćmieniu i miałem ten sam problem.

W końcu odkryłem, że pozycja menu „Rebase ...” została tymczasowo przekształcona w podmenu.

Team-> Rebase -> Abort

To zadziałało dla mnie.

Shiva Agrawal
źródło