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

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

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

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

Я создал seotweaks с намерением быстро seotweaks его обратно в master. Однако это было три месяца назад, а код в этой ветке - 13 версий впереди master.

Это фактически стало нашей рабочей ветвью мастера, так как теперь весь код в master более или менее устарел.

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

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

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

1319
задан Jason 19 мая '10 в 6:06
источник поделиться
5 ответов

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

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

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

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

Из документации о стратегии 'ours':

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

2310
ответ дан ergosys 19 мая '10 в 7:51
источник поделиться

Как насчет использования 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.

385
ответ дан ZelluX 19 мая '10 в 6:11
источник поделиться

Вы можете переименовать/удалить мастер на удаленном компьютере, но это будет проблемой, если многие люди основали свою работу на удаленном главном ветки и потянули эту ветвь в локальное репо.
Это может быть не так, потому что все, кажется, работают над веткой 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 их локальный мастер на удаленную/ведущую ветвь, которую они будут извлекать, и забыть об их текущем главном.
61
ответ дан VonC 19 мая '10 в 6:57
источник поделиться

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

git push [-f] origin seotweaks:master

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

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

И вы не используете GitHub и не имеете доступа к вкладке "Администрирование", чтобы изменить ветвь по умолчанию для удаленного репозитория. Кроме того, это не приведет к простоям или условиям гонки, которые могут возникнуть при удалении мастера:

git push origin :master
21
ответ дан mholm815 25 июля '12 в 23:44
источник поделиться

Я нашел, что это лучший способ сделать это (у меня была проблема с моим сервером, который не позволял мне удалять).

На сервере, на котором размещен 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

1
ответ дан ScottG 28 сент. '12 в 16:13
источник поделиться

Другие вопросы по меткам