У меня в тексте задачи 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

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

I want to squash the first commit(56bcce7) and "select and reword" the second(e43ceba) commit

Dawny33

Ответов: 7

Ответы (7)

Interactive rebase presents commits in the reverse order of what you are used to when using git log. git rebase -i replays the selected commits in the exact (top-down) order they are listed in the saved rebase instructions file. When squashing, the commit selected for squashing is combined with the commit that precedes it in the (edited) list, i.e. the commit from the previous line. In your case - there is no previous commit for 56bcce7. You have to do one of the following

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

    r e43ceba Lint.py: заменить устаревшую ссылку
    s 56bcce7 закрывает # 2774
    

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

    r 56bcce7 Закрывает # 2774
    s e43ceba Lint.py: заменить устаревшую ссылку
    

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

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

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

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 не было предыдущей фиксации , сквоша в. Следовательно, Невозможно "сжать" без предыдущей ошибки фиксации.

Мое решение состояло в том, чтобы использовать параметр r для # r, reword = использовать фиксацию, но отредактировать сообщение фиксации

Итак, мой список коммитов выглядел так:

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 коммита:

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

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

Сквош с обратной логикой. На более позднем этапе вы сможете выбрать желаемое сообщение фиксации.

  • выберите первую фиксацию , для которой вы не хотите сообщение фиксации.
  • squash или fixup фиксация (и), которые вы хотите объединить, до той, которая имеет сообщение фиксации, которое вы действительно хотели.
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • confirm the change (:x)
  • delete the commit message(s) that you don't want and leave only the message from the commit that you desire (in this case: Lint.py: Replace deprecated link).
  • confirm the choice (:x)

Надеюсь, для кого-то понятнее ✌🏽

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

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

Я только что попробовал такой подход.

git журнал -n3

Это покажет последние 3 коммита, которые дадут мне представление о том, какой коммит последний, а какой был ранее. Сейчас заявлен ребазинг,

git rebase -i HEAD ~ 3

Выберите самый последний коммит, поверх которого нам нужно сжать два других. Идентификатор фиксации, выбранный в качестве базовой фиксации, будет иметь вид

выбрать commit_id

Для двух других идентификаторов фиксации измените их на,

сквош commit_id

или просто

s commit_id

2022 WebDevInsider