Eu tenho um repositório no Git. Fiz uma ramificação, depois fiz algumas alterações no mestre e na ramificação.
Então, dezenas de confirmações depois, percebi que o ramo está em um estado muito melhor que o mestre, então quero que o ramo "se torne" o mestre e desconsidere as alterações no mestre.
Não posso mesclar, porque não quero manter as alterações no mestre. O que devo fazer?
Extra : Nesse caso, o mestre 'antigo' já foi push
enviado para outro repositório como o GitHub. Como isso muda as coisas?
Respostas:
O problema com as outras duas respostas é que o novo mestre não tem o antigo mestre como ancestral; portanto, quando você pressiona, todo mundo fica bagunçado. Isto é o que você quer fazer:
Se você quiser que seu histórico seja um pouco mais claro, recomendo adicionar algumas informações à mensagem de confirmação de mesclagem para deixar claro o que você fez. Mude a segunda linha para:
fonte
--strategy=ours
é diferente de--strategy=recursive -Xours
. Ou seja, o "nosso" pode ser uma estratégia em si (o resultado será o ramo atual, não importa o quê), ou passado como uma opção para a estratégia "recursiva" (traga as alterações de outros ramos e prefira automaticamente as alterações do ramo atual quando houver um conflito )git merge --strategy=ours master -m "new master"
para que funcionasse.git push
logo após isso, se quiser que seu código seja transferido para remoto. Você pode ver um aviso comoYour branch is ahead of 'origin/master' by 50 commits.
Isso é esperado. Apenas empurre! : DVerifique se tudo foi enviado ao seu repositório remoto (GitHub):
Substitua "master" por "better_branch":
Force o envio ao seu repositório remoto:
fonte
git reset --hard origin/master
próxima vez que quiserem puxar, caso contrário, o git tentará mesclar as mudanças em seu local (agora) divergente. Os perigos disso são explicados mais nesta respostaEdit: Você não disse que tinha empurrado para um repo público! Isso faz um mundo de diferença.
Existem duas maneiras, a maneira "suja" e a maneira "limpa". Suponha que seu ramo seja nomeado
new-master
. Esta é a maneira limpa:Isso fará com que os arquivos de configuração sejam alterados para corresponder aos ramos renomeados.
Você também pode fazê-lo da maneira suja, o que não atualizará os arquivos de configuração. É o que se passa sob o capô do que foi dito acima ...
fonte
git branch old-master master; git branch -f master new-master
. Crie a ramificação de backup atualizada e mova o mestre diretamente para o novo mestre. (E desculpe por erro ortográfico o seu nome, só notei isso)Renomeie a ramificação para
master
:fonte
git checkout master&&git reset --hard better_branch
?Pelo que entendi, você pode ramificar a ramificação atual em uma ramificação existente. Em essência, isso substituirá o
master
que você tiver no ramo atual:Depois de fazer isso, normalmente você pode enviar sua
master
filial local , possivelmente exigindo o parâmetro force aqui também:Sem mesclagens, sem comandos longos. Simplesmente
branch
epush
- mas, sim, isso vai reescrever a história domaster
ramo, por isso, se você trabalha em uma equipe que você tem que saber o que está fazendo.Como alternativa, descobri que você pode enviar qualquer ramo para qualquer ramo remoto, portanto:
fonte
Encontrei a resposta que queria na postagem do blog Substitua o ramo principal por outro ramo no git :
É essencialmente o mesmo que a resposta de Cascabel . Exceto que a "opção" que ele adicionou abaixo de sua solução já está incorporada no meu bloco de código principal.
É mais fácil encontrar esse caminho.
Estou adicionando isso como uma nova resposta, porque se precisar dessa solução mais tarde, quero ter todo o código que vou usar em um bloco de código.
Caso contrário, posso copiar e colar e ler os detalhes abaixo para ver a linha que eu deveria ter alterado - depois de executá-la.
fonte
As soluções fornecidas aqui (renomeando a ramificação em 'master') não insistem nas consequências para o repositório remoto (GitHub):
Se outras pessoas já realizaram seu repo, elas não poderão obter esse novo histórico mestre sem substituir o próprio mestre por esse novo ramo mestre do GitHub (ou lidar com muitas mesclagens).
Existem alternativas para uma força de empurrar git para repositórios públicos .
A resposta de Jefromi (mesclando as alterações certas de volta ao mestre original) é uma delas.
fonte
Encontrei esse método simples para funcionar da melhor maneira. Ele não reescreve o histórico e todos os check-ins anteriores da ramificação serão anexados ao mestre. Nada está perdido, e você pode ver claramente o que ocorreu no log de confirmação.
Objetivo: Tornar o estado atual da "ramificação" o "mestre"
Trabalhando em uma ramificação, confirme e envie suas alterações para garantir que seus repositórios locais e remotos estejam atualizados:
Depois disso, seu mestre será o estado exato do seu último commit da filial e seu log de confirmação principal mostrará todos os check-ins da filial.
fonte
Também é possível fazer o checkout de todos os arquivos da outra ramificação no master:
e depois confirme todas as alterações.
fonte
Para adicionar à resposta de Jefromi, se você não deseja colocar uma mesclagem sem sentido no histórico da
source
ramificação, é possível criar uma ramificação temporária para aours
mesclagem e jogá-la fora:Dessa forma, a consolidação de mesclagem só existirá no histórico da
target
ramificação.Como alternativa, se você não deseja criar uma mesclagem, basta pegar o conteúdo
source
e usá-lo para um novo commit emtarget
:fonte
Para mim, eu queria que meu demônio estivesse de volta ao mestre depois que estivesse à frente.
Enquanto estiver desenvolvendo:
fonte
Minha maneira de fazer as coisas é a seguinte
fonte
Se você estiver usando o eGit no Eclipse :
fonte
As etapas a seguir são executadas no navegador Git, desenvolvido pela Atlassian (servidor Bitbucket)
Fazendo {ramo atual} como
master
master
e nomeie-a como duplicada principal.fonte