Как заменить главную ветку в Git, целиком, из другой ветки?

Возможный дубликат:
Сделать текущую ветвь Git главной ветвью

У меня есть два ветки в моем репозитории Git:

  1. master
  2. 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