Jak przestać śledzić zdalną gałąź w Git?


556

Jak przestać śledzić zdalną gałąź w Git ?

Proszę o zaprzestanie śledzenia, ponieważ w moim konkretnym przypadku chcę usunąć oddział lokalny, ale nie zdalny. Usunięcie lokalnego i przekazanie usunięcia do zdalnego spowoduje również usunięcie gałęzi zdalnej:

Czy mogę po prostu to zrobić git branch -d the_branchi nie będzie się to rozprzestrzeniać, gdy później git push?

Czy rozprzestrzeni się tylko wtedy, gdybym miał git push origin :the_branchpóźniej uruchomić ?

Odpowiedzi:


708

Jak wspomniano w Yoshua WUYTS ' odpowiedź , używając git branch:

git branch --unset-upstream

Inne opcje:

Nie musisz usuwać swojego lokalnego oddziału.

Wystarczy usunąć oddział lokalny, który śledzi oddział zdalny:

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

-r, --remoteskaże gitowi usunąć gałąź zdalnego śledzenia (tj. usunąć zestaw gałąź, aby śledzić gałąź zdalną). To będzie nie usunąć gałąź na pilocie zdalnego repo !

Zobacz „ Trudności ze zrozumieniem git-fetch ”

nie ma takiej koncepcji lokalnych gałęzi śledzenia, tylko zdalne gałęzie śledzenia.
Podobnie origin/masterjak gałąź zdalnego śledzenia masterw originrepozytorium

Jak wspomniano w Dobes Vandermeer „s odpowiedź , trzeba również, aby wyzerować konfigurację związaną z lokalnego oddziału:

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

Usuń informacje wstępne dla <branchname>.
Jeśli nie określono żadnej gałęzi, domyślnie jest to bieżąca gałąź.

(git 1.8+, październik 2012 r., commit b84869e autor: Carlos Martín Nieto ( carlosmn) )

To sprawi, że każde naciśnięcie / pociągnięcie będzie całkowicie nieświadome origin/<remote branch name>.


8
Zdalna gałąź śledzenia jest odtwarzana po pobraniu git. Czy można je wykluczyć?
— Matt R

1
@Matt: Wierzę, że można to zrobić, ustawiając ustawienie remote.<name>.fetchkonfiguracji refspec, ale nie jestem pewien, czy można wykluczyć gałąź podczas określania refspec.
— VCC,

Tak mi się też wydawało; Byłem jednak w stanie bazować na moim lokalnym oddziale i po przewinięciu do przodu pozorne połączenie między gałęziami zniknęło.
— willoller,

7
@ruffin: jest to całkowicie normalne: git branch -d -r origin/<remote branch name>usunie zdalną gałąź śledzenia zadeklarowaną lokalnie w twoim repozytorium. To będzie nie usunąć gałąź na samej zdalnego repo (tylko git push :developmentto zrobi). Więc kiedy przesuwasz swój lokalny development, z historią inną niż gałąź zdalnego programowania (na zdalnym repozytorium), nadal otrzymasz non-fast-forwardostrzeżenie.
— VCC

1
@Marco prawda, ale i tak wolę to robić, uważam to za „czystsze”.
— VCC z

200

Aby usunąć upstream dla bieżącego oddziału:

$ git branch --unset-upstream

Jest to dostępne dla Git v.1.8.0 lub nowszej. (Źródła: 1.7.9 , 1.8.0 )

źródło


20
Powinna być wybrana odpowiedź.
— kaiser

9
Jeśli nie chcesz usuwać bieżącej gałęzi, po prostu:git branch --unset-upstream [branchname]
— Sonata,

2
Wygląda na to, że jest nowy. Przydałoby się trochę więcej informacji. Np. Wersja wstępu.
— ManuelSchneid3r

Pewnie, że tak, nie krępuj się odpowiedzieć, gdy się dowiesz, a ja z przyjemnością zaktualizuję komentarz
— Yoshua Wuyts

Hmm, dostaję się fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. po zrobieniu tego i wypróbowaniu git pull origin / master
— information_interchange

106

Aby usunąć powiązanie między lokalnym i zdalnym uruchomieniem oddziału:

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

Opcjonalnie usuń później oddział lokalny, jeśli go nie potrzebujesz:

git branch -d <branch>

To nie usunie zdalnej gałęzi.


11
git branch -d <branch>nie jest wymagane do usunięcia powiązania.
— Marco

1
Używam JIRA. Kiedy ponownie pociągnę, pojawi się gałąź. Jak mogę temu zapobiec?
— proszek 366

1
@Marco Prawidłowo, ale jeśli użyjesz git branch -vv, nadal zobaczysz stare gałęzie, dopóki tego nie zrobisz git branch -d <branch>.
— SeldomNeedy

@ powder366 W zależności od ustawień git pullmoże pobrać wszystkie zdalne gałęzie i ponownie dodać dowolne, które uzna za „pojawiły się” na pilocie. Możesz zmienić to zachowanie „wyciągnij wszystkie gałęzie”, wykonując git config [--global] push.default simplelub git config [--global] push.default current. Więcej push.defaulttutaj .
— SeldomNeedy

1
@SeldomNeedy Wydaje mi się, że brakuje Ci punktu DVCS? Chodzi o to, że mogę mieć gałąź, która zaczyna śledzić gałąź nadrzędną, ale odłączam się, aby zastosować podejście, którego nie używa gałąź nadrzędna. W takim przypadku gałąź nie jest ani „stara” (ponieważ wciąż się nad nią rozwijam), ani „nieużywana” (ponieważ go używam). To duża część projektu DVCS .. Czy to ma sens?
— Marco

33

Najprostszym sposobem jest edycja .git/config

Oto przykładowy plik

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

Usuń linię merge = refs/heads/test1w test1sekcji oddziału


3
+1 Nie mogę definitywnie powiedzieć, że jest to najłatwiejsza metoda, ale z pewnością okazuje się najłatwiejsza do zrozumienia (i mam nadzieję, że o tym pamiętam)!
— mędrzec

Ładne rozwiązanie +1. W rzeczywistości jest to miejsce, w którym śledzenie jest zarejestrowane, łatwe do zmiany, jasne, co robi. Linia poleceń .git/configjest również dostępna.
— hakre 24.04.13

5
fyi, jest to to samo co rozwiązanie „git config --unset” firmy Dobes Vandermeer. „git config” edytuje ten plik.
— JZ

10

Możesz usunąć gałąź zdalnego śledzenia za pomocą

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

jak wspomniano powyżej VonC. Jeśli jednak zachowasz lokalną kopię gałęzi, git push nadal będziesz próbował wypchnąć tę gałąź (co może dać ci błąd szybkiego przewijania, tak jak w przypadku ruffin ). Jest tak, ponieważ push.defaultdomyślna konfiguracja matchingoznacza:

dopasowywanie - wypychaj wszystkie pasujące gałęzie. Wszystkie gałęzie o tej samej nazwie na obu końcach są uważane za pasujące. To jest domyślne.

(patrz http://git-scm.com/docs/git-config pod push.default)

Ponieważ po usunięciu gałęzi zdalnego śledzenia prawdopodobnie nie jest to pożądane, możesz ustawić push.defaultna upstream(lub trackingjeśli masz git <1.7.4.3)

upstream - pchnij bieżącą gałąź do jej gałęzi upstream.

za pomocą

git config push.default upstream

a git przestanie próbować wypychać gałęzie, które „przestałeś śledzić”.

Uwaga: prostszym rozwiązaniem byłoby po prostu zmiana nazwy lokalnego oddziału na coś innego. To również wyeliminowałoby pewien potencjał do zamieszania.


3

Oto jedna linijka do usunięcia wszystkich gałęzi zdalnego śledzenia pasujących do wzorca:

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


Jeśli tylko śledzenie zdalne ma być śledzone (usuwane), myślę, że jest to krótsza alternatywa dla jednej linii:git branch -r -D $(git branch -r | grep -v "master")
— dma_k

1

To nie jest odpowiedź na pytanie, ale nie mogłem wymyślić, jak uzyskać przyzwoite formatowanie kodu w powyższym komentarzu ... więc auto-down-reputation-be-cholera, oto mój komentarz.

Mam przepis przesłany przez @Dobes w fantazyjnym shmancy [alias] w moim .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"

Wtedy mogę po prostu uciec

$ git bruntrack branchname

1
+1. Niezły alias, oprócz mojej powyższej odpowiedzi .
— VonC

-1

git branch --unset-upstream przestaje śledzić wszystkie lokalne oddziały, co nie jest pożądane.

Usuń [branch "branch-name"]sekcję z .git/configpliku, a następnie

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

dla mnie działa najlepiej.


-1

W ten sposób możesz usunąć swój zdalny oddział

git remote remove <your remote branch name>

1
Spowodowałoby to usunięcie wszystkich gałęzi zdalnego śledzenia dla tego zdalnego: jeśli masz więcej niż jeden, może to być problematyczne.
— VonC

-2

Najprostszym sposobem na to jest zdalne usunięcie oddziału, a następnie użycie:

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


14
Jestem zdezorientowany, OP nie chciał usunąć zdalnej gałęzi.
— madth3

Dobrze jest usunąć śledzone zdalne gałęzie z lokalnego repozytorium, które zostało usunięte w zdalnym repozytorium gołym.
— Marek Podyma
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.