Git Rebase, похоже, сработал, но все коммиты все еще отображаются в журнале ... в каком я состоянии? - PullRequest
8 голосов
/ 29 июля 2011

Я думаю, что я раздавил последние 40 коммитов, используя rebase. Я следовал этому руководству, чтобы убедиться, что я не сделал ничего глупого - http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

Проблема в том, что я думаю, что сделал что-то глупое.

(Интерактивный) текстовый файл не может быть сохранен, поэтому кажется, что перебазировка не удалась, но сообщение, которое он дал, и некоторые другие вещи, приведенные ниже, предполагают, что оно могло работать.

Не уверен, где я нахожусь или что делать (или даже как меня зовут). Вот что я сделал:

  • Я набрал git rebase -i HEAD ~ 40
  • Подошел текстовый файл, который я отредактировал, изменив все строки, чтобы они начинались с 'squash', кроме верхней
  • Я нахожусь на Windows, используя EditPad ... файл не может быть сохранен! О, нет ... (только для чтения / разрешения?).
  • Я сохраняю его в произвольном каталоге.
  • Командная строка показывает какой-то успех (к сожалению, я потерял сообщение). Я не знаю, как это может быть успешно, или знаю, где находится файл, который я сохранил ...

  • git rebase --continue говорит: «Нет выполнения обновления?

  • git reflog предполагает, что это сработало (из того, что я знаю, по крайней мере, слово 'rebase' отображается на последних 40 нечетных коммитах), например:

    9992445 HEAD @ {8}: ребаз: отчеты работают

  • но работает git log показывает все 40 коммитов, которые я только что "перебазировал"

Это не выглядит хорошо. Кто-нибудь знает, в каком я состоянии? Я в подвешенном состоянии, это был зомби ребаз?

Ответы [ 2 ]

18 голосов
/ 29 июля 2011

Если «список задач» не может быть сохранен, ваша перебазировка не сработала.

Самый простой способ раздавить столько коммитов - это сделать git reset --soft HEAD~40, а затем git commit сВаше новое сообщение - при условии, что вы хотите раздавить их всех.

4 голосов
/ 29 июля 2011

Этот вопрос о слегка удивительном аспекте поведения git rebase -i. Если вы закроете окно редактора без внесения каких-либо изменений, то перебазирование все равно будет иметь место. 1 (Это очень отличается от действия, когда всплывающий редактор сообщений фиксации, когда выход из редактора без каких-либо действий изменения отменяют фиксацию.)

В вашем случае, поскольку вы сохранили интерактивный список перебазирования в другом месте, а затем вышли из редактора, git предположил, что вы просто хотите повторно применить все эти коммиты, как и раньше - он не может сказать, что вы сохранили файл в другом месте. Если история была линейной между HEAD и HEAD~40, то история будет точно такой же (включая имена объектов каждого коммита), но если она была нелинейной, вы переписали бы свою историю так, чтобы она была линейной (и поэтому у некоторых коммитов будут разные имена объектов).

Вы можете захотеть проверить в reflog, что HEAD имеет одно и то же имя объекта (хеш) до и после перебазирования, чтобы проверить это.

1 Несмотря на то, что в используемой версии git может сказать, что результат будет точно таким же, он не потрудится повторно применить коммиты и просто поместит одну запись в reflog , Тем не менее, эта оптимизация явно не имела места в вашей ситуации, поскольку вы можете увидеть повторное применение каждого коммита в reflog.

...