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

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

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

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

в это:

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

где J и J'содержат абсолютно одинаковые коды.

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

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

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

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

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

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