Como você para de rastrear uma ramificação remota no Git?

557

Como você para de rastrear uma ramificação remota no Git ?

Estou pedindo para interromper o rastreamento porque, no meu caso concreto, desejo excluir a filial local, mas não a remota. Excluir o local e pressionar a exclusão para remoto também excluirá a ramificação remota:

Posso fazer git branch -d the_branche não será propagado quando for mais tarde git push?

Ele só será propagado se eu for executado git push origin :the_branchmais tarde?

Jason Cohen
fonte

Respostas:

709

Conforme mencionado na Yoshua Wuyts ' resposta , usando git branch:

git branch --unset-upstream

Outras opções:

Você não precisa excluir sua filial local.

Simplesmente exclua a filial local que está rastreando a filial remota:

git branch -d -r origin/<remote branch name>

-r, --remotesdiz ao git para excluir a ramificação de rastreamento remoto (ou seja, excluir a ramificação definida para rastrear a ramificação remota). Isto vai não excluir o ramo no repo remoto !

Consulte " Dificuldade para entender o git-fetch "

não existe esse conceito de ramificações de rastreamento local, apenas ramificações de rastreamento remoto.
O mesmo origin/masterocorre com um ramo de rastreamento remoto masterno originrepositório

Conforme mencionado na Dobes Vandermeer 's resposta , você também precisará redefinir a configuração associada ao local de ramo:

git config --unset branch.<branch>.remote
git config --unset branch.<branch>.merge

Remova as informações upstream para <branchname>.
Se nenhuma ramificação for especificada, o padrão será a ramificação atual.

(git 1.8+, outubro de 2012, commit b84869e de Carlos Martín Nieto ( carlosmn) )

Isso fará qualquer push / pull completamente inconsciente origin/<remote branch name>.

VonC
fonte
8
O ramo de rastreamento remoto é recriado após a busca do git. É possível excluir estes?
Matt R
1
@ Matt: Eu acredito que isso seria feito definindo a remote.<name>.fetchconfiguração refspec, mas não tenho certeza se você pode excluir uma ramificação ao especificar uma refspec.
VonC 6/08/10
Pareceu-me assim também; Consegui refazer minha filial local e, após o avanço rápido, a aparente conexão entre as filiais desapareceu.
willoller
7
@ ruffin: isso é completamente normal: git branch -d -r origin/<remote branch name>excluirá um ramo de rastreamento remoto, conforme declarado localmente , no seu repositório. Ele não excluirá a ramificação no repositório remoto em si (apenas uma git push :developmentfaria isso). Portanto, quando você estiver enviando seu local development, com um histórico diferente do ramo de desenvolvimento remoto (no repositório remoto), você ainda receberá o non-fast-forwardaviso.
VonC
1
@ Marco verdade, mas eu prefiro fazê-lo de qualquer maneira, acho "mais limpo".
VonC 11/03/2013
200

Para remover o montante da ramificação atual, faça:

$ git branch --unset-upstream

Está disponível para o Git v.1.8.0 ou mais recente. (Fontes: 1.7.9 ref , 1.8.0 ref )

fonte

Yoshua Wuyts
fonte
20
Deveria ter sido a resposta escolhida.
kaiser
9
Se você não deseja remover a ramificação atual, simplesmente:git branch --unset-upstream [branchname]
Sonata
2
Parece que isso é novo. Um pouco mais de informação seria bom. Por exemplo, versão de introdução.
ManuelSchneid3r
Claro que é, fique à vontade para responder quando você descobrir e eu vou alegremente atualizar o comentário
Yoshua Wuyts
Hmm, eu estou ficando fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. depois de fazer isso e tentar um git origem pull / mestre
information_interchange
106

Para remover a associação entre a ramificação local e remota, execute:

git config --unset branch.<local-branch-name>.remote
git config --unset branch.<local-branch-name>.merge

Opcionalmente, exclua a ramificação local posteriormente, se você não precisar dela:

git branch -d <branch>

Isso não excluirá a ramificação remota.

Dobes Vandermeer
fonte
11
git branch -d <branch>não é necessário para remover a associação.
Marco
1
Estou usando o JIRA. Quando eu puxo novamente, o galho aparece. Como posso evitar isso?
precisa saber é o seguinte
1
@ Marco Correto, mas se você usar git branch -vv, ainda verá os galhos antigos até o fazer git branch -d <branch>.
SeldomNeedy
@ powder366 Dependendo das suas configurações, git pullpode pegar todas as ramificações remotas e adicionar novamente todas as que considere ter "aparecido" no controle remoto. Você pode alterar esse comportamento "puxar todos os ramos" fazendo git config [--global] push.default simpleou git config [--global] push.default current. Mais push.defaultaqui .
SeldomNeedy
1
@SeldomNeedy Acho que você pode estar perdendo o objetivo de um DVCS? O ponto é que eu posso ter um ramo que começa a rastrear um ramo upstream, mas desanexo para seguir uma abordagem que o ramo upstream não está usando. Nesse caso, o ramo não é "antigo" (porque ainda estou desenvolvendo) nem "desutilizado" (porque estou usando). Essa é uma grande parte do design de um DVCS. Isso faz sentido?
Marco
33

A maneira mais simples é editar .git/config

Aqui está um arquivo de exemplo

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
[remote "origin"]
        url = [email protected]:repo-name
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "test1"]
        remote = origin
        merge = refs/heads/test1
[branch "master"]
        remote = origin
        merge = refs/heads/master

Exclua a linha merge = refs/heads/test1na test1seção de ramificação

Jacob Groundwater
fonte
3
+1 Não posso dizer definitivamente que esse é o método mais fácil, mas certamente é o mais fácil para eu entender (e espero que me lembre)!
sage
Ótima solução +1. Este é realmente o local em que o rastreamento é registrado, fácil de alterar, claro o que faz. A linha de comando também .git/configestá disponível.
hakre
5
fyi, é o mesmo que a solução "git config --unset" de Dobes Vandermeer. "git config" edita este arquivo.
28413 JZ
10

Você pode excluir o ramo de rastreamento remoto usando

git branch -d -r origin/<remote branch name>

como VonC menciona acima. No entanto, se você mantiver sua cópia local da ramificação, git push ainda tentará enviá- la por push (o que pode causar um erro de avanço rápido, como ocorreu com o ruffin ). Isso ocorre porque a configuração push.defaultpadrão é o matchingque significa:

correspondência - pressione todas as ramificações correspondentes. Todos os ramos com o mesmo nome nos dois extremos são considerados correspondentes. Esse é o padrão.

(consulte http://git-scm.com/docs/git-config em push.default)

Como provavelmente não é o que você queria quando excluiu o ramo de rastreamento remoto, você pode definir push.defaultcomo upstream(ou trackingse tiver git <1.7.4.3)

upstream - empurre a ramificação atual para sua ramificação upstream.

usando

git config push.default upstream

e o git vai parar de tentar enviar ramificações que você "parou de rastrear".

Nota: A solução mais simples seria renomear sua filial local para outra coisa. Isso eliminaria algum potencial de confusão também.

CletusW
fonte
3

Aqui está uma lista para remover todas as ramificações de rastreamento remoto que correspondem a um padrão:

git branch -rd $(git branch -a | grep '{pattern}' | cut -d'/' -f2-10 | xargs)

infomaníaco
fonte
Se apenas ramos-monitoramento remoto estão a ser untracked (excluído), então eu acho que isso é mais curta alternativa de uma linha:git branch -r -D $(git branch -r | grep -v "master")
dma_k
1

Esta não é uma resposta para a pergunta, mas eu não conseguia descobrir como obter uma formatação decente de código em um comentário acima ... então, aqui está o meu comentário, com a auto-reputação-deprimida.

Eu tenho a receita enviada por @Dobes em uma entrada chmancy [alias] no meu .gitconfig:

# to untrack a local branch when I can't remember 'git config --unset'
cbr = "!f(){ git symbolic-ref -q HEAD 2>/dev/null | sed -e 's|refs/heads/||'; }; f"
bruntrack = "!f(){ br=${1:-`git cbr`};  \
    rm=`git config --get branch.$br.remote`; \
    tr=`git config --get branch.$br.merge`; \
    [ $rm:$tr = : ] && echo \"# untrack: not a tracking branch: $br\" && return 1; \
    git config --unset branch.$br.remote; git config --unset branch.$br.merge; \
    echo \"# untrack: branch $br no longer tracking $rm:$tr\"; return 0; }; f"

Então eu posso correr

$ git bruntrack branchname
qneill
fonte
1
+1. Alias ​​legal, além da minha resposta acima .
VonC 4/14
-1

git branch --unset-upstream pára de rastrear todas as filiais locais, o que não é desejável.

Remova a [branch "branch-name"]seção do .git/configarquivo seguida por

git branch -D 'branch-name' && git branch -D -r 'origin/branch-name'

funciona melhor para mim.

Prumo
fonte
-1

Você pode usar esta maneira para remover sua filial remota

git remote remove <your remote branch name>
Pendurado
fonte
1
Isso removeria todas as ramificações de rastreamento remoto desse controle remoto: se você tem mais de um, isso pode ser problemático.
VonC 11/07/19
-2

A maneira mais fácil de fazer isso é excluir a ramificação remotamente e usar:

git fetch --prune (tcp git fetch -p)

Mark Caudill
fonte
14
Estou confuso, o OP não queria excluir o ramo remoto.
madth3
É bom limpar as ramificações remotas rastreadas do repositório local, que foram excluídas no repositório remoto remoto.
Marek Podyma #