Отмена git rebase --skip — повторно применить фиксацию во время перебазирования

Я делаю длинный git rebase с большим количеством коммитов. Я случайно --skipped сделал коммит, в котором были конфликты, которые я разрешил. Я должен был сделать git rebase --continue.

Есть ли способ повторно применить эту предыдущую фиксацию на этом этапе перебазирования, а затем продолжить перебазирование?

Я вижу один из способов

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

Или я могу сделать вишневый выбор, находясь в фазе перебазирования?


person Patrick B.    schedule 11.02.2014    source источник


Ответы (2)


Я нашел способ, который «сработал для меня»:

Во время перебазирования в каталоге .git/rebase-apply происходит множество вещей. Среди прочего есть файл с именем next. next содержит номер, соответствующий файлу, который также находится в .git/rebase-apply. Этот файл содержит информацию о коммите, который в данный момент обрабатывается. Например:

$ cat .git/rebase-apply/next
0260
$ less .git/rebase-apply/0260
<info about the commit which is currently processed (and has conflicts)

Git, кажется, сохраняет коммиты, которые пропускаются как вышеупомянутые файлы. В то время как файлы, соответствующие коммитам, которые были применены, больше не существуют. Коммит, который я случайно пропустил, назывался 0259, и файл все еще присутствовал.

Вот что я сделал:

$ echo "0258" > .git/rebase-apply/next

При этом я сказал git, что в настоящее время обрабатывается 258-й коммит (который ранее применялся правильно). Тогда я сделал

$ git rebase --skip

сказать git забыть об этом и, вуаля, я снова могу работать над пропущенным коммитом, исправлять конфликты и --continue. Это сработало.

person Patrick B.    schedule 11.02.2014
comment
Это немного изменилось в последних версиях git, но я все же смог заставить его работать, настроив эти файлы: git-rebase-todo и onto, следуя приведенной выше идее. - person goncalossilva; 07.08.2014
comment
Используя git версии 1.9.4.msysgit.1, я смог добиться успеха с подходом Патрика Б. Я не использовал ни git-rebase-todo, ни onto. - person codingdave; 24.09.2014
comment
Боюсь, это невозможно после git rebase --skip. По крайней мере для меня. У меня нет rebase-apply в моей папке .git - person riroo; 28.04.2016
comment
Для меня сегодня с git 2.20.1 каталог был .git/rebase-merge/, а файлы, которые я изменил, были git-rebase-todo и done. Я запустил git reset --hard <hash-of-parent-of-skipped-commit>, чтобы очистить рабочий каталог, и, наконец, git rebase --continue. - person Changaco; 12.01.2019
comment
Это спасительный ответ. - person Tharanga; 29.08.2019

Git великолепен, потому что он сохраняет журнал всего, что вы совершаете.

  1. Найдите свой коммит в ".git/logs/HEAD" и откройте в текстовом редакторе.

  2. #P3# <блочная цитата> #P4#
  3. #P5# <блочная цитата> #P6#

См. ссылку для справки: http://blog.screensteps.com/recovering-from-a-disastrous-git-rebase-mistake

person Cordell    schedule 15.08.2016
comment
Потрясающие! спас мой день! - person liberborn; 06.11.2018
comment
Существует специальная команда git-reflog для запроса истории коммитов, нет необходимости напрямую открывать файл. - person hlovdal; 04.12.2018
comment
Я думал, что моя тяжелая работа закончилась по моей ошибке, но нет, ты спасаешь мои дни. Спасибо. - person heyxh; 20.02.2019
comment
Вы и есть бизнес! - person MDMoore313; 21.02.2020
comment
Вы только что спасли мой рабочий день после неудачной перебазировки! - person redstonemercury; 24.12.2020
comment
Спас мой день!!! - person user3654542; 18.05.2021