Как заменить историю ветки на другую ветку?

У меня есть репозитории, которые я перенес из Perforce в Git. Время от времени я делаю git p4 rebase (где p4 - это псевдоним для git-p4) в каждом репозитории, чтобы получить новые изменения из Perfoce в Git. Эта процедура отлично работает во всех репозиториях, кроме этого обреченного репозитория, назовите его GitRepo.

По какой-то причине каждый раз, когда я «синхронизирую» GitRepo с Perforce, я получаю пустой коммит слияния, который выглядит так:

Как заменить историю ветки на другую ветку?

Так получилось, что за последние два месяца никаких изменений не было. Итак, история теперь выглядит так:

Как заменить историю ветки на другую ветку?

Обратите внимание на коммиты 06.04.2018 и 30.03.2018? Не уверен, почему они появились после 25.06.2018 (что, вероятно, является источником проблемы), и они уже существуют в истории в нужное время - эпопея.

Короче говоря, я проверил фиксацию от 25.06.2018 и перенес историю в новую ветку, Branch-A.

Branch-A выглядит именно так, как я хочу, как я могу переписать историю мастера, чтобы он был в Branch-A?


920
1

Ответ:

Решено

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

# First you can, as a backup, set a branch where master is at the start of the process
git checkout master
git checkout -b backupMaster

# Okay, now we force (-f) the master branch on the same commit where BranchA is
git branch -f master BranchA

# Local is clear, now is time to update your remote with
# your rewritten version of repo history
git push -f origin master

Теперь master находится в той же точке, что и BranchA, вплоть до их истории, поскольку это тот же самый коммит, на который они оба указывают. А ветка backupMaster здесь на всякий случай, если вы по какой-то причине передумаете.