Por que posso fazer o checkout de uma ramificação que foi removida no GitHub?

24

Em nosso repositório do GitHub, um colega de trabalho removeu uma ramificação chamada release . Mas quando executo git checkout release localmente, sempre recebo a ramificação removida release . Mesmo quando fiz o check out de outra ramificação, excluí a ramificação release com git branch -D release e executei novamente git checkout release .

Há algo para corrigir no repositório do GitHub, ou devo consertar algo localmente?

    
por Tim 18.05.2017 / 16:29

4 respostas

23

Após excluir uma ramificação no lado remoto, você ainda poderá ver essa ramificação remota anteriormente obtida localmente, consulte:

$ git branch -a
[...]
release
remotes/origin/release
[...]

Você removeu apenas o "release", mas não o "remotes / origin / release". Exclua assim:

$ git branch -rd origin/release

Ou remova as ramificações buscadas all que não existem mais no lado remoto:

$ git remote prune origin 
    
por 18.05.2017 / 16:48
15

Quando as ramificações são excluídas remotamente, você precisa remover seu repositório local - a maneira mais fácil de fazer isso é com

git fetch -p

Isso atualizará seu repositório local com todas as alterações feitas no repositório remoto, mas sem atualizar nenhuma das suas ramificações locais. Depois de executar isso,

git branch --remote

não mostrará mais o ramo remoto excluído.

Os repositórios git estão completos, seja no seu próprio sistema ou no servidor. Então, quando você clonar um repositório pela primeira vez, você obtém uma cópia completa, e o seu git local “sabe” sobre todas as ramificações remotas, bem como suas ramificações locais. Essas informações não são sincronizadas automaticamente. Por isso, quando seu colega excluiu a ramificação release no servidor, seu repositório git local não perdeu a noção de uma ramificação release remota. A sincronização com git fetch atualiza todas as informações locais em ramificações remotas para que elas correspondam ao estado no servidor (estritamente falando, repositório remoto, onde quer que seja), mas sem excluir nenhuma informação local em ramificações remotas. A remoção com git fetch -p (ou git fetch --prune ou git remote prune ) remove as informações locais em ramificações remotas que foram excluídas.

    
por 18.05.2017 / 17:26
3

Tim: Git é distribuído VCS, então quando você clona um repo do remoto para o seu local, clona tudo (histórico). Então, quando você clonou seu repo, ele tinha um branch chamado release. Como seu colega excluiu a ramificação de lançamentos remotamente, até que você faça um git fetch -p de limpeza ou exclua explicitamente esse ramo, seu local terá esse ramo.

    
por 18.05.2017 / 18:49
1

Talvez um pouco tangencial, mas a perspectiva desse site pode ajudar a entender o tópico geral de exclusão de ramificações:

link

Há sobreposição com algo do que já foi discutido aqui, mas o foco está no serviço de limpeza: excluindo filiais, remotas e locais, que não são mais necessárias em um ambiente colaborativo. Em particular, o comando git branch --merged identifica as ramificações que são seguras para excluir devido a serem mescladas à sua linha principal (ou o ramo que lhe interessa). Se você estiver colaborando, alguns mini scripts mais extravagantes como esse apresentarão as coisas em um formato agradável e fácil de digerir, com datas e autores.

for branch in 'comm -12  <(git branch --merged|awk '{print($1)}') <(git branch -r --merged|awk '{print($1)}'|awk -F \/ '{print($2)}')'; do echo -e 'git show --format="%ci %cr %an" $branch | head -n 1' \t$branch; done | sort -r

(Infelizmente "bom, digerível" não se aplica à formatação dos próprios scripts.)

    
por 10.06.2017 / 12:01

Tags