Сменить имена веток в git

103

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

Вот несколько способов, которыми это можно было бы задать / решить: как мне переименовать свою основную ветку во что-то другое, а затем переименовать что-то еще в мастер? Как мне сделать резервную копию мастера, а затем сделать так, чтобы все коммиты, которые я сделал резервную копию, были в другой ветке?

Спасибо за все (быстрые) ответы! Все они хороши.

Дэниел Бенами
источник

Ответы:

144

В дополнение к другим комментариям вам может быть полезен переключатель -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. Конечно, состояние двух репо было таким, что это все еще имело смысл.
Eponymous
3
Это не переименовывает ветки в удаленном репо, а только в локальном репо.
smohadjer
1
@smohadjer Чтобы переименовать пульты, вы бы сделали git push -uf origin masterи git push -u origin crap_work.
zyy
31

Я думаю, вам следует подумать о другой стратегии развития, чтобы предотвратить подобные проблемы. Мне кажется, что лучше всего никогда не заниматься разработкой непосредственно в моей основной ветке. Независимо от изменений, которые я вношу, я всегда создаю новую ветку для нового кода:

git checkout -b тема / имя_темы мастер

Оттуда я могу отправить изменения в публичные репозитории:

git push pu тема / имя_темы

или, в конце концов, просто объедините его с моей основной веткой:

git checkout master && git merge topic / topic_name

Если вам действительно нужно вернуться к более раннему моменту времени и установить его в качестве своего мастера, вы можете переименовать текущую ветку во что-то другое, а затем проверить старую версию, чтобы стать вашим мастером:

 git branch -m главный мусор
 git co -b master old_sha1_value
Брайан Риман
источник
Это хорошая политика. Если подумать, я видел, как это практиковалось в другом месте. Спасибо.
Rimian
14

Начните master, создайте ветку с именем in-progress, а затем вернитесь masterк более ранней фиксации.

$ git branch in-progress
$ git reset --hard HEAD^
Тед Персиваль
источник
1
Я не вижу причин для отклонения этого предложения. Я делал это сам несколько раз, прежде чем я узнал о ветке -m и понял, что master не является неизменяемым именем ветки.
skiphoppy
7

Это относительно просто:

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
оллией
источник
1
Да уж, последнее совершенно необязательно - git checkout -bсоздает ветку и делает ее активной.
BorisOkunskiy
0

Это установит вашего мастера в любую точку за один шаг:

git checkout -B master new_point
Пэнхэ Гэн
источник