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
) коммит
Ответы
Ответ 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