Git - Как исправить «поврежденную» интерактивную ребазу?

184

Мне удалось создать небольшой беспорядок в моем локальном Git-хранилище. Я пытался исправить поврежденный коммит, используя следующие инструкции . Перед запуском «git commit --amend» (и после git rebase --interactive) я решил, что мои изменения были неправильными, и поэтому выполнил «git reset HEAD --hard». Не очень хорошая идея, говорю я вам.

Теперь интерактивный ребаз кажется «застрявшим». Git показывает текущую ветвь как (| REBASE-m). Каждая команда (cd .., ls, git rebase ...) внутри моего хранилища выдает следующую ошибку:

cat: .git / rebase-merge / head-name: нет такого файла или каталога

Вот как выглядит 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

Вот результат git rebase --continue:

$ 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

Любые идеи? Я хотел бы вернуть ситуацию обратно в состояние, в котором она была до того, как я начал свою продуманную операцию перебазирования.

Вот как git log --oneline показывает ситуацию:

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

И это нормально.

Я использую msysgit v1.7.0.2.

Микаэль Коскинен
источник
60
git rebase --quitработал для меня
Хуан Кайседо

Ответы:

160

Похоже, Git пытался удалить .git/rebase-mergeкаталог, но не смог удалить его полностью. Вы пытались скопировать эту папку? Также скопируйте .git/rebase-applyпапку, если она есть.

Мартин Оуэн
источник
7
Спасибо что подметил это. Я смог решить мою проблему, просто перезагрузив компьютер. Я не уверен, что пошло не так, потому что каждый доступ к папке .git \ rebase-merge вызывал ошибку «Отказано в доступе».
Микаэль Коскинен
20
Перезагрузка не работает для меня , но git rebase --abort(из stackoverflow.com/a/4757777/146044 ) сделала работу.
Бэкус
3
Просто перезапуск оболочки git (windows) работал для меня ( git rebase --abortне работал)
mhand
4
предупреждение ... у меня было 4 часа изменений в моем рабочем каталоге, когда я обнаружил поврежденную ошибку rebase. попробовал, git rebase --abortон стер мои неустановленные изменения ... ошибка все-таки исчезла
Джордж Ананда Эман
117
перезагрузка или git rebase --abortвсе-таки дал мне ошибки. git rebase --quitработал на меня.
Флавио Родригес
201

Я застрял в этом. Я создал файл заголовка, а затем столкнулся с другой ошибкой, сообщив, что он не может найти файл, поэтому я создал этот файл. Затем я получил еще одну ошибку, говорящую о том, что не могу прочитать «.git / rebase-apply / into»: такого файла или каталога нет.

Поэтому я посмотрел документацию по git для перебазирования и нашел другую команду:

git rebase --quit

Это вернуло меня к моей ветке без изменений, и я мог начать заново, как новый.

Лаура Слокум
источник
51
git rebase --quitэто было
Стивен Шоу
5
--quitработал. --abortне потому, что перебазировка была отменена на полпути
Калоб Таулиен
1
У меня была похожая ошибка, связанная с rebase, только с другим сообщением об ошибке. Пробовал: $ git rebase --abortВывод: error: could not read '.git/rebase-apply/head-name': No such file or directoryнаконец, это решение исправляет мою проблему:git rebase --quit
aff
Upvoted. git rebase --quitабсолютно спас меня. Симптомы те же, что и описанные, но мои появились после попытки сделать git pull --rebase, что по какой-то причине не удалось. Обратите внимание, что я включил autostash (git version 2.27.0.windows.1) и одновременно запустил VS2019 (указывает на это хранилище) - подозреваю, что какая-то их комбинация испортила его.
ErrCode
90

У меня была похожая проблема из-за процесса zombie vim.exe. Убить его в диспетчере задач, после чего git rebase --abortисправить это.

user584317
источник
это тоже была моя проблема. Я использовал handleкоманду sysinternals и увидел, что процесс (sh.exe) заблокировал файл. Используя pskill <pid>исправил это для меня.
Пол Оливер
У меня была та же проблема, но с Sublime Text для меня.
Тойво Савен
35

Спасибо @Laura Slocum за ваш ответ

Я все испортил во время перебазирования и получил отдельную ГОЛОВКУ с

 error: could not read orig-head

это помешало мне закончить перебазирование.

Кажется, что отсоединенная ГОЛОВА точно содержит мое правильное состояние ребазировки, поэтому я побежал

rebase --quit

и после этого я проверил новую временную ветку, чтобы привязать ее к отделенной голове.

Сравнивая его с веткой, которую я хотел перебазировать, я вижу, что новая временная ветка находится именно в том состоянии, в котором я хотел достичь. Спасибо

Рут
источник
7

Была такая же проблема в Eclipse. Не удалось перебазировать => прервать Eclipse.

Выполнение git rebase --abort из Git Bash Работало для меня.

Правин Хиремат
источник
7

В Windows, если вы не хотите или не можете перезагрузить компьютер, см. Ниже.

Установите Process Explorer: https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

В Process Explorer найдите> Файловый дескриптор или DLL ...

Введите имя файла, указанное в ошибке (для моей ошибки это было «git-rebase-todo», но в приведенном выше вопросе «done»).

Process Explorer выделит процесс, удерживающий блокировку файла (для меня это был «grep»).

Завершите процесс, и вы сможете прервать действие git стандартным способом.

Даррен Йейтс
источник
5

Создайте файл с таким именем:

touch .git/rebase-merge/head-name

и чем пользоваться git rebase

Техила Дабуш
источник
3

В моём случае так git rebase --abortи git rebase --continueкидался

ошибка: не удалось прочитать .git / rebase-apply / head-name: нет такого файла или каталога

Мне удалось решить эту проблему, вручную удалив: .git\rebase-applyкаталог.

Дариуш
источник
2

Я использую git version 2.19.2.windows.1.

единственное, что сработало для меня, это удалить .git/rebase-apply/каталог и сделать git reset --hard.

Spongman
источник
1

В моем случае это было потому, что я открыл журнал SmartGit в соответствующем проекте Git и Total Commander в соответствующем каталоге проекта. Когда я закрыл оба я смог перебазировать без проблем.

Чем больше я думаю об этом, тем больше я подозреваю, что Total Commander, т.е. Windows имеет блокировку открытого каталога, с которым git rebase пытался что-то сделать.

Дружеский совет: когда вы пытаетесь что-то исправить, всегда делайте одно изменение за раз. ;)

meridius
источник
1

Я перепробовал все вышеупомянутые шаги, но у меня ничего не получалось. Наконец, перезагрузка компьютера сработала для этой проблемы: D

Мохаммед Асиф
источник
1

С SublimeText 3 в Windows проблема решается простым закрытием окон Sublime, используемых для интерактивной редакции.

Leborgne
источник
0

После того, как вы успешно завершили сброс X количества коммитов, последняя команда должна быть git rebase --continue. Это завершает процесс и выходит из режима ребазирования.

diptia
источник
0

У меня такая же проблема. Я использовал Process Explorer, как было предложено в другом посте (я не могу найти этот пост), и выяснил, какой процесс заблокировал файл и убил его. затем выполните --continue или --abort в соответствии с потребностями

user3739537
источник
0

В моем случае после тестирования всех этих вариантов и по- прежнему возникают проблемы , я попробовал sudo git rebase --abortи он сделал все это

Dani.Rangelov
источник
Будьте осторожны, если вы делаете это в середине фактической перезагрузки. Просто потерял мои изменения: '(
Freeman L
Это считалось «испорченным», тогда вы начинаете
заново с ребазом
0

попробовал все остальное, кроме перезагрузки, у меня получилось rm -fr .git/REBASE_HEAD

Джереми Во
источник
0

Если вы получаете состояние ниже и ребаз не работает,

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

Тогда сначала беги,

$ git rebase -quit

А затем восстановить предыдущее состояние из reflog,

$ 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

С помощью,

$ git checkout HEAD@{1} #or
$ git checkout master #or
$ git checkout 4035795 #or
Саззад Хисейн Хан
источник
-3

Я использую Git в затмении, и у меня была такая же проблема.

В конце концов я обнаружил, что пункт меню «Rebase ...» был временно преобразован в подменю.

Team-> Rebase -> Abort

Это сработало для меня.

Шива Агравал
источник