Как заменить главную ветку в Git, целиком, из другой ветки?
Возможный дубликат:
Сделать текущую ветвь Git главной ветвью
У меня есть два ветки в моем репозитории Git:
-
master
-
seotweaks
(созданный первоначально от master
)
Я создал seotweaks
с намерением быстро seotweaks
его обратно в master
. Однако это было три месяца назад, а код в этой ветке - 13 версий впереди master
.
Это фактически стало нашей рабочей ветвью мастера, так как теперь весь код в master
более или менее устарел.
Очень плохая практика, которую я знаю, извлеченный урок.
Знаете ли вы, как я могу заменить все содержимое master
ветки на те, что есть в seotweaks
?
Я мог бы просто удалить все в master
и объединить, но это не похоже на лучшую практику.
Ответы
Ответ 1
Вы должны быть в состоянии использовать "нашу" стратегию слияния, чтобы перезаписать мастер с помощью таких слабых мест:
git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks
Результатом должен стать ваш хозяин, теперь по сути это слабые стороны.
(-s ours
- сокращение от --strategy=ours
)
Из документов о "нашей" стратегии:
Это разрешает любое количество заголовков, но результирующее дерево слияния всегда является деревом текущего заголовка ветки, эффективно игнорируя все изменения из всех других ветвей. Он предназначен для замены старой истории развития боковых веток. Обратите внимание, что это отличается от опции -Xours для стратегии рекурсивного слияния.
Обновление по комментариям: Если вы получили смертельный исход: refusing to merge unrelated histories
, то измените вторую строку на эту:
Ответ 2
Как насчет использования 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
.
Ответ 3
Вы можете переименовать/удалить мастер на удаленном компьютере, но это будет проблемой, если многие люди основали свою работу на удаленном главном ветки и потянули эту ветвь в локальное репо.
Это может быть не так, потому что все, кажется, работают над веткой 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
их локальный мастер на удаленную/ведущую ветвь, которую они будут извлекать, и забыть об их текущем главном.
Ответ 4
Поскольку seotweaks
был первоначально создан как ветка от master
, слияние его обратно в это хорошая идея. Однако, если вы находитесь в ситуации, когда один из ваших веток в действительности не является ответвление от master
или ваша история настолько отличается, что вы просто хотите, чтобы уничтожить master
ветвь в пользу новой отрасли, что вы делали работу на вас может сделать это:
git push [-f] origin seotweaks:master
Это особенно полезно, если вы получаете эту ошибку:
! [remote rejected] master (deletion of the current branch prohibited)
И вы не используете GitHub и не имеете доступа к вкладке "Администрирование", чтобы изменить ветвь по умолчанию для удаленного репозитория. Кроме того, это не приведет к простоям или условиям гонки, которые могут возникнуть при удалении мастера:
git push origin :master
Ответ 5
Я нашел, что это лучший способ сделать это (у меня была проблема с моим сервером, который не позволял мне удалять).
На сервере, на котором размещен origin
репозиторий, введите следующее из каталога внутри репозитория:
git config receive.denyDeleteCurrent ignore
На рабочей станции:
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 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
Назад на сервере, на котором размещен origin
репозиторий:
git config receive.denyDeleteCurrent true
Кредит автору блога http://www.mslinn.com/blog/?p=772