Como replace o branch master no Git, inteiramente, de outro branch?

Duplicar Possível:
Tornar o atual branch Git um branch master

Eu tenho dois ramos no meu repository Git:

  1. master
  2. seotweaks (criado originalmente do master )

Eu criei seotweaks com a intenção de rapidamente seotweaks -lo de volta ao master . No entanto, isso foi há três meses e o código neste ramo é de 13 versões à frente do master .

Tornou-se efetivamente nosso ramo mestre funcional, já que todo o código em master é mais ou menos obsoleto agora.

Prática muito ruim eu sei, lição aprendida.

Você sabe como eu posso replace todo o conteúdo da ramificação master por aqueles que estão em seotweaks ?

Eu poderia simplesmente apagar tudo no master e mesclar, mas isso não parece ser uma boa prática.

Você deve ser capaz de usar a estratégia de mesclagem “nosso” para sobrescrever o master com seotweaks como este:

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

O resultado deve ser seu mestre agora é essencialmente seotweaks.

( -s ours é a abreviação de --strategy=ours )

Dos documentos sobre a estratégia ‘nossa’:

Isso resolve qualquer número de headers, mas a tree resultante da mesclagem é sempre a da cabeça de ramificação atual, efetivamente ignorando todas as alterações de todas as outras ramificações. Destina-se a ser usado para replace o antigo histórico de desenvolvimento dos ramos laterais. Observe que isso é diferente da opção -Xours para a estratégia de mesclagem recursiva.

Que tal usar git branch -m para renomear o branch master para outro, então renomear seotweaks branch para master? Algo assim:

 git branch -m master old-master git branch -m seotweaks master git push -f origin master 

Isso pode remover commits no master de origem , por favor cheque seu master de origem antes de executar o git push -f origin master .

Você pode renomear / remover mestre no remoto, mas isso será um problema se muitas pessoas basearem seu trabalho no ramo mestre remoto e tiverem extraído esse ramo em seu repository local.
Isso pode não ser o caso aqui, já que todo mundo parece estar trabalhando no ramo ‘ seotweaks ‘.

Nesse caso, você pode:
git remote –show pode não funcionar. (Faça um git remote show para verificar como seu controle remoto é declarado dentro de seu repository local. Vou assumir ‘ origin ‘)
(Com relação ao GitHub, house9 comenta: “Eu tive que fazer um passo adicional, clique no botão ‘ Admin ‘ no GitHub e configurei o ‘ Default Branch ‘ para algo diferente de ‘ master ‘, depois coloquei de volta depois”)

 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 

Mas novamente:

  • se outros usuários tentarem puxar enquanto o mestre for excluído no remoto, seus pulls falharão (“não existe referência no remoto”)
  • quando o mestre é recriado no remoto, um puxão tentará mesclar esse novo mestre em seu mestre local (agora antigo): muitos conflitos. Eles realmente precisam reset --hard seu mestre local para o ramo remoto / mestre que irão buscar, e esquecer seu mestre atual.

Como o seotweaks foi criado originalmente como um branch do master , mesclá-lo novamente é uma boa ideia. No entanto, se você estiver em uma situação em que um dos seus ramos não é realmente um ramo do master ou o seu histórico é tão diferente que você apenas quer destruir o ramo master em favor do novo ramo que você está fazendo o trabalho em você posso fazer isso:

 git push [-f] origin seotweaks:master 

Isso é especialmente útil se você está recebendo este erro:

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

E você não está usando o GitHub e não tem access à guia “Administração” para alterar a ramificação padrão do seu repository remoto. Além disso, isso não causará tempo de inatividade ou condições de corrida como você pode encontrar excluindo master:

 git push origin :master 

Eu encontrei esta para ser a melhor maneira de fazer isso (eu tive um problema com o meu servidor não me deixar excluir).

No servidor que hospeda o repository de origin , digite o seguinte em um diretório dentro do repository:

 git config receive.denyDeleteCurrent ignore 

Na sua estação de trabalho:

 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's 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 

De volta ao servidor que hospeda o repository de origin :

 git config receive.denyDeleteCurrent true 

Crédito ao autor do blog http://www.mslinn.com/blog/?p=772