Como renomear um nome de filial local e remota do Git?

457

Eu tenho quatro ramos como mestre -> origem / regacy, FeatureA -> origem / FeatureA. Como você pode ver, digitei o nome errado.

Então, eu quero renomear um nome de filial remota (origem / regacy → origem / legado ou origem / mestre)

Eu tento o comando abaixo:

git remote rename regacy legacy

Mas o console do Git retornou uma mensagem de erro para mim.

 error : Could not rename config section 'remote.regacy' to 'remote.legacy'

Como posso resolver este problema?

JayD
fonte

Respostas:

808

Digite a descrição da imagem aqui


Existem algumas maneiras de conseguir isso:

  1. Altere sua filial local e depois faça as alterações
  2. Empurre a ramificação para o controle remoto com o novo nome, mantendo o nome original localmente

Renomeando local e remoto

# Rename the local branch to the new name
git branch -m <old_name> <new_name>

# Delete the old branch on remote - where <remote> is, for example, origin
git push <remote> --delete <old_name>

# Or shorter way to delete remote branch [:]
git push <remote> :<old_name>

# Push the new branch to remote
git push <remote> <new_name>

# Reset the upstream branch for the new_name local branch
git push <remote> -u <new_name>

Digite a descrição da imagem aqui


Renomeando apenas ramificação remota

Crédito: ptim

# In this option, we will push the branch to the remote with the new name
# While keeping the local name as is
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

Nota importante:

Quando você usa o git branch -m(mover), o Git também está atualizando seu ramo de rastreamento com o novo nome.

git remote rename legacy legacy

git remote renameestá tentando atualizar sua seção remota no seu arquivo de configuração. Ele renomeará o controle remoto com o nome dado para o novo nome, mas, no seu caso, não encontrou nenhum, portanto, a renomeação falhou.

Mas não fará o que você pensa; ele renomeará o nome remoto da configuração local e não a ramificação remota. 


Nota Os servidores Git podem permitir que você renomeie as ramificações do Git usando a interface da Web ou programas externos (como Sourcetree, etc.), mas você deve ter em mente que no Git todo o trabalho é feito localmente, por isso é recomendável usar os comandos acima Para o trabalho.

CodeWizard
fonte
Você ainda precisa fazer alguma coisa, após o exposto acima e quando tento puxar, recebo a mensagem:Your configuration specifies to merge with the ref ''refs/heads/old_name'
Krzysztof Krasoń
6
Não se esqueça de desabilitar o antigo upstream:git checkout <new_name> ; git branch --unset-upstream
Miguel Ping
2
O comentário de @ MiguelPing é importante. Ao tentar renomear um ramo, eu já empurrei para o github, excluindo, renomeando local, e pressionando novamente os resultados, com o nome antigo sendo usado novamente. Se eu --unset-upstreamantes de re-empurrar, ele funciona como pretendido.
Adam Tuttle
1
Existe uma maneira de evitar o fechamento automático dos PRs abertos na ramificação de nome antigo no controle remoto? Enfrentou isso no gitlab, onde o PR no nome do ramo antigo foi fechado após o envio para a origem.
Himanshu Tanwar em 29/04
142

Se você nomeou um ramo incorretamente E o enviou para o repositório remoto, siga estas etapas para renomear esse ramo (com base neste artigo ):

  1. Renomeie sua filial local:

    • Se você estiver no ramo que deseja renomear:
      git branch -m new-name

    • Se você estiver em um ramo diferente:
      git branch -m old-name new-name

  2. Exclua a old-namefilial remota e empurre a new-namefilial local :
    git push origin :old-name new-name

  3. Redefina a ramificação upstream da ramificação local com novo nome :
    Alterne para a ramificação e, em seguida:
    git push origin -u new-name

ZILONG PAN
fonte
1
Após os 2 primeiros passos, se você receber uma mensagem de erro sobre os atuais pontos de ramificação para um ramo não-existência no repo remoto, a 3ª correções passo este
Kevin Hooke
1
@ Dr1Ku Precisa saber a diferença entre git push <remote> --delete old_name& git push origin :old-name new-namepara excluir uma ramificação.
Ashutosh Chamoli
Usuários de BitBucket: corrija o erro na Etapa 2 ao renomear master, em Detalhes do Repo, defina a ramificação padrão como nova ramificação. O erro é:By default, deleting the current branch is denied, because the next 'git clone' won't result in any file checked out, causing confusion. You can set 'receive.denyDeleteCurrent' configuration variable to 'warn' or 'ignore' in the remote repository to allow deleting the current branch, with or without a warning message. To squelch this message, you can set it to 'refuse'. error: refusing to delete the current branch: refs/heads/master
Colin
mais fácil entre outros
Abdulla Nilam
37

Parece que existe um caminho direto:

Se você realmente deseja renomear ramificações remotamente (sem renomear ramificações locais ao mesmo tempo), você pode fazer isso com um único comando como

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

Renomeando ramificações remotamente no Git

Veja a resposta original para mais detalhes.

ptim
fonte
1
Não funcionou no git 2.20.1Excluiu o ramo antigo, mas o novo não foi criado.
Paul Razvan Berg
26

Também pode ser feito da seguinte maneira.

Primeiro, renomeie a ramificação local, depois a ramificação remota.

Renomeando a filial local:

Se conectado a outra filial,

git branch -m old_branch new_branch 

Se conectado na mesma filial,

git branch -m new_branch

Renomeando filial remota:

git push origin :old_branch    // Delete the remote branch

git push --set-upstream origin new_branch   // Create a new remote branch
Atequer Rahman
fonte
5

Se você já enviou o nome errado para remoto, faça o seguinte:

  1. Alterne para o ramo local que você deseja renomear

    git checkout <old_name>

  2. Renomeie a filial local

    git branch -m <new_name>

  3. Empurre a <new_name>ramificação local e redefina a ramificação upstream

    git push origin -u <new_name>

  4. Excluir a <old_name>ramificação remota

    git push origin --delete <old_name>

Isso foi baseado neste artigo .

milesmeow
fonte
4

Anexando um snippet simples para renomear sua filial atual (local e na origem):

git branch -m <oldBranchName> <newBranchName>
git push origin :<oldBranchName>
git push --set-upstream origin <newBranchName>

Explicação dos documentos do git:

A opção git branch -m ou -M será renomeada para. Se tiver um reflog correspondente, ele será renomeado para corresponder e uma entrada de reflog será criada para lembrar a renomeação da ramificação. Se existir, -M deve ser usado para forçar a renomeação.

O refspec especial: (ou +: para permitir atualizações sem avanço rápido) instrui o Git a enviar ramificações "correspondentes": para cada ramificação que existe no lado local, o lado remoto é atualizado se já existir uma ramificação com o mesmo nome no lado remoto.

--set-upstream Configure as informações de rastreamento para que sejam consideradas a filial upstream. Se não for especificado, o padrão será o ramo atual.

avivamg
fonte
3

Não há método direto,

  1. Renomear filial local ,

    Minha filial atual é master

    git branch -m master_renamed #master_renamed é o novo nome do mestre

  2. Excluir filial remota,

    git push origin --delete master #origin é remote_name

  3. Enviar ramificação renomeada para remoto,

    git push origin master_renamed

É isso aí...

Mohideen bin Mohammed
fonte
Agradável e simples e apenas 3 etapas. Apenas melhoria que posso sugerir é git push -u origin master_renamedpara definir o ramo como um ramo de rastreamento
ut9081
2

Isso pode ser feito mesmo sem renomear a filial local em três etapas simples:

  1. Vá para o seu repositório no GitHub
  2. Crie um novo ramo a partir do ramo antigo que você deseja renomear
  3. Excluir o ramo antigo
Code_Mode
fonte
0

Eu uso esses alias do git e praticamente faz o trabalho automático:

git config --global alias.move '!git checkout master; git branch -m $1 $2; git status; git push --delete origin $1; git status; git push -u origin $2; git branch -a; exit;'

Uso: git move FROM_BRANCH TO_BRANCH

Funciona se você tiver os nomes padrão, como mestre, origem etc. Você pode modificar como desejar, mas isso lhe dará a ideia.

Tarik
fonte
0

Eu tive que fazer a seguinte tarefa para renomear filial local e remota:

# Rename the local branch to the new name
git branch -m <old_name> <new_name>

#  Delete the old remote branch
git push origin --delete <old_name>

# push to new remote branch - creates new remote branch
git push origin <new_name>

# set new remote branch as default remote branch for local branch
git branch --set-upstream-to=origin/<new_name> <new_name>
Sebastian Viereck
fonte
Como é diferente da resposta existente?
Himanshu Tanwar em 29/04
0
  1. Renomeie sua filial local. Se você estiver no ramo que deseja renomear:

    git branch -m new-name

Se você estiver em um ramo diferente:

git branch -m old-name new-name
  1. Exclua a ramificação remota com nome antigo e pressione a ramificação local com novo nome.

    origem do git push: nome antigo nome novo

  2. Redefina a ramificação upstream para a ramificação local com novo nome. Mude para o ramo e, em seguida:

    origem do push do git -u new-name

Tudo pronto!

Anupam Maurya
fonte
0
  • Renomeie sua filial local .

Se você estiver no ramo que deseja renomear:

git branch -m new-name

se você permanecer em uma filial diferente no momento atual:

git branch -m old-name new-name
  • Exclua a ramificação remota com nome antigo e pressione a ramificação local com novo nome.

Permaneça no ramo de destino e:

git push origin :old-name new-name
  • Redefina a ramificação upstream para a ramificação local com novo nome.

Alterne para o ramo de destino e, em seguida:

git push origin -u new-name
Vitaliy Andrusishyn
fonte