Я хотел бы раздавить некоторые коммиты, которые старше «конфликтующего» слияния. Например.:
main branch: A--B--C--D--G--H
dev branch: \-E--F----/
H - моя текущая голова, G - конфликтующее слияние (поэтому слияние, в котором я разрешал конфликты вручную), и я хотел бы раздавить C и D, но если я попытаюсь сделать это, я получаю конфликты перебазирования, которые происходят из-за G было конфликтующим слиянием.
Могу ли я раздавить C и D в любом случае, и если да, то как? Мне было бы интересно решение, в котором мне не нужно снова что-то сливать вручную.
Дополнительная информация: git rebase -i B
не работает даже при оставлении всех коммитов на "выбор" - что ничего не должно делать, верно?
Спасибо, вы правы, это первый шаг, и он решает, по крайней мере, проблему, что он даже не работает, когда ничего не меняется в редакторе git (не меняя никакой "выборки") - но это не решает мою проблему конфликтов при раздавливании C и D.
во-вторых: поскольку изменения содержимого нет, если вы снова столкнетесь с конфликтом слияния, пытаясь объединить F
и <new C>
, вам просто нужно использовать тот же контент, что и G
: попробуйте что-то вроде git restore --staged --source G -- .
Во-первых: по умолчанию git rebase
полностью игнорирует коммиты слияния. Вы должны указать -r | --rebase-merges чтобы git rebase
«осведомляться» о ваших действиях слияния.
В сочетании с -i
: вы увидите, что сценарий секвенсора немного сложнее и позволяет вам описать действия, которые вы хотите предпринять, чтобы воспроизвести ваши слияния.
Во-вторых: в описанном вами сценарии содержимое коммитов для слияния будет таким же, как и исходные коммиты, поэтому «разрешение конфликтов» эквивалентно: «повторно использовать тот же контент, что и G
».
Если вы столкнулись с конфликтом при слиянии: попробуйте запустить
git restore --staged --source G -- .
# or using shorthands :
git restore -S -s G -- .
Возможно, вам придется запустить git reset .
заранее, если вам нужно снять «конфликтующие» флаги с файлов в индексе.
Если в вашем локальном git нет git restore
(эта команда была добавлена совсем недавно, в git 2.27 — июнь 2020 г.): попробуйте
git read-tree G
который должен поместить содержимое G
в индекс.
Не используйте rebase для этого, rebase может раздавить вас, но он создан для гораздо более тяжелой работы, чем подобные перезаписи только для предков, он выполняет массу (медленной) подготовительной работы, чтобы разрешить любые изменения, которые вам нравятся по пути.
git replace --graft G B F # (put usable references to those commits here of course)
git filter-branch
и вы добились всего, чего добилась бы перебазировка, гораздо быстрее.
Первый шаг: добавьте опцию
-r
(сокращение от--rebase-merges
) к вашей командеgit rebase
. Без негоgit rebase
просто удалит коммиты слияния из списка воспроизведенных коммитов.