Вопрос: Как заменить главную ветку в git, целиком, из другой ветки? [Дубликат]


Возможный дубликат:
Измените текущую ветвь на master в git

У меня есть два филиала в моем git-репо:

  1. мастер
  2. seotweaks (созданный первоначально от мастера)

я создал seotweaksс намерением быстро слить его обратно в master, однако это было 3 месяца назад, а код в этой ветке - 13 версий впереди master, он фактически стал нашей рабочей ветвью мастера, поскольку весь код в masterсейчас более или менее устарела.

Очень плохая практика, которую я знаю, извлеченный урок.

Знаете ли вы, как я могу заменить все содержимое masterветви с seotweaks?

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


1266


источник


Ответы:


Вы должны использовать стратегию слияния «наш», чтобы перезаписать мастера с помощью seotweaks следующим образом:

git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks

Результат должен быть вашим хозяином в настоящее время, по сути, seotweaks.

( -s oursсокращается для --strategy=ours)

Из документы о стратегии «наших»:

Это разрешает любое количество головок, но результирующее дерево слияния всегда относится к текущему ветви ветви, фактически игнорируя все изменения из всех других ветвей. Он предназначен для замены старой истории развития боковых ветвей. Обратите внимание, что это отличается от опции -Xours до стратегии рекурсивного слияния.


2199



Как насчет использования git branch -m для переименования ведущей ветки в другую, а затем переименовать ветку seotweaks в master? Что-то вроде этого:

git branch -m master old-master
git branch -m seotweaks master
git push -f origin master

Это может удалить фиксацию в исходном хозяине , перед запуском проверьте исходный мастер git push -f origin master,


367



Вы можете переименовать / удалить мастер на удаленном компьютере, но это будет проблемой, если многие люди основали свою работу на удаленном главном ветви и потянули эту ветвь в локальное репо.
Это может быть не так, потому что все, кажется, работают над отраслью, seotweaks».

В этом случае вы можете:
git remote --show может не работать. (Делать git remote showчтобы проверить, как ваш пульт объявлен в вашем локальном репо. Я буду считать, origin«)
(Что касается GitHub, house9 комментарии: «Я должен был сделать еще один шаг, Admin'на GitHub и установите' Default Branch'к чему-то другому, кроме' master', затем верните его назад ")

git branch -m master master-old  # rename master on local
git push origin :master          # delete master on remote
git push origin master-old       # create master-old on remote
git checkout -b master seotweaks # create a new local master on top of seotweaks
git push origin master           # create master on remote

Но опять же:

  • если другие пользователи попытаются вытащить, когда мастер удален на удаленном компьютере, их выходы не удастся («нет такой ссылки на пульте дистанционного управления»)
  • когда мастер воссоздается на удаленном компьютере, притяжение будет пытаться объединить этот новый мастер с их локальным (теперь старым) мастером: много конфликтов. Им на самом деле нужно reset --hardих местный мастер на удаленную / ведущую ветвь, которую они извлекут, и забудут об их нынешнем хозяине.

60



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

git push [-f] origin seotweaks:master

это особенно полезно, если вы получаете эту ошибку

! [remote rejected] master (deletion of the current branch prohibited)

и вы не используете github и не имеете доступа к вкладке «Администрирование», чтобы изменить ветвь по умолчанию для удаленного репо. кроме того, это не приведет к нарушению времени или условиям гонки, поскольку вы можете столкнуться с удалением мастера:

git push origin :master

20



I found this to be the best way of doing this (i had an issue with my server not letting me delete)

On the server that hosts the origin repository, type the following from a directory inside the repository:

git config receive.denyDeleteCurrent ignore

On your workstation:

git branch -m master vabandoned                 # rename master on local
git branch -m newBranch master                  # locally rename branch newBranch to master
git push origin :master                         # delete the remote's master
git push origin master:refs/heads/master        # push the new master to the remote
git push origin abandoned:refs/heads/abandoned  # push the old master to the remote

Back on the server that hosts the origin repository:

git config receive.denyDeleteCurrent true

credit to the author of this page

http://www.mslinn.com/blog/?p=772


1