Подтвердить что ты не робот

Git: "Невозможно" сквош "без предыдущей фиксации", а rebase

У меня есть следующий текст в git rebase -i HEAD~2:

pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link

# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...

Теперь, когда я пытаюсь раздавить первый (56bcce7) и выбрать второй, добавив "s" перед первым, я получаю следующую ошибку:

Cannot 'squash' without a previous commit

Может кто-нибудь объяснить мне, что это значит, и как мне это сделать?

Я хочу раздавить первый коммит (56bcce7) и "выбрать и перефразировать" второй (e43ceba) коммит

4b9b3361

Ответ 1

Интерактивная ребаза представляет коммиты в обратном порядке того, с которым вы привыкли при использовании git log. git rebase -i повторяет выбранные коммиты в точном порядке (сверху вниз), указанном в файле сохраненных инструкций. При раздавливании фиксация, выбранная для раздачи, объединяется с фиксацией, которая предшествует ей в (отредактированном) списке, т.е. Фиксации из предыдущей строки. В вашем случае - предыдущей фиксации для 56bcce7 нет. Вы должны сделать одно из следующих

  • git rebase -i HEAD~3 (если вы хотите скворовать 56bcce7 в 684f917)
  • Если вы хотите объединить 56bcce7 с e43ceba, а e43ceba не зависит от 56bcce7, просто измените порядок:

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    

    ОБНОВЛЕНИЕ: Ответ Гуса ниже предлагает лучший способ сделать то же самое, не переупорядочивая два коммита:

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    

    Это будет сквош/слияние двух коммитов в один. Когда интерактивная переадресация запрашивает перекодированное сообщение фиксации для 56bcce7, укажите сообщение фиксации, которое описывает объединение 56bcce7 и e43ceba.

Ответ 2

У меня была аналогичная проблема, которую я решил следующим образом:

Это группа фиксации, которую я хотел раздавить:

1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

Как вы можете видеть, я не хотел. 4, но 1, 2 и 3 не совершали никаких попыток нанести удар. Следовательно, Can not "squash" без предыдущей ошибки фиксации.

Мое решение состояло в использовании опции r для # r, reword = use commit, but edit the commit message

Итак, мой список коммитов выглядит следующим образом:

1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

После сохранения интерактивная оболочка попросила меня переписать выбранный коммит.

После этого в моем журнале фиксации произошла отдельная фиксация, которая привела к более чистой истории фиксации.

Ответ 3

У меня была эта проблема, и причина, по которой это произошло в моем случае, заключалась в том, что вы не можете раздавить старые коммиты на новый коммит. Вот пример, скажем, у вас есть 3 коммитов:

1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

Теперь, если вы говорите git rebase -i HEAD~3 и делаете что-то вроде

1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back

Это приведет к ошибке:

ошибка: не может "раздавить" без предыдущего коммита     Вы можете исправить это с помощью 'git rebase --edit-todo' и затем запустить 'git rebase --continue'.     Или вы можете прервать перебазирование с помощью "git rebase --abort".

Решение:

При сжатии коммитов вы должны раздавить недавние коммиты на старые, а не наоборот, поэтому в примере это будет примерно так:

1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

Это будет работать нормально, если вам нужны все ваши сообщения о коммите, я бы предложил исправить вместо сквоша.

Ответ 4

Лучше всего просто сказать в интерактивном редакторе, содержащем коммиты, git всегда сквош снизу вверх, и нужно оставить запись "pick" вверху, чтобы получать сквош снизу.

Ответ 5

Я уже встречаюсь с этой проблемой только сейчас, это просто небрежно. Вы можете решить проблему следующим образом: когда вы пытаетесь сквоить первый (56bcce7) и выберите второй, вы должны добавить "s" до вторая строка, но не первая. вы также можете ссылаться на следующий веб-сайт: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html