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.


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.


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.


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.


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


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.


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.



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.


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.


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. ;)


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


1

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


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.


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


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


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


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

-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.

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.