Como as ramificações do Git funcionam? Posso remover a ramificação principal?


22

Eu tenho um projeto que tem 2 filiais, desenvolvimento e produção. Não estou usando a ramificação principal e cada vez que escrevo git status, diz-me a que distância minha ramificação está do mestre.

Quando tento excluir o ramo principal, git branch -d masterele o exclui apenas no meu repositório local e não no servidor git remoto. Alguma ideia?

Respostas:


34

No Git, uma ramificação é apenas uma lista ordenada de confirmações (aka: checkins). Algo que pode ser um pouco confuso para novos usuários é que as ramificações não precisam ter um nome (embora na maioria das circunstâncias você queira um); e não há nada de especial sobre um ramo específico (o masterramo é apenas o padrão criado para você quando você inicializa um repositório).

Você provavelmente já sabe disso, mas o Git é diferente de outros sistemas de controle de versão, como o popular "Subversion", porque cada "cópia de trabalho" (na linguagem do Subversion) é um repositório próprio ... na verdade, não há nada em particular especial sobre qualquer cópia em particular; exceto que uma cópia foi geralmente aceita como a "canônica" usada para armazenar o produto final.

Então, voltando à sua pergunta ... o repositório "canônico" que você clonou quando iniciou sua cópia local continha um ramo "mestre" por padrão; e está preso por aí. Agora, se você tiver acesso ao computador que contém o repositório principal, poderá efetuar login e executar:

git branch -d master

No entanto, se você não conseguir fazer isso, ainda poderá fazê-lo na sua máquina local. O git branchcomando possui uma -ropção que afeta o repositório remoto. Em outras palavras, a execução do seguinte comando deve funcionar:

git branch -d -r master

Observe que nos dois casos; Estou assumindo que masterfoi completamente mesclado ao histórico de desenvolvimento em que sua cópia local está atualmente. Se você nunca usou masterantes (ou seja: você só fez check-in no developmentou production), não precisa se preocupar com nada. No entanto, se você (ou outra pessoa) estiver realizando o check-in master, poderá ter um problema. Você pode forçar uma exclusão alterando o -dpara -Dnos comandos acima; mas eu recomendo verificar o que está de masterantemão! Se você não tiver acesso ao computador remoto, provavelmente não poderá recuperá-lo!


A propósito; se você (ou qualquer outra pessoa) for novo no Git, recomendo a leitura Git de baixo para cima, de John Wiegley . Mesmo que eu tivesse usado o Git um pouco por conta própria antes de encontrar este artigo, realmente não entendi como ele funcionou até a leitura. É bastante útil!


3
Algum tempo desde que escrevi meu comentário original, o comportamento do git mudou um pouco. A partir do git 1.7.12, git branch -d -r masternão exclui mais a ramificação remota - exclui o conhecimento da sua cópia local sobre a ramificação remota. Da próxima vez que você git fetch, o ramo voltará! Em vez disso, você desejará executar git push origin :master. Essencialmente, o que você está fazendo aqui é empurrar uma ramificação nula (o nome da ramificação vazia à esquerda da :) por cima da ramificação remota (o nome da ramificação à direita da :), excluindo-a efetivamente.
precisa saber é o seguinte

Observe também que, quando você clona um repositório, normalmente usa o check-out principal. Isso depende da referência HEAD no repositório que você está clonando. Portanto, depois que o mestre for excluído, verifique se o HEAD aponta para o ramo que você deseja como padrão.
Zitrax

Seu link para o Git de baixo para cima morreu, mas parece que este é o texto ao qual você está se referindo (?) Você pode confirmar e talvez atualizar o link na resposta?
OU Mapper

OU Mapper: Esse é o texto ao qual estou me referindo: obrigado pelo novo link! Atualizei o link na resposta.
precisa saber é o seguinte

4

masteré o ramo padrão do git. Não sei por que é tão terrível para você quando o git diz a que distância você está do mestre, mas se você deseja excluir uma ramificação do seu repositório remoto, excluí-la localmente não é suficiente. Tente isso:

git push origin :master

Isso não enviará nada (a parte antes dos dois pontos) para o servidor de origem e substituirá o mestre. Em outras palavras, ele deve excluir o ramo mestre remotamente.


Eu recebo: remote: error: recusando excluir a ramificação atual: refs / heads / master Para o github.com ***. Git! Erro mestre [remoto rejeitado] (exclusão da ramificação atual proibida): falha ao enviar algumas referências para ' github.com ***. git'
Totty.js

11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.