Comment arrêter le suivi d'une branche distante dans Git?

557

Comment arrêter le suivi d'une branche distante dans Git ?

Je demande d'arrêter le suivi car dans mon cas concret, je veux supprimer la branche locale, mais pas la distante. Supprimer la section locale et pousser la suppression vers la télécommande supprimera également la branche distante:

Puis-je simplement le faire git branch -d the_branch, et cela ne se propagera pas plus tard git push?

Cela ne se propagera-t-il que si je devais courir git push origin :the_branchplus tard?

Jason Cohen
la source

Réponses:

709

Comme mentionné dans la réponse de Yoshua Wuyts , en utilisant :git branch

git branch --unset-upstream

Autres options:

Vous n'êtes pas obligé de supprimer votre succursale locale.

Supprimez simplement la branche locale qui suit la branche distante:

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

-r, --remotesindique à git de supprimer la branche de suivi à distance (c'est-à-dire de supprimer l'ensemble de branches pour suivre la branche distante). Ce sera pas supprimer la branche sur la prise en pension à distance !

Voir " Avoir du mal à comprendre git-fetch "

il n'y a pas un tel concept de branches de suivi local, seulement des branches de suivi à distance.
Il en origin/masterva de même pour une branche de suivi à distance masterdans le originréférentiel

Comme mentionné dans la réponse de Dobes Vandermeer , vous devez également réinitialiser la configuration associée à la branche locale :

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

Supprimez les informations en amont pour <branchname>.
Si aucune branche n'est spécifiée, il s'agit par défaut de la branche actuelle.

(git 1.8+, oct.2012, commit b84869e par Carlos Martín Nieto ( carlosmn) )

Cela rendra tout push / pull complètement inconscient origin/<remote branch name>.

VonC
la source
8
La branche de suivi à distance est recréée après git fetch. Est-il possible de les exclure?
Matt R
1
@Matt: Je pense que cela se ferait en définissant le remote.<name>.fetchparamètre de configuration refspec, mais je ne sais pas si vous pouvez exclure une branche lorsque vous spécifiez une refspec.
VonC
Cela m'est apparu aussi; J'ai cependant pu rebaser ma branche locale et après l'avance rapide, la connexion apparente entre les branches a disparu.
willoller
7
@ruffin: c'est tout à fait normal: git branch -d -r origin/<remote branch name>supprimera une branche de suivi à distance telle que déclarée localement , dans votre repo. Il ne supprimera pas la branche sur le référentiel distant lui-même (seul le git push :developmentferait). Ainsi, lorsque vous poussez votre section locale development, avec un historique différent de la branche de développement à distance (sur le référentiel distant), vous recevrez toujours l' non-fast-forwardavertissement.
VonC
1
@Marco c'est vrai, mais je préfère quand même le faire, je le trouve "plus propre".
VonC
200

Pour supprimer l'amont de la branche actuelle, procédez comme suit:

$ git branch --unset-upstream

Ceci est disponible pour Git v.1.8.0 ou plus récent. (Sources: 1.7.9 réf , 1.8.0 réf )

la source

Yoshua Wuyts
la source
20
Cela aurait dû être la réponse choisie.
kaiser
9
Si vous ne souhaitez pas supprimer la branche actuelle, il vous suffit de:git branch --unset-upstream [branchname]
Sonata
2
On dirait que c'est nouveau. Un peu plus d'informations serait bien. Par exemple, version d'introduction.
ManuelSchneid3r
Bien sûr, n'hésitez pas à répondre lorsque vous le découvrirez et je mettrai à jour le commentaire avec plaisir
Yoshua Wuyts
Hmm, j'obtiens fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. après avoir fait ça et essayé un git pull origin / master
information_interchange
106

Pour supprimer l'association entre l'exécution de branche locale et distante:

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

Supprimez éventuellement la branche locale par la suite si vous n'en avez pas besoin:

git branch -d <branch>

Cela ne supprimera pas la branche distante.

Dobes Vandermeer
la source
11
git branch -d <branch>n'est pas tenu de supprimer l'association.
Marco
1
J'utilise JIRA. Lorsque je tire à nouveau, la branche apparaît. Comment puis-je empêcher cela?
powder366
1
@Marco Correct, mais si vous utilisez, git branch -vvvous verrez toujours les anciennes branches jusqu'à ce que vous le fassiez git branch -d <branch>.
SeldomNeedy
@ powder366 Selon vos paramètres, git pullpeut récupérer toutes les branches distantes et rajouter celles qu'il considère comme "apparues" sur la télécommande. Vous pouvez modifier ce comportement "tirer toutes les branches" en faisant git config [--global] push.default simpleou git config [--global] push.default current. Plus push.defaultici .
SeldomNeedy
1
@SeldomNeedy Je pense que vous pourriez manquer le point d'un DVCS? Le fait est que je peux avoir une branche qui commence par suivre une branche en amont, mais que je me détache afin de poursuivre une approche que la branche en amont n'utilise pas. Dans ce cas, la branche n'est ni "ancienne" (parce que j'y développe encore) ni "désaffectée" (parce que je l'utilise). C'est une grande partie de la conception d'un DVCS. Est-ce que cela a du sens?
Marco
33

La façon la plus simple est de modifier .git/config

Voici un exemple de fichier

[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

Supprimer la ligne merge = refs/heads/test1dans la test1section de branche

Jacob Groundwater
la source
3
+1 Je ne peux pas affirmer avec certitude qu'il s'agit de la méthode la plus simple, mais elle s'avère certainement la plus facile à comprendre pour moi (et, je l'espère, à retenir)!
sauge
Belle solution +1. C'est en fait l'endroit où le suivi est enregistré, facile à changer, effacez ce qu'il fait. La ligne de commande .git/configest également disponible.
hakre
5
pour info, c'est la même chose que la solution "git config --unset" de Dobes Vandermeer. "git config" édite ce fichier.
JZ
10

Vous pouvez supprimer la branche de suivi à distance à l'aide de

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

comme VonC le mentionne ci-dessus. Cependant, si vous conservez votre copie locale de la branche, git push essaiera toujours de pousser cette branche (ce qui pourrait vous donner une erreur d'avance non rapide comme elle l'a fait pour Ruffin ). C'est parce que la configuration par push.defaultdéfaut matchingsignifie ce qui signifie:

matching - pousser toutes les branches correspondantes. Toutes les branches ayant le même nom aux deux extrémités sont considérées comme étant identiques. C'est la valeur par défaut.

(voir http://git-scm.com/docs/git-config sous push.default)

Voyant que cela est probablement pas ce que vous vouliez quand vous avez supprimé la branche de suivi à distance, vous pouvez définir push.defaultà upstream(ou trackingsi vous avez git <1.7.4.3)

en amont - pousser la branche actuelle vers sa branche en amont.

en utilisant

git config push.default upstream

et git cessera d'essayer de pousser les branches que vous avez "arrêtées de suivre".

Remarque: La solution la plus simple serait de simplement renommer votre branche locale en autre chose. Cela éliminerait également certains risques de confusion.

CletusW
la source
3

Voici une ligne pour supprimer toutes les branches de suivi à distance correspondant à un modèle:

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

infomaniac
la source
Si seules les branches de suivi à distance doivent être non suivies (supprimées), alors je pense que c'est une alternative plus courte sur une seule ligne:git branch -r -D $(git branch -r | grep -v "master")
dma_k
1

Ce n'est pas une réponse à la question, mais je n'ai pas pu trouver comment obtenir une mise en forme de code décente dans un commentaire ci-dessus ...

J'ai la recette soumise par @Dobes dans une entrée de fantaisie shmancy [alias] dans mon .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"

Ensuite, je peux simplement courir

$ git bruntrack branchname
qneill
la source
1
+1. Joli alias, en plus de ma réponse ci-dessus .
VonC
-1

git branch --unset-upstream arrête de suivre toutes les succursales locales, ce qui n'est pas souhaitable.

Supprimez la [branch "branch-name"]section du .git/configfichier suivie de

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

fonctionne le mieux pour moi.

Bob
la source
-1

Vous pouvez utiliser cette méthode pour supprimer votre branche distante

git remote remove <your remote branch name>
Hưng
la source
1
Cela supprimerait toutes les branches de suivi à distance pour cette télécommande: si vous en avez plusieurs, cela pourrait être problématique.
VonC
-2

La façon la plus simple de procéder consiste à supprimer la branche à distance, puis à utiliser:

git fetch --prune (alias git fetch -p)

Mark Caudill
la source
14
Je suis confus, l'OP n'a pas voulu supprimer la branche distante.
madth3
Il est bon de nettoyer les branches distantes suivies de votre référentiel local qui a été supprimé sur le référentiel nu distant.
Marek Podyma