Git: коммиты Squash старше конфликтующего слияния

Я хотел бы раздавить некоторые коммиты, которые старше «конфликтующего» слияния. Например.:

main branch:  A--B--C--D--G--H
dev branch:    \-E--F----/

H - моя текущая голова, G - конфликтующее слияние (поэтому слияние, в котором я разрешал конфликты вручную), и я хотел бы раздавить C и D, но если я попытаюсь сделать это, я получаю конфликты перебазирования, которые происходят из-за G было конфликтующим слиянием.

Могу ли я раздавить C и D в любом случае, и если да, то как? Мне было бы интересно решение, в котором мне не нужно снова что-то сливать вручную.

Дополнительная информация: git rebase -i B не работает даже при оставлении всех коммитов на "выбор" - что ничего не должно делать, верно?

Первый шаг: добавьте опцию -r (сокращение от --rebase-merges) к вашей команде git rebase. Без него git rebase просто удалит коммиты слияния из списка воспроизведенных коммитов.

LeGEC 21.12.2020 13:16

Спасибо, вы правы, это первый шаг, и он решает, по крайней мере, проблему, что он даже не работает, когда ничего не меняется в редакторе git (не меняя никакой "выборки") - но это не решает мою проблему конфликтов при раздавливании C и D.

Marius Melzer 21.12.2020 15:04

во-вторых: поскольку изменения содержимого нет, если вы снова столкнетесь с конфликтом слияния, пытаясь объединить F и <new C>, вам просто нужно использовать тот же контент, что и G: попробуйте что-то вроде git restore --staged --source G -- .

LeGEC 21.12.2020 15:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
133
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Во-первых: по умолчанию 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

и вы добились всего, чего добилась бы перебазировка, гораздо быстрее.

Другие вопросы по теме