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

1384

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

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

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

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

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

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

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

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

  • 34
    re: точный дубликат флага - это может быть правдой, но ответ ergosys ниже лучше, чем принятый ответ на этот вопрос, IMO
  • 22
    обратите внимание, что он может быть объявлен дубликатом, но это первое попадание в веб-поиске «git delete master master»
Показать ещё 3 комментария
Теги:
merge
git-branch

5 ответов

2195
Лучший ответ

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

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

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

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

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

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

  • 1
    Это также отмечает место, где вы слились визуально (gitk --all или git log --all --graph). Последующие слияния будут включать коммиты с этого момента.
  • 21
    Возможно, будет слишком поздно, чтобы добавить этот вопрос, но что не так с этим: git checkout master; git merge -s их seotweaks - сохраняет пару шагов.
Показать ещё 36 комментариев
366

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

  • 1
    Извините, когда я запускаю это, изменения происходят только локально. Как я могу получить это, чтобы повлиять на удаленные ветви? Спасибо
  • 33
    @Jason: попробуй git push -f origin master
Показать ещё 13 комментариев
58

Вы можете переименовать/удалить мастер на удаленном компьютере, но это будет проблемой, если многие люди основали свою работу на удаленном главном ветки и потянули эту ветвь в локальное репо.
Это может быть не так, потому что все, кажется, работают над веткой 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 их локальный мастер на удаленную/ведущую ветвь, которую они будут извлекать, и забыть об их текущем главном.
  • 0
    Спасибо за подробный ответ, когда я запускаю «git push remote: master», я получаю сообщение об ошибке - «remote» не выглядит как репозиторий git.
  • 0
    @Jason: я изменил это на 'origin', которое может быть именем по умолчанию, данным для вашего удаленного репо
Показать ещё 4 комментария
22

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

git push [-f] origin seotweaks:master

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

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

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

git push origin :master
  • 0
    Не работает на Heroku:! [отклонено] <new_branch> -> главная ошибка (не ускоренная перемотка вперед): не удалось отправить некоторые ссылки в <some_git> .git
  • 0
    git push -f origin seotweaks: мастер работал на меня
Показать ещё 1 комментарий
1

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

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

  • 0
    Для меня ветка master была веткой по умолчанию, поэтому я изменил ветку по умолчанию как ветку 'Develop', удалил ветку master и создал заново master из нужной ветки. Позже, если вы хотите, вы можете сделать ветку 'master' снова вашей веткой по умолчанию.
  • 0
    Ссылка не работает, «Доступ запрещен» .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню