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

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

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

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

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

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

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

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

1141
задан 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 для стратегии рекурсивного слияния.

1985
ответ дан 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.

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

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

git push [-f] origin seotweaks:master

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

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

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

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

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

На сервере, на котором размещен исходный репозиторий, введите следующее из каталога внутри репозитория:

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

Назад на сервер, на котором размещен исходный репозиторий:

git config receive.denyDeleteCurrent true

кредит автору этой страницы

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

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

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