Wie beenden Sie die Verfolgung eines Remote-Zweigs in Git?

556

Wie beenden Sie die Verfolgung eines Remote-Zweigs in Git ?

Ich möchte das Tracking beenden, da ich in meinem konkreten Fall den lokalen Zweig löschen möchte, aber nicht den Remote-Zweig. Durch Löschen des lokalen Zweigs und Drücken der Löschung auf Remote wird auch der Remote-Zweig gelöscht:

Kann ich das einfach tun git branch -d the_branchund es wird nicht verbreitet, wenn ich es später mache git push?

Wird es sich nur verbreiten, wenn ich git push origin :the_branchspäter rennen würde ?

Jason Cohen
quelle

Antworten:

708

Wie in der Antwort von Yoshua Wuyts erwähnt , mit :git branch

git branch --unset-upstream

Andere Optionen:

Sie müssen Ihren lokalen Zweig nicht löschen.

Löschen Sie einfach den lokalen Zweig, der den Remote-Zweig verfolgt:

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

-r, --remotesWeist Git an, den Remote-Tracking-Zweig zu löschen (dh den Zweig zu löschen, der zum Verfolgen des Remote-Zweigs festgelegt wurde). Dadurch wird der Zweig auf dem Remote-Repo nicht gelöscht !

Siehe "Es fällt mir schwer, Git-Fetch zu verstehen "

Es gibt kein solches Konzept für lokale Verfolgungszweige, sondern nur Fernverfolgungszweige.
So origin/masterist ein Remote-Tracking-Zweig für masterim originRepo

Wie in den genannten Dobes Vandermeer ‚s Antwort , müssen Sie auch die Konfiguration der zugehörigen zurückgesetzt lokalen Niederlassung:

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

Entfernen Sie die Upstream-Informationen für <branchname>.
Wenn kein Zweig angegeben ist, wird standardmäßig der aktuelle Zweig verwendet.

(Git 1.8+, Oktober 2012, Commit B84869e von Carlos Martín Nieto ( carlosmn) )

Das macht jedes Drücken / Ziehen völlig unbewusst origin/<remote branch name>.

VonC
quelle
8
Der Remote-Tracking-Zweig wird nach dem Git-Abruf neu erstellt. Kann man diese ausschließen?
Matt R
1
@Matt: Ich glaube, dies würde durch Festlegen der remote.<name>.fetchRefspec-Konfigurationseinstellung geschehen , aber ich bin nicht sicher, ob Sie einen Zweig ausschließen können, wenn Sie eine Refspec angeben.
VonC
Es erschien mir auch so; Ich konnte meinen lokalen Zweig jedoch neu aufbauen und nach dem schnellen Vorlauf verschwand die offensichtliche Verbindung zwischen den Zweigen.
Willoller
7
@ruffin: Dies ist völlig normal: git branch -d -r origin/<remote branch name>Löscht einen lokal deklarierten Remote-Tracking-Zweig in Ihrem Repo. Der Zweig auf dem Remote-Repo selbst wird nicht gelöscht (nur ein git push :developmentwürde dies tun). Wenn Sie also Ihr lokales Netzwerk developmentmit einem anderen Verlauf als dem Remoteentwicklungszweig (auf dem Remote-Repo) pushen, wird weiterhin eine non-fast-forwardWarnung angezeigt.
VonC
1
@Marco stimmt, aber ich mache es trotzdem lieber, ich finde es "sauberer".
VonC
200

So entfernen Sie den Upstream für den aktuellen Zweig:

$ git branch --unset-upstream

Dies ist für Git v.1.8.0 oder neuer verfügbar. (Quellen: 1.7.9 ref , 1.8.0 ref )

Quelle

Yoshua Wuyts
quelle
20
Sollte die gewählte Antwort gewesen sein.
Kaiser
9
Wenn Sie den aktuellen Zweig nicht entfernen möchten, einfach:git branch --unset-upstream [branchname]
Sonata
2
Sieht so aus, als wäre das neu. Ein bisschen mehr Information wäre schön. ZB Version der Einführung.
ManuelSchneid3r
Sicher ist es, zögern Sie nicht zu antworten, wenn Sie es herausfinden und ich werde den Kommentar gerne aktualisieren
Yoshua Wuyts
Hmm, ich bekomme fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. danach und versuche einen Git Pull Origin / Master
information_interchange
106

So entfernen Sie die Zuordnung zwischen dem lokalen und dem Remote-Zweiglauf:

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

Optional können Sie den lokalen Zweig anschließend löschen, wenn Sie ihn nicht benötigen:

git branch -d <branch>

Dadurch wird der Remote-Zweig nicht gelöscht.

Dobes Vandermeer
quelle
11
git branch -d <branch>ist nicht erforderlich, um die Zuordnung zu entfernen.
Marco
1
Ich benutze JIRA. Wenn ich wieder ziehe, erscheint der Zweig. Wie kann ich das verhindern?
Pulver366
1
@Marco Richtig, aber wenn Sie verwenden, sehen git branch -vvSie immer noch die alten Zweige, bis Sie dies tun git branch -d <branch>.
Selten Needy
@ Pulver366 Abhängig von Ihren Einstellungen git pullkönnen Sie alle Remote-Zweige abrufen und alle Zweige erneut hinzufügen, die auf der Remote "erschienen" sind. Sie können dieses Verhalten "Alle Zweige ziehen" ändern, indem Sie git config [--global] push.default simpleoder ausführen git config [--global] push.default current. Mehr dazu push.defaulthier .
Selten Needy
1
@SeldomNeedy Ich denke, Sie könnten den Punkt eines DVCS verpassen? Der Punkt ist, dass ich einen Zweig haben kann, der anfängt, einen vorgelagerten Zweig zu verfolgen, aber dass ich ihn trenne, um einen Ansatz zu verfolgen, den der vorgelagerte Zweig nicht verwendet. In diesem Fall ist der Zweig weder "alt" (weil ich ihn noch entwickle) noch "nicht mehr verwendet" (weil ich ihn verwende). Dies ist ein großer Teil des Designs eines DVCS. Ist das sinnvoll?
Marco
33

Der einfachste Weg ist das Bearbeiten .git/config

Hier ist eine Beispieldatei

[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

Löschen Sie die Zeile merge = refs/heads/test1im test1Zweigabschnitt

Jacob Grundwasser
quelle
3
+1 Ich kann nicht definitiv sagen, dass dies die einfachste Methode ist, aber es erweist sich für mich als die am einfachsten zu verstehende (und hoffentlich deshalb zu merkende)!
Salbei
Schöne Lösung +1. Dies ist eigentlich der Ort, an dem das Tracking registriert wird, einfach zu ändern ist und klar macht, was es tut. Die Befehlszeile .git/configist ebenfalls verfügbar.
hakre
5
Zu Ihrer Information, dies ist das Gleiche wie die "git config --unset" -Lösung von Dobes Vandermeer. "git config" bearbeitet diese Datei.
JZ
10

Sie können den Remote-Tracking-Zweig mit löschen

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

wie VonC oben erwähnt. Wenn Sie jedoch Ihre lokale Kopie des Zweigs behalten, git push wird weiterhin versucht, diesen Zweig zu pushen (was zu einem Fehler beim nicht schnellen Vorlauf führen kann, wie dies bei Ruffin der Fall war ). Dies liegt daran, dass die Konfiguration push.defaultstandardmäßig Folgendes matchingbedeutet:

Matching - Schieben Sie alle passenden Zweige. Alle Zweige, die an beiden Enden den gleichen Namen haben, gelten als übereinstimmend. Dies ist die Standardeinstellung.

(Siehe http://git-scm.com/docs/git-config unterpush.default )

Wahrscheinlich , da dies zu sehen , ist nicht das, was Sie wollten , wenn Sie die Fernverfolgung Zweig gelöscht, können Sie einstellen , push.defaultauf upstream(oder trackingwenn Sie git <1.7.4.3)

Upstream - Schieben Sie den aktuellen Zweig in den Upstream-Zweig.

mit

git config push.default upstream

und git hört auf zu versuchen, Zweige zu pushen, die Sie "nicht mehr verfolgen".

Hinweis: Die einfachere Lösung besteht darin, Ihren lokalen Zweig einfach in einen anderen Zweig umzubenennen. Dies würde auch ein gewisses Verwirrungspotential beseitigen.

CletusW
quelle
3

Hier ist ein Einzeiler zum Entfernen aller Fernverfolgungszweige, die einem Muster entsprechen:

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

infomanisch
quelle
Wenn nur Fernverfolgungszweige nicht verfolgt (gelöscht) werden sollen, dann denke ich, dass dies eine kürzere einzeilige Alternative ist:git branch -r -D $(git branch -r | grep -v "master")
dma_k
1

Dies ist keine Antwort auf die Frage, aber ich konnte nicht herausfinden, wie man in einem Kommentar oben eine anständige Code-Formatierung erhält ... also hier ist mein Kommentar.

Ich habe das Rezept von @Dobes in einem ausgefallenen shmancy [alias] -Eintrag in meiner .gitconfig eingereicht:

# 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"

Dann kann ich einfach rennen

$ git bruntrack branchname
qneill
quelle
1
+1. Netter Alias, zusätzlich zu meiner Antwort oben .
VonC
-1

git branch --unset-upstream stoppt die Verfolgung aller lokalen Niederlassungen, was nicht wünschenswert ist.

Entfernen Sie den [branch "branch-name"]Abschnitt aus der .git/configDatei, gefolgt von

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

funktioniert am besten für mich.

Bob
quelle
-1

Auf diese Weise können Sie Ihren Remote-Zweig entfernen

git remote remove <your remote branch name>
Hưng
quelle
1
Das würde alle Fernverfolgungszweige für diese Fernbedienung entfernen : Wenn Sie mehr als einen haben, könnte dies problematisch sein.
VonC
-2

Der einfachste Weg, dies zu tun, besteht darin, den Zweig aus der Ferne zu löschen und dann Folgendes zu verwenden:

git fetch --prune (auch bekannt als git fetch -p)

Mark Caudill
quelle
14
Ich bin verwirrt, das OP wollte den Remote-Zweig nicht löschen.
madth3
Es ist gut, verfolgte Remote-Zweige aus Ihrem lokalen Repository zu entfernen, das im Remote-Bare-Repository gelöscht wurde.
Marek Podyma