Предположим, у вас есть история, содержащая три коммита A, B и C :
A-B-C
Я хотел бы объединить два коммита A и B в один коммит AB :
AB-C
Я попытался
git rebase -i A
который открывает мой редактор со следующим содержанием:
pick e97a17b B
pick asd314f C
Я меняю это на
squash e97a17b B
pick asd314f C
Тогда Git 1.6.0.4 говорит:
Cannot 'squash' without a previous commit
Есть ли способ или это просто невозможно?
git
rebase
git-rebase
git-rewrite-history
Кристиан
источник
источник
Ответы:
Используйте
git rebase -i --root
с Git версии 1.7.12 .В интерактивном файле перебазирования измените вторую строку коммита B, чтобы он давил, и оставьте другие строки на пике :
Это объединит два коммита A и B в один коммит AB .
Нашел в этом ответе .
источник
Ты пытался:
Можно начать , как , что , если вы по- прежнему с
edit
чемsquash
:тогда беги
Готово.
источник
git rebase --abort
начать все сначала и сделать это правильно (не раздавить первый коммит в редакторе)A
был начальный коммит, но теперь вы хотитеB
быть начальным коммитом. Коммиты git - это целые деревья, а не diffs, даже если они обычно описываются и рассматриваются в терминах diff, которые они вводят.Этот рецепт работает, даже если есть несколько коммитов между A и B и B и C.
источник
git rebase --onto tmp <sha1_for_B>
В случае интерактивного перебазирования вы должны сделать это до A, чтобы список был:
стать:
Если A является начальным коммитом, вы должны иметь другой начальный коммит, прежде чем A. Git подумает о различиях, он будет работать на разнице между (A и B) и (B и C). Следовательно сквош не работает в вашем примере.
источник
В случае, если у вас есть сотни или тысячи фиксаций, используя ответ kostmo в о
может быть непрактичным и медленным, просто из-за большого количества коммитов, которые сценарий rebase должен обработать дважды , один раз для генерации списка интерактивного редактора rebase (где вы выбираете, какое действие предпринять для каждого коммита), и один раз для фактического выполнения повторное применение коммитов.
Вот альтернативное решение, которое позволит избежать затрат времени на создание списка интерактивных редакторов ребаз , не используя интерактивный ребаз в первую очередь. Таким образом, это похоже на решение Чарльза Бейли . Вы просто создаете потерянную ветку из второго коммита, а затем перебазируете все коммиты-потомки поверх него:
Документация
источник
В связанном вопросе мне удалось придумать другой подход к необходимости раздавливания против первого коммита, то есть сделать второй.
Если вам интересно: git: как вставить коммит в качестве первого, сдвинув все остальные?
источник
Команда Git для отряда: git rebase -i HEAD ~ [количество коммитов]
Допустим, у вас есть история git коммитов:
pick 5152061 feat: добавлена поддержка сохранения изображения. (A)
выбрать 39c5a04 Fix: исправление ошибок. (B)
выбрать 839c6b3 исправить: конфликт разрешен. (С)
Теперь вы хотите раздавить A и B в AB, выполните следующие шаги:
pick 5152061 feat: добавлена поддержка сохранения изображения. (A)
s 39c5a04 Исправление: исправление ошибок. (B)
выбрать 839c6b3 исправить: конфликт разрешен. (С)
Примечание: для фиксации в сквошах мы можем использовать squash или s. Конечным результатом будет:
pick 5152061 feat: добавлена поддержка сохранения изображения. (AB)
выбрать 839c6b3 исправить: конфликт разрешен. (С)
источник
Вы должны выполнить немного магии командной строки.
Это должно оставить вас с веткой, в которой коммиты имеют AB и C.
источник