Переименуйте главную ветку для локальных и удаленных Git-репозиториев. - PullRequest
783 голосов
/ 06 октября 2009

У меня есть ветка master, которая отслеживает удаленную ветку origin/master.

Я хочу переименовать их в master-old как локально, так и на пульте. Это возможно? Что произойдет после переименования удаленной ветви для других пользователей, которые отслеживали origin/master (и которые всегда обновляли свою локальную ветку master через git pull)? Будет ли их git pull все еще работать или будет выдано сообщение об ошибке, которое он не сможет найти origin/master?

Затем, в дальнейшем, я хочу создать новую ветвь master (как локальную, так и удаленную). Опять же, после того, как я это сделал, что произойдет сейчас, если другие пользователи сделают git pull?

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

Ответы [ 15 ]

596 голосов
/ 06 октября 2009

Самым близким к переименованию является удаление, а затем повторное создание на пульте. Например:

git branch -m master master-old
git push remote :master         # delete master
git push remote master-old      # create master-old on remote

git checkout -b master some-ref # create a new local master
git push remote master          # create master on remote

Однако здесь много предостережений. Во-первых, ни одна из существующих проверок не узнает о переименовании - git не пытается отследить переименования веток. Если новый master еще не существует, git pull выдает ошибку. Если новый master был создан. тяга попытается объединить master и master-old. Так что, как правило, это плохая идея, если у вас нет сотрудничества со всеми, кто ранее проверял хранилище.

Примечание. Более новые версии git по умолчанию не позволяют удаленно удалять основную ветку. Вы можете переопределить это, установив значение конфигурации receive.denyDeleteCurrent на warn или ignore в репозитории remote . В противном случае, если вы готовы сразу же создать нового мастера, пропустите шаг git push remote :master и передайте --force шагу git push remote master. Обратите внимание, что если вы не можете изменить конфигурацию пульта, вы не сможете полностью удалить главную ветвь!

Это предостережение относится только к текущей ветви (обычно ветка master); любая другая ветка может быть удалена и воссоздана, как указано выше.

253 голосов
/ 25 сентября 2010

Предполагая, что вы в настоящее время на master:

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. Сначала создайте ветку master-old в репозитории origin, основываясь на коммите master в локальном репозитории.
  2. Создайте новую локальную ветвь для этой новой origin/master-old ветви (которая автоматически будет правильно настроена как отслеживающая ветвь).
  3. Теперь укажите ваш локальный master на любой коммит, на который вы хотите, чтобы он указывал.
  4. Наконец, принудительное изменение master в репозитории origin для отражения вашего нового локального master.

(Если вы делаете это любым другим способом, вам потребуется по крайней мере еще один шаг, чтобы убедиться, что master-old правильно настроен для отслеживания origin/master-old. .)

151 голосов
/ 25 апреля 2013

С Git v1.7, я думаю, это немного изменилось. Обновление ссылки отслеживания вашего местного филиала на новый пульт теперь очень просто.

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote
35 голосов
/ 10 февраля 2012
git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

Возможно, вам придется вручную переключиться на new-branch-name перед удалением old-branch-name

26 голосов
/ 18 марта 2014

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

Сначала короткая картинка: renaming master branch and allowing clients to fast-forward

Это действительно легко сделать; но не злоупотребляйте этим. Вся идея зависит от коммитов слияния; поскольку они допускают перемотку вперед и связывают истории одной ветви с другой.

переименование ветки:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

создание новой "основной" ветки:

# create master from new starting point
git branch master <new-master-start-point>

создание коммита слияния, чтобы иметь историю родитель-потомок:

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

и вуаля.

git push origin master

Это работает, потому что создание merge коммита позволяет быструю пересылку ветки к новой ревизии.

с использованием разумного сообщения о слиянии:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old
11 голосов
/ 06 октября 2009

Я предполагаю, что вы все еще спрашиваете о той же ситуации, что и в вашем предыдущем вопросе . То есть master-new не будет содержать master-old в своей истории. * Если вы называете master-new «master», у вас будет фактически переписанная история. Не имеет значения , как вы попадаете в состояние, в котором мастер не является потомком предыдущей позиции мастера, просто то, что он находится в этом состоянии.

У других пользователей, пытающихся вытянуть, пока мастер не существует, просто не получится тянуть их (нет такой ссылки на пульте дистанционного управления), и как только он снова появится в новом месте, их тяги будут пытаться объединить своего мастера с новым удаленный мастер, как если бы вы объединили master-old и master-new в своем хранилище. Учитывая то, что вы пытаетесь сделать здесь, слияние может привести к конфликтам. (Если бы они были решены, а результат был перенесен обратно в хранилище, вы оказались бы в еще худшем состоянии - там есть обе версии истории.)

Чтобы ответить на ваш вопрос просто: вы должны признать, что иногда в вашей истории будут ошибки. Это нормально. С кем не бывает. В репозитории git.git есть отмененные коммиты. Важно то, что как только мы публикуем историю, это то, что каждый может доверять.

* Если бы это было так, это было бы равносильно внесению некоторых изменений в мастер, а затем созданию новой ветви, где она была раньше. Нет проблем.

8 голосов
/ 25 декабря 2011

выбранный ответ не удалось, когда я его попробовал. Выдает ошибку: refusing to delete the current branch: refs/heads/master. Я думаю, я выложу, что работает для меня:

git checkout master             # if not in master already

git branch placeholder          # create placeholder branch
git checkout placeholder        # checkout to placeholder
git push remote placeholder     # push placeholder to remote repository

git branch -d master            # remove master in local repository
git push remote :master         # remove master from remote repository.

Хитрость заключается в извлечении заполнителя прямо перед его отправкой в ​​удаленный репозиторий. Остальное не требует пояснений, удаление ветки master и ее отправка в удаленный репозиторий должны сработать. Выдержки из здесь .

3 голосов
/ 24 декабря 2010

Хорошо. Мои 2 цента. Как насчет входа на сервер, перехода в каталог git и переименования ветки в пустом хранилище. Это не имеет всех проблем, связанных с повторной загрузкой той же ветки. Фактически, «клиенты» автоматически распознают измененное имя и изменяют свою удаленную ссылку. После этого (или до) вы также можете изменить локальное имя филиала.

1 голос
/ 08 декабря 2017

Это самый простой и «читаемый» способ, который я знаю:

'Переместить' локальную ветку, используя -m

git branch -m my_old_branch_name my_new_branch_name

Нажмите «перемещенную» ветку на пульт, установите «upstream», используя -u

git push origin -u my_new_branch_name

(настройка 'upstream' по существу 'соединяет' вашу локальную ветку с удаленным, так что такие вещи, как fetch, pull и push будут работать)

Удалить старую ветку с пульта

git push origin -D <old_name>

(ваша локальная ветвь уже исчезла, потому что вы "переместили" ее на первом шаге)

1 голос
/ 03 июля 2017

ОК , переименование филиала как локально , так и на пульт довольно прост! ...

Если вы на ветке, вы легко можете сделать:

git branch -m <branch>

или, если нет, вам нужно сделать:

git branch -m <your_old_branch> <your_new_branch>

Затем нажмите кнопку удаления на пульте, как показано ниже:

git push origin <your_old_branch>

Теперь вы сделали, если вы получаете ошибку восходящего потока при попытке протолкнуть, просто выполните:

git push --set-upstream origin <your_new_branch>

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...