Частое слияние истории сквоша из основной ветки в одну

Например, я просто объединил основную ветку с моей функциональной веткой. Затем кто-то подсунул мастеру новые вещи. Поэтому я снова слился, чтобы не отставать. А потом опять кто-то толкнул... Я снова сливаю. Как сжать предыдущие слияния, чтобы два действия слияния были объединены в одно?

Как я могу превратить это:

o---o---A---B---C---D---E
         \       \   \   \
          F---G---H---I---J

в это:

o---o---A---B---C---D---E
         \               \
          F---G-----------J'

где J и J' содержат точно такие же коды.


person flm8620    schedule 08.10.2018    source источник


Ответы (2)


Этот метод предотвращает необходимость повторного разрешения конфликтов слияния путем повторного воспроизведения ранее разрешенных изменений в фиксации слияния.

git checkout feature
git diff master > feature.patch
git reset --hard G
git branch --move trimmed_feature
git checkout -b feature master
git merge --strategy ours trimmed_feature --no-edit
git apply feature.patch --index
git commit --amend --message "Merge branch 'master' into feature"
git branch -D trimmed_feature

Сначала мы удаляем старые слияния, чтобы создать урезанную ветвь функций, затем создаем чистую ветвь функций из мастера, объединяем нашу урезанную ветвь функций, используя git merge --strategy ours, чтобы игнорировать изменения, а затем повторно применяем ранее разрешенные изменения из патча.

person Adam Millerchip    schedule 08.10.2018
comment
Спасибо, сегодня я много узнал о git. Но все еще есть небольшая проблема, хотя результат действия слияния в git симметричен, объединенный коммит все еще различает своего первого родителя и второго родителя. То, как вы даете, перевернуло двух родителей. Я думаю, что основная трудность связана с тем, что у git нет своей стратегии git merge --strategy. - person flm8620; 08.10.2018
comment
В предыдущей версии этого ответа говорилось об их ответе, но я удалил его для краткости. Что касается родительского порядка, я не думаю, что он имеет какое-либо практическое влияние на что-либо, поэтому я не буду добавлять его здесь, но если вы действительно хотите, можно поменять местами. - person Adam Millerchip; 08.10.2018

Если вы сделали только коммиты слияния для функции с G, как на вашей диаграмме, вы можете сбросить свою ветку обратно на эту фиксацию (используя --hard также для сброса файлов вашей рабочей копии), а затем повторить слияние:

git checkout feature
git reset --hard G
git merge master

Вы также можете использовать git rebase master вместо git merge master, чтобы ваша ветка содержала только коммиты F' и G', ответвляясь от E на master.

person Adam Millerchip    schedule 08.10.2018
comment
Спасибо. Но в моем случае я разрешил много конфликтов в H и I, поэтому я не хочу делать это снова. Я действительно хочу какой-то сквош, который может повторно использовать мое разрешение конфликтов. - person flm8620; 08.10.2018