Сквош частое слияние истории из основной ветки в одну
Например, я просто слил основную ветку с моей веткой функций. Тогда кто-то толкнул новые вещи на мастера. Поэтому я снова слился, чтобы не отставать. А потом кто-то снова толкнул... Я снова сливаюсь. Как сжать предыдущие слияния, чтобы два действия слияния были объединены в одно?
Как я могу превратить это:
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
на мастера.