¿Cómo se detiene el seguimiento de una sucursal remota en Git?

557

¿Cómo se detiene el seguimiento de una sucursal remota en Git ?

Solicito detener el seguimiento porque, en mi caso concreto, quiero eliminar la rama local, pero no la remota. Eliminar el local y empujar la eliminación a remoto también eliminará la rama remota:

¿Puedo hacerlo git branch -d the_branch, y no se propagará cuando más tarde git push?

¿Solo se propagará si tuviera que correr git push origin :the_branchmás tarde?

Jason Cohen
fuente

Respuestas:

709

Como se menciona en la respuesta de Yoshua Wuyts , usando :git branch

git branch --unset-upstream

Otras opciones:

No tiene que eliminar su sucursal local.

Simplemente elimine la rama local que está rastreando la rama remota:

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

-r, --remotesle dice a git que elimine la rama de seguimiento remoto (es decir, elimine la rama establecida para rastrear la rama remota). Esto será no eliminar la rama en el repositorio remoto !

Consulte " Tener dificultades para comprender git-fetch "

no existe tal concepto de sucursales de seguimiento local, solo sucursales de seguimiento remoto.
Entonces, ¿ origin/masterhay una rama de seguimiento remoto masteren el originrepositorio?

Como se mencionó en Dobes Vandermeer 's respuesta , también es necesario para restablecer la configuración asociada al local de la rama:

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

Elimine la información ascendente para <branchname>.
Si no se especifica ninguna rama, la rama predeterminada es la actual.

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

Eso hará que cualquier push / pull sea completamente inconsciente origin/<remote branch name>.

VonC
fuente
8
La rama de seguimiento remoto se recrea después de git fetch. ¿Es posible excluir estos?
Matt R
1
@Matt: Creo que esto se lograría estableciendo la remote.<name>.fetchconfiguración de configuración de referencia, pero no estoy seguro de si puede excluir una rama al especificar una especificación de referencia.
VonC
A mí también me pareció así; Sin embargo, pude cambiar la base de mi rama local y después del avance rápido, la aparente conexión entre las ramas desapareció.
willoller
77
@ruffin: esto es completamente normal: git branch -d -r origin/<remote branch name>eliminará una rama de seguimiento remoto como se declara localmente , en su repositorio. Será no eliminar la rama en el propio repo a distancia (sólo git push :developmentharía eso). Entonces, cuando esté presionando su local development, con un historial diferente al de la rama de desarrollo remoto (en el repositorio remoto), aún recibirá la non-fast-forwardadvertencia.
VonC
1
@Marco es cierto, pero prefiero hacerlo de todos modos, lo encuentro "más limpio".
VonC
200

Para eliminar el flujo ascendente de la rama actual, haga lo siguiente:

$ git branch --unset-upstream

Está disponible para Git v.1.8.0 o posterior. (Fuentes: 1.7.9 ref , 1.8.0 ref )

fuente

Yoshua Wuyts
fuente
20
Debería haber sido la respuesta elegida.
kaiser
99
Si no desea eliminar la rama actual, simplemente:git branch --unset-upstream [branchname]
Sonata
2
Parece que esto es nuevo. Un poco más de información sería bueno. Por ejemplo, la versión de introducción.
ManuelSchneid3r
Claro que lo es, no
dudes
Hmm, me estoy poniendo fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. después de hacer esto y probar un origen / maestro de git pull
information_interchange
106

Para eliminar la asociación entre la rama local y la remota, ejecute:

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

Opcionalmente, elimine la sucursal local después si no la necesita:

git branch -d <branch>

Esto no eliminará la rama remota.

Dobes Vandermeer
fuente
11
git branch -d <branch>No es necesario eliminar la asociación.
Marco
1
Estoy usando JIRA. Cuando vuelvo a tirar, aparece la rama. ¿Cómo puedo evitar eso?
powder366
1
@Marco Correcto, pero si lo usa git branch -vv, seguirá viendo las ramas viejas hasta que lo haga git branch -d <branch>.
SeldomNeedy
@ powder366 Dependiendo de su configuración, git pullpuede tomar todas las ramas remotas y volver a agregar cualquiera que considere "aparecido" en el control remoto. Puede cambiar este comportamiento de "extraer todas las ramas" haciendo git config [--global] push.default simpleo git config [--global] push.default current. Más sobre push.defaultaquí .
SeldomNeedy
1
@SeldomNeedy ¿Creo que podrías estar perdiendo el punto de un DVCS? El punto es que puedo tener una rama que comienza rastreando una rama aguas arriba, pero que me desconecto para seguir un enfoque que la rama aguas arriba no está usando. En ese caso, la rama no es "antigua" (porque todavía la estoy desarrollando) ni "en desuso" (porque la estoy usando). Esta es una gran parte del diseño de un DVCS. ¿Tiene sentido?
Marco
33

La forma más simple es editar .git/config

Aquí hay un archivo de ejemplo

[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

Eliminar la línea merge = refs/heads/test1en la test1sección de rama

Jacob Groundwater
fuente
3
+1 No puedo decir definitivamente que este es el método más fácil, ¡pero ciertamente es el más fácil de entender para mí (y con suerte para recordarlo)!
sabio
Buena solución +1. Este es en realidad el lugar donde se registra el seguimiento, fácil de cambiar, claro lo que hace. La línea de comandos también .git/configestá disponible.
Hakre
55
para su información, esto es lo mismo que la solución "git config --unset" de Dobes Vandermeer. "git config" edita este archivo.
JZ
10

Puede eliminar la rama de seguimiento remoto utilizando

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

como VonC menciona arriba. Sin embargo, si conserva su copia local de la rama, git push aún intentará impulsar esa rama (lo que podría generar un error de avance no rápido como lo hizo para ruffin ). Esto se debe a que la configuración push.defaultpredeterminada es lo matchingque significa:

coincidencia: empuje todas las ramas coincidentes. Todas las ramas que tienen el mismo nombre en ambos extremos se consideran coincidentes. Este es el valor predeterminado.

(ver http://git-scm.com/docs/git-config debajo push.default)

Ya que esto probablemente no es lo que quería cuando se eliminó la rama remota de seguimiento, se puede establecer push.defaultque upstream(o trackingsi tiene git <1.7.4.3)

ascendente: empuje la rama actual a su rama ascendente.

utilizando

git config push.default upstream

y git dejará de intentar empujar ramas que usted "ha dejado de rastrear".

Nota: La solución más simple sería simplemente cambiar el nombre de su sucursal local a otra cosa. Eso eliminaría también algunas posibilidades de confusión.

CletusW
fuente
3

Aquí hay una línea para eliminar todas las ramas de seguimiento remoto que coinciden con un patrón:

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

infomaniaco
fuente
Si solo se deben rastrear (eliminar) las ramas de seguimiento remoto, creo que esta es una alternativa más breve de una línea:git branch -r -D $(git branch -r | grep -v "master")
dma_k
1

Esta no es una respuesta a la pregunta, pero no pude descubrir cómo obtener un formato de código decente en un comentario anterior ... así que aquí está mi comentario.

Tengo la receta presentada por @Dobes en una elegante entrada de shmancy [alias] en mi .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"

Entonces solo puedo correr

$ git bruntrack branchname
qneill
fuente
1
+1. Buen alias, además de mi respuesta anterior .
VonC
-1

git branch --unset-upstream deja de rastrear todas las sucursales locales, lo cual no es deseable.

Eliminar la [branch "branch-name"]sección del .git/configarchivo seguido de

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

Funciona lo mejor para mí.

Beto
fuente
-1

Puede usar esta forma para eliminar su rama remota

git remote remove <your remote branch name>
Colgado
fuente
1
Eso eliminaría todas las ramas de seguimiento remoto para ese control remoto: si tiene más de uno, eso podría ser problemático.
VonC
-2

La forma más fácil de hacer esto es eliminar la rama de forma remota y luego usar:

git fetch --prune (también conocido como git fetch -p)

Mark Caudill
fuente
14
Estoy confundido, el OP no quería eliminar la rama remota.
madth3
Es bueno limpiar las ramas remotas rastreadas de su repositorio local que se eliminó en el repositorio remoto remoto.
Marek Podyma