Может быть несколько способов задать этот вопрос, поэтому вот описание проблемы. Я работал над мастером и передал кое-какие вещи, а затем решил, что хочу отложить эту работу. Я сделал резервную копию нескольких коммитов, а затем разветвился, прежде чем начал свою дерьмовую работу. Практически это работает нормально, сейчас у меня другая ветка в качестве основной ветки разработки. Мне интересно, как я могу что-то изменить, поэтому я снова работаю над мастером, но у него нет моей ненужной работы, и я сказал, что работа находится в другой ветке.
Вот несколько способов, которыми это можно задать / решить: Как мне переименовать свою основную ветку во что-то другое, а затем переименовать что-то еще в мастеринг? Как мне сделать резервную копию мастера, а затем сделать так, чтобы все коммиты, которые я сделал резервную копию, были в другой ветке?
Спасибо за все (быстрые) ответы! Все они хороши.
Это относительно просто:
git checkout -b fake_master master # fake_master now points to the same commit as master
git branch -D master # get rid of incorrect master
git checkout -b master real_master # master now points to your actual master
git checkout master # optional -- switch on to your master branch
Начните с master
, создайте ветку с именем in-progress
, затем сбросьте master
на более раннюю фиксацию.
$ git branch in-progress
$ git reset --hard HEAD^
Я не вижу причин для отклонения этого предложения. Я делал это сам несколько раз, прежде чем я узнал о ветке -m и понял, что master не является неизменяемым именем ветки.
В дополнение к другим комментариям вам может быть полезен переключатель -m (move) для git-branch. Вы можете переименовать свой старый мастер во что-то другое, а затем переименовать новую ветку в master:
git branch -m master crap_work
git branch -m previous_master master
В зависимости от вашего рабочего процесса вы также можете изменить ссылки на ветки в .git / config. Я изменил [branch "crap_work"]
на [branch "master"]
, чтобы мастер по-прежнему синхронизировался с origin/master
. Конечно, состояние двух репо было таким, что это все еще имело смысл.
Это не переименовывает ветки в удаленном репо, а только в локальном репо.
@smohadjer Чтобы переименовать пульты, выполните git push -uf origin master
и git push -u origin crap_work
.
Я думаю, вам следует подумать о другой стратегии развития, чтобы предотвратить подобные проблемы. Мне кажется, что лучше всего никогда не заниматься разработкой непосредственно в моей основной ветке. Независимо от изменений, которые я вношу, я всегда создаю новую ветку для нового кода:
git checkout -b topic/topic_name master
Оттуда я могу отправить изменения в публичные репозитории:
git push pu topic/topic_name
или, в конце концов, просто объедините его с моей основной веткой:
git checkout master && git merge topic/topic_name
Если вам действительно нужно вернуться к более раннему моменту времени и установить его в качестве своего мастера, вы можете переименовать текущую ветку во что-то еще, а затем проверить более старую версию, чтобы стать вашим мастером:
git branch -m master junk git co -b master old_sha1_value
Это хорошая политика. Если подумать, я видел, как это практиковалось в другом месте. Спасибо.
Это установит вашего мастера в любую точку за один шаг:
git checkout -B master new_point
Ага, последнее совершенно необязательно -
git checkout -b
создает ветку и делает ее активной.