Eu tenho o ramo master
que rastreia o ramo remoto origin/master
.
Eu quero renomeá-los para master-old
localmente e no controle remoto. Isso é possível?
Para outros usuários que rastrearam origin/master
(e que sempre atualizavam sua master
filial local via git pull
), o que aconteceria depois que eu renomeasse a filial remota?
Eles git pull
ainda funcionariam ou gerariam um erro que não conseguiam origin/master
mais encontrar ?
Depois, quero criar uma nova master
ramificação (local e remota). Novamente, depois que eu fiz isso, o que aconteceria agora se os outros usuários fizessem git pull
?
Eu acho que tudo isso resultaria em muitos problemas. Existe uma maneira limpa de conseguir o que quero? Ou devo apenas deixar master
como está e criar um novo ramo master-new
e apenas trabalhar mais lá?
fonte
git push -f
afeta a capacidade depull
partir de qualquer ramo de rastreamento remoto.master-old
que aponte para o mesmo commit que omaster
ramo anterior . Em seguida, você pode sobrescrever amaster
ramificação com suas novas alterações, fazendo ummerge
com aours
estratégia. Fazer uma mesclagem funciona quando o controle remoto não permite alterações não avançadas. Isso também significa que outros usuários não terão atualizações forçadas.master
é especial apenas desde que seja o único ramo existente. Assim que você tiver mais de um, todos os ramos estarão em pé de igualdade.Respostas:
O mais próximo a renomear é excluir e depois recriar no controle remoto. Por exemplo:
No entanto, isso tem muitas advertências. Primeiro, nenhum checkout existente saberá sobre a renomeação - o git não tenta rastrear as renomeações de ramificações. Se o novo
master
ainda não existir, o git pull apresentará um erro. Se o novomaster
foi criado. a atração tentará mesclarmaster
emaster-old
. Portanto, geralmente é uma má idéia, a menos que você tenha a cooperação de todos que fizeram check-out no repositório anteriormente.Nota: As versões mais recentes do git não permitem excluir a ramificação principal remotamente por padrão. Você pode substituir isso definindo o
receive.denyDeleteCurrent
valor de configuração parawarn
ouignore
no repositório remoto . Caso contrário, se você estiver pronto para criar um novo mestre imediatamente, pule agit push remote :master
etapa e passe--force
para agit push remote master
etapa. Observe que, se você não conseguir alterar a configuração do controle remoto, não poderá excluir completamente o ramo mestre!Esta ressalva se aplica apenas ao ramo atual (geralmente o
master
ramo); qualquer outro ramo pode ser excluído e recriado como acima.fonte
new-branch-name
e, emold-branch-name
vez demaster
/master-old
, portanto, esse é um problema geral.Supondo que você esteja atualmente
master
:master-old
ramificação noorigin
repositório, com base namaster
confirmação no repositório local.origin/master-old
ramificação (que será automaticamente configurada corretamente como uma ramificação de rastreamento).master
para o que você deseja confirmar.master
noorigin
repositório para refletir seu novo localmaster
.(Se você fizer isso de qualquer outra maneira, precisará de pelo menos mais uma etapa para garantir que
master-old
esteja configurado corretamente para acompanharorigin/master-old
. Nenhuma das outras soluções postadas no momento da redação deste artigo inclui isso.)fonte
master
ou outro ramo. A questão foi mal intitulada, porém, pergunta sobre uma tarefa mais complexa do que apenas renomear um ramo.master
, eles poderiam apenas fazergit fetch && git reset --hard origin/master
para forçar o localmaster
a ser o mesmo que o localorigin
. Eu documentei isso, bem como o caso mais complexo em que você tem confirmações locais além dasmaster
que deseja manter, em stackoverflow.com/q/4084868Com o Git v1.7, acho que isso mudou um pouco. Atualizar a referência de rastreamento da sua filial local para o novo controle remoto agora é muito fácil.
fonte
--set-upstream
é a seguinte: Depois de ter seu ramo renomeado localmente e apagados na origem, basta fazer:git push -u --all
new_branch
e, eventualmente, excluir o controle remotomaster
com a 2ª linha.git push origin --delete old_branch
é um pouco mais legível.Pode ser necessário alternar manualmente para
new-branch-name
antes de excluirold-branch-name
fonte
git branch -d old-branch-name
para excluir o ramo antigo local.git push remote-name new-branch-name :old-branch-name
.Existem várias maneiras de renomear a filial, mas vou focar no problema maior: "como permitir que os clientes avancem rapidamente e não precisem mexer com suas ramificações localmente" .
Primeiro, uma imagem rápida:
Isso é algo realmente fácil de fazer; mas não abuse. A idéia toda depende de consolidação de mesclagem; pois eles permitem o avanço rápido e vinculam os históricos de um ramo a outro.
renomeando a ramificação:
criando o novo ramo "mestre":
criando uma consolidação de mesclagem para ter um histórico pai-filho:
e voila.
Isso funciona porque a criação de uma
merge
confirmação permite o avanço rápido da ramificação para uma nova revisão.usando uma mensagem de confirmação de mesclagem sensata:
fonte
git merge -s ours master-old
é a peça crucial que as outras respostas perdem. Além disso, "fácil de fazer" não significa "fácil de entender ou descobrir", que parece ser o caso de grande parte do git, mas discordo.Suponho que você ainda esteja perguntando sobre a mesma situação da sua pergunta anterior . Ou seja, master-new não conterá master-old em sua história. * Se você chamar master-new "master", efetivamente terá reescrito o histórico. Não importa como você entra em um estado em que o mestre não é descendente de uma posição anterior do mestre, simplesmente que ele está nesse estado.
Outros usuários que tentarem puxar enquanto o mestre não existir, simplesmente terão seus puxões falhados (não há ref no controle remoto) e, uma vez que ele exista novamente em um novo local, os puxadores precisarão tentar mesclar seu mestre com o novo mestre remoto, como se você mesclasse master-old e master-new em seu repositório. Dado o que você está tentando fazer aqui, a mesclagem teria conflitos. (Se eles foram resolvidos e o resultado foi empurrado de volta para o repositório, você estaria em um estado ainda pior - as duas versões do histórico lá.)
Para responder sua pergunta com simplicidade: você deve aceitar que, às vezes, haverá erros em sua história. Esta certo. Isso acontece com todo mundo. Existem confirmações revertidas no repositório git.git. O importante é que, depois que publicamos a história, é algo em que todos podem confiar.
* Se isso acontecesse, isso seria equivalente a fazer algumas alterações no mestre e criar uma nova ramificação onde costumava estar. Sem problemas.
fonte
A resposta selecionada falhou quando tentei. Ele lança um erro:
refusing to delete the current branch: refs/heads/master
. Acho que vou postar o que funciona para mim:O truque é fazer checkout no espaço reservado logo antes de enviá-lo para o repositório remoto. O restante é auto-explicativo, excluir a ramificação principal e enviá-la ao repositório remoto deve funcionar agora. Extraído daqui .
fonte
Boa. Meus 2 centavos. Que tal fazer logon no servidor, acessar o diretório git e renomear a filial no repositório vazio. Isso não tem todos os problemas associados ao re-upload da mesma ramificação. Na verdade, os 'clientes' reconhecerão automaticamente o nome modificado e mudarão sua referência remota. Depois (ou antes), você também pode modificar o nome local da filial.
fonte
A respeito:
fonte
Esta é a maneira mais simples e mais 'legível' que eu conheço:
'Mover' ramificação local usando -m
Empurre o ramo 'movido' para o controle remoto, defina 'upstream' usando -u
(configurar 'upstream' essencialmente 'conecta' sua filial local ao controle remoto, para que coisas como buscar, puxar e empurrar funcionem)
Exclua a ramificação antiga do controle remoto
(sua filial local já se foi, porque você a moveu na 1ª etapa)
fonte
OK , renomear uma filial localmente e no controle remoto é bastante fácil! ...
Se você estiver no ramo, poderá fazer facilmente:
git branch -m <branch>
ou, se não, você precisa fazer:
git branch -m <your_old_branch> <your_new_branch>
Em seguida, empurre a exclusão para o controle remoto assim:
git push origin <your_old_branch>
Agora você terminou, se você receber um erro de upstream enquanto tenta enviar, basta:
git push --set-upstream origin <your_new_branch>
Também crio a imagem abaixo para mostrar as etapas na linha de comando real, basta seguir as etapas e você seria bom:
fonte
Você pode fazer o seguinte:
Mas forçar é uma má idéia se outras pessoas estiverem compartilhando este repositório. O envio forçado fará com que o histórico de revisões entre em conflito com o novo.
fonte
O seguinte pode ser salvo no script de shell para executar o trabalho:
Por exemplo:
Observe que aqui o nome remoto padrão "origem" é codificado, você pode estender o script para torná-lo configurável!
Em seguida, esse script pode ser usado com aliases de bash, aliases de git ou, por exemplo, em ações customizadas de código fonte.
fonte
Acredito que a chave é a percepção de que você está realizando um duplo renomear:
master
paramaster-old
e tambémmaster-new
paramaster
.De todas as outras respostas, eu sintetizei isso:
onde primeiro precisamos definir a
doublerename
função Bash:Isso é semelhante a uma mudança
git rebase
no histórico em que o conteúdo da filial é bem diferente, mas difere no fato de os clientes ainda poderem avançar com segurançagit pull master
.fonte
fonte