У меня в тексте дел 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
фиксацию ( )
Ответы:
Интерактивное перебазирование представляет коммиты в порядке, обратном тому, к которому вы привыкли при использовании
git log
.git rebase -i
воспроизводит выбранные коммиты в точном (сверху вниз) порядке, в котором они перечислены в сохраненном файле инструкций по перебазированию. При сжатии фиксация, выбранная для сжатия, объединяется с фиксацией, которая предшествует ему в (отредактированном) списке, то есть фиксацией из предыдущей строки. В вашем случае - предыдущей фиксации для56bcce7
. Вы должны сделать одно из следующихgit rebase -i HEAD~3
(если вы хотите , чтобы раздавить56bcce7
в684f917
)Если вы хотите объединить
56bcce7
сe43ceba
иe43ceba
не зависит от56bcce7
, просто измените их порядок:ОБНОВЛЕНИЕ : ответ Гаса ниже предлагает лучший способ сделать то же самое, не меняя порядок двух коммитов:
Это сведет / объединит два коммита в один. Когда интерактивная перебазировка запрашивает измененное сообщение фиксации для
56bcce7
, предоставьте сообщение фиксации, которое описывает объединение56bcce7
иe43ceba
.источник
56bcce7
вe43ceba
. Итак, как мне выполнить Шаг 1 здесь?У меня была аналогичная проблема, которую я решил следующим образом:
Это группа коммитов, которую я хотел раздавить:
Как видите, я не хотел. 4, но у 1, 2 и 3 не было предыдущего коммита, в который можно было бы сквошить . Следовательно, невозможно "сжать" без предыдущей ошибки фиксации .
Мое решение заключалось в использовании
r
опции для# r, reword = use commit, but edit the commit message
Итак, мой список коммитов выглядел так:
После сохранения интерактивная оболочка попросила меня переформулировать выбранный коммит.
После этого мой журнал фиксации привел к единственной фиксации, которая привела к более чистой истории фиксации.
источник
git rebase --edit-todo
исправить и исправить, ссылаясь на этот ответ, а затем сделатьgit rebase --continue
У меня была эта проблема, и причина, по которой это произошло в моем случае, заключалась в том, что вы не можете раздавить старые коммиты на новый коммит. Вот пример, скажем, у вас есть 3 коммита:
Теперь, если вы скажете
git rebase -i HEAD~3
и сделаете что-то вродеЭто приведет к ошибке:
Решение :
При сжатии коммитов вы должны свешивать недавние коммиты на старые, а не наоборот, поэтому в примере это будет примерно так:
Это будет работать нормально, если вам нужны все сообщения о фиксации, я бы предложил исправить вместо сквоша .
источник
Сквош с обратной логикой . Вы сможете выбрать желаемое сообщение фиксации на более позднем этапе.
pick
первая фиксация, для которой вы не хотите получать сообщение фиксации.squash
илиfixup
коммит (и), который вы хотите объединить, до тех пор, пока не появится тот, который имеет сообщение о коммите, которое вы действительно хотели.:x
)Lint.py: Replace deprecated link
).:x
)Надеюсь, кому-то станет понятнее ✌🏽
источник
Лучше всего будет просто сказать в интерактивном редакторе, содержащем коммиты, git всегда сквош снизу вверх, и нужно оставить запись «выбрать» вверху, чтобы получать сквош снизу.
источник
Я просто попробовал такой подход.
Это покажет последние 3 коммита, которые дадут мне представление о том, какой коммит последний, а какой был ранее. Теперь заявил ребазинг,
Выберите самый последний коммит, поверх которого нам нужно раздавить два других. Идентификатор фиксации, выбранный в качестве базовой фиксации, будет выглядеть так:
Для двух других идентификаторов фиксации измените их на,
или просто,
источник
Я также уже встречался с этой проблемой только сейчас, это просто небрежно. Вы можете решить проблему следующим образом: когда вы пытаетесь раздавить первую (56bcce7) и выбрать вторую, вы должны добавить "s" перед второй строкой, но не первый. вы также можете сослаться на следующий веб-сайт: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html
источник