Trocar nomes de branch no git

103

Pode haver mais de uma maneira de fazer essa pergunta, então aqui está uma descrição do problema. Eu estava trabalhando no master e comprometi algumas coisas e então decidi que queria colocar esse trabalho em espera. Fiz backup de alguns commits e depois ramifiquei antes de começar meu trabalho de merda. Praticamente isso funciona bem, só agora tenho um branch diferente como meu principal branch de desenvolvimento. Estou me perguntando como eu poderia mudar as coisas, então estou trabalhando no master novamente, mas não tem meu trabalho inútil e disse que o trabalho está em um branch diferente.

Algumas maneiras de questionar / resolver isso: Como faço para renomear meu branch master para outra coisa e, em seguida, renomear outra coisa para master? Como faço backup do master e depois faço com que todos os commits dos quais fiz backup estejam em um branch diferente?

Obrigado por todas as respostas (rápidas)! Eles são todos bons.

Daniel Benamy
fonte

Respostas:

144

Além dos outros comentários, você pode achar útil a opção -m (mover) para git-branch. Você pode renomear seu antigo mestre para outra coisa e, em seguida, renomear seu novo branch para mestre:

git branch -m master crap_work
git branch -m previous_master master
Greg Hewgill
fonte
Dependendo do seu fluxo de trabalho, você também pode querer alterar quaisquer referências de branch em .git / config. Eu mudei [branch "crap_work"]para ler [branch "master"]para que o mestre ainda sincronizasse origin/master. Claro, o estado dos dois repositórios era tal que ainda fazia sentido.
Homônimo de
3
Isso não renomeia branches no repo remoto, apenas no repo local.
smohadjer
1
@smohadjer Para renomear os controles remotos, você faria git push -uf origin mastere git push -u origin crap_work.
zyy
31

Acho que você deve considerar uma estratégia de desenvolvimento diferente para evitar problemas como esse. Um que parece funcionar melhor para mim é nunca fazer o desenvolvimento diretamente no meu branch master. Independentemente das mudanças que estou fazendo, sempre crio um novo branch para o novo código:

git checkout -b topic / topic_name master

A partir daí, posso enviar as alterações para repositórios públicos:

git push pu topic / topic_name

ou, eventualmente, apenas mesclá-lo de volta com meu branch master:

git checkout master && git merge topic / topic_name

Se você realmente precisa voltar a um ponto mais antigo no tempo e defini-lo como mestre, pode renomear o branch atual para outra coisa e, em seguida, verificar uma versão mais antiga para ser seu mestre:

 git branch -m master junk
 git co -b master old_sha1_value
Brian Riehman
fonte
Essa é uma boa política. E pensando bem, eu vi isso praticado em outros lugares. Obrigado.
Rimian
14

Comece master, crie um branch chamado in-progress, então redefina masterpara um commit anterior.

$ git branch in-progress
$ git reset --hard HEAD^
Ted Percival
fonte
1
Não vejo razão para que isso tenha sido rejeitado. Eu mesmo fiz isso algumas vezes, antes de aprender sobre o branch -m e perceber que master não estava imutavelmente ligado como o nome permanente de um branch.
skiphoppy
7

Isso é relativamente fácil:

git checkout -b fake_master master # fake_master now points to the same commit as master
git branch -D master               # get rid of incorrect master
git checkout -b master real_master # master now points to your actual master
git checkout master                # optional -- switch on to your master branch
olliej
fonte
1
Sim, o último é totalmente opcional - git checkout -bcria um branch e o torna ativo.
BorisOkunskiy
0

Isso definirá seu mestre para qualquer ponto em uma etapa:

git checkout -B master new_point
Penghe Geng
fonte