Здесь написано как переместить указатель master по истории назад так, чтобы сохранилась цепочка коммитов в других ветках, которые основываются на ветке master.
Если бы действия касались любой ветки, кроме master, (или если бы не было удаленного репозитария), то команды были бы следующие:
git checkout AB12CD345 # Переключение на коммит, на который перемещается master
git checkout -b new_master # Создание новой временной ветки и переключение на нее
git branch -D master # Удаление master
git branch -mv new_master master # Переименовывание временной ветки в master
Однако, ветка master всегда защищена от изменений на удаленном репозитарии. Она является веткой по-умолчанию, и поэтому её нельзя так просто взять и удалить или переименовать.
Последовательность действий, которая нужна для перемещения указателя master по истории назад, включает в себя команды, выполняемые непосредственно на Git-сервере в каталоге, где находится репозитарий. Далее перечислены необходимые команды, с указанием где они должны выполняться. Предполагается, что Git-сервер устроен на базе Apache2 + Gitweb. Важно соблюдать нижеуказанную последовательность.
1. Команды на клиенте:
> git checkout AB12CD345
> git checkout -b alternative_master
> git push --set-upstream origin alternative_master
2. Команды на git-сервере:
Перейти в каталог репозитария
> cd /home/git/our_repository.git
Посмотреть текущую ветку по-умолчанию:
> git symbolic-ref HEAD
refs/heads/master
Изменение текущей ветки по-умолчанию:
> git symbolic-ref HEAD refs/heads/alternative_master
3. Команды на клиенте:
Удаление master локально:
> git branch -D master
Удаление master на сервере:
> git push origin --delete master
Локальное переименование временного master в основной
> git branch -mv alternative_master master
Отправка master на сервер
> git push --set-upstream origin master
4. Команды на git-сервере:
Перейти в каталог репозитария
> cd /home/git/our_repository.git
Посмотреть текущую ветку по-умолчанию:
> git symbolic-ref HEAD
refs/heads/alternative_master
Изменение текущей ветки по-умолчанию:
> git symbolic-ref HEAD refs/heads/master
5. Команды на клиенте:
Удаление временного master на сервере:
> git push origin --delete alternative_master