У меня есть репо, откуда пошли коммиты:

... C1 ... C2 ... C3 ... Cn в основной ветке. Допустим, я обнаружил только в момент фиксации Cn, что в коде есть серьезные проблемы, отладка которых потребует времени, и я хочу получить стабильный / хороший мастер как можно скорее. Предположим, я знаю, что C3 - последняя удачная точка. Могу ли я переопределить главную головку как C3 и пометить Cn как новую головку ветки, скажем, «отладочная» ветка? (репо удаленное, но, допустим, оно не является общедоступным).

git
2
python152 8 Сен 2016 в 21:25

3 ответа

Лучший ответ

Резюме

В Git master - это просто еще одна метка ветки, указывающая на данную фиксацию. Технически вам даже не нужна ветка с именем master для существования в репозитории.

Два лучших варианта: git-checkout и git-reset, в зависимости от того, хотите ли вы переместить историю или удалить ее. Первое - это то, о чем вы просили, а второе включено для полноты.

Использование Checkout

Вы можете делать все, что хотите, сбросив главную ветку на произвольную фиксацию. Например:

# Move current master branch aside.
git branch -m master debug

# Create a new branch at committish. Use a branch name or a commit ID.
git checkout -b master c3

Использование сброса

В качестве альтернативы, если вас не волнует существующая история, самым быстрым решением будет просто сбросить HEAD master до фиксации. Например, если вы уже находитесь в главной ветке:

git reset --hard c3

Хотя это не оставит вашу текущую историю доступной в главной ветке, полная история будет по-прежнему доступна через reflog до тех пор, пока не будет удалена.

2
Todd A. Jacobs 8 Сен 2016 в 19:22

Итак, если ваша ветка master выглядит как

... C1 ... C2 ... C3 ... Cn

Вы можете сделать следующее:

Получите текущую версию master, как показано выше

git checkout master

Создайте новую ветку, которая будет удерживать за вас Cn

git checkout -b debug_branch

Оформите заказ master еще раз, чтобы вы могли это исправить

git checkout master

Откатить фиксацию, чтобы привести ее в хорошее состояние

git reset --hard C3

Отправьте эту версию master обратно на удаленный компьютер, который "сотрет" фиксацию Cn

git push -f

Теперь вы можете локально вернуться к этой ветке отладки, чтобы выяснить, в чем проблема.

git checkout debug_branch
2
Cory Kramer 8 Сен 2016 в 18:31
git branch -M master debug
git checkout -b master C3
git push -f

Или (при попытке сохранить объединяемость):

git branch -M master debug      # same as above
git checkout -b master C3       # same as above
git merge -s ours debug
git push
1
ensc 8 Сен 2016 в 18:31