Удалить ветку функции множественного слияния в истории git

В настоящее время я конвертирую репозиторий SVN в Git, и во время этого процесса я хочу сделать историю максимально линейной. Проблема в том, что у меня есть некоторые ветки функций в SVN, которые сливаются с основной веткой во время процесса. Этот шаблон слияния делает перебазирование болезненным, и я не могу понять, как это сделать правильно.

Моя цель — заменить слияние ветки функций коммитами сквоша: введите здесь описание изображения

Я изучил ответ на этот вопрос, но ни один из предложенных ответов не подходит для моего случая: git удалить фиксацию слияния из истории

Как я должен раздавить свою ветку функций, чтобы я мог перебазировать ее на master в нужный момент времени?


person Björn Blissing    schedule 18.03.2019    source источник
comment
Почему это так желательно?   -  person evolutionxbox    schedule 20.03.2019
comment
Я бы сказал, что желание сделать это необычно. В этом случае я импортировал старый репозиторий SVN и хотел немного очистить репозиторий, прежде чем начать использовать его в качестве репозитория Git. Эта очистка повлекла за собой объединение связанных коммитов, исправление сообщений коммитов. Чтобы иметь возможность выполнять раздавливание с помощью интерактивной перебазировки, мне нужно было избавиться от этих коммитов слияния. Обратите внимание, что этот репозиторий Git еще не был активен, поэтому я был в порядке с переписыванием истории.   -  person Björn Blissing    schedule 21.03.2019


Ответы (1)


Предположим, что M — это самый верхний коммит слияния (между G и H):

git checkout -b cleaned-branch M
git reset --soft G
git commit -m "Get rid of merge"
git rebase M `git rev-parse master` --onto cleaned-branch
git checkout -B cleaned-branch

git reset --soft G заставит git думать, что G является вашим текущим базовым коммитом, но делает это, не затрагивая ваши файлы (в отличие от checkout), так что вы останетесь со всеми изменениями от слияния в виде незавершенных изменений и последующего коммита будет просто иметь G в качестве родителя. Затем мы перебазируем оставшиеся коммиты и перемещаем cleaned-branch вверх к результирующему коммиту подсказки.

person Aasmund Eldhuset    schedule 18.03.2019
comment
Я попробовал это предложенное решение, и есть две проблемы: 1. Коммит будет иметь сегодняшнее время/дату вместо времени/даты из истории слияния M. 2. Когда я закончу, у меня будет новая ветка «очищенная ветка». ', которая параллельна основной ветке. Я хочу иметь только основную ветку. - person Björn Blissing; 19.03.2019
comment
Хорошо. Я понял, как изменить дату/время нового коммита, чтобы они соответствовали старой дате/времени. то есть с помощью флага --date='2014-05-05T10:08:00' в команде фиксации. - person Björn Blissing; 19.03.2019
comment
Вместо этого просто закончите с git checkout -B master в последней строке, что переместит master в фиксацию перебазированного наконечника. Обратите внимание, что результирующий коммит master будет иметь другой хэш, чем исходный, но это присуще git, и этого невозможно избежать: любая манипуляция со старыми коммитами изменит хэш измененных коммитов и все их потомки совершают. - person Aasmund Eldhuset; 19.03.2019
comment
Хорошо.. Я решил это, выполнив: git checkout master, а затем git rebase --onto 'git rev-parse cleaned-branch' M 'git rev-parse master' - person Björn Blissing; 19.03.2019