Как перестать отслеживать удаленную ветку в Git? - PullRequest
477 голосов
/ 15 июня 2010

Как перестать отслеживать удаленную ветку в Git ?

Я прошу прекратить отслеживание, потому что в моем конкретном случае я хочу удалить локальную ветку, но не удаленную. Удаление локального и отправка удаления на удаленный сервер также приведет к удалению удаленной ветви:

Могу ли я просто сделать git branch -d the_branch, и это не распространится, когда я позже git push?

Будет ли он распространяться только в том случае, если я буду запускать git push origin :the_branch позже?

Ответы [ 10 ]

600 голосов
/ 15 июня 2010

Как уже упоминалось в Йошуа Вуйц ' ответ , используя git branch:

git branch --unset-upstream

Другие варианты:

Вам не нужно удалять вашу локальную ветку.

Просто удалите локальную ветку, которая отслеживает удаленную ветку:

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

-r, --remotes говорит git удалить удаленнуюотслеживание ветви (т. е. удалить ветку, установленную для отслеживания удаленной ветви).Это не удалит ветку на удаленном репо !

См. " С трудом понимая git-fetch "

нет такой концепции локальных отслеживающих ветвей, только удаленные отслеживающие ветви.
Итак, origin/master является удаленной отслеживающей ветвью для master в origin репо

Как упоминалось в ответе Dobes Vandermeer , вам также необходимо сбросить конфигурацию, связанную с local ответвлением:

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

Удалите вышестоящую информацию для <branchname>.
Если ветвь не указана, по умолчанию используется текущая ветвь.

(git 1.8+, октябрь 2012 г., commit b84869e от Карлос Мартин Ньето (carlosmn) )

Это сделает любого толчка / толчка совершенно не подозревающим о origin/<remote branch name>.

175 голосов
/ 16 марта 2015

Чтобы удалить восходящий поток для текущей ветви, выполните:

$ git branch --unset-upstream

Это доступно для Git v.1.8.0 или новее. (Источники: 1.7.9 ref , 1.8.0 ref )

источник

106 голосов
/ 31 июля 2010

Чтобы удалить связь между локальной и удаленной ветвью, выполните:

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

При необходимости удалите локальную ветку, если она вам не нужна:

git branch -d <branch>

Это не удалит удаленную ветвь.

31 голосов
/ 08 ноября 2011

Самый простой способ - отредактировать .git/config

Вот пример файла

[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

Удалить строку merge = refs/heads/test1 в секции test1 ветви

9 голосов
/ 08 июня 2012

Вы можете удалить ветку удаленного отслеживания, используя

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

как упоминалось выше VonC. Однако, если вы сохраните локальную копию ветки, git push все равно будет пытаться протолкнуть эту ветку (что может привести к ошибке не-перемотки вперед , как это было для ruffin ). Это связано с тем, что в конфигурации push.default по умолчанию установлено значение matching, что означает:

совпадение - нажать все соответствующие ветки. Все ветви, имеющие одинаковое имя на обоих концах, считаются совпадающими. Это значение по умолчанию.

(см. http://git -scm.com / docs / git-config в push.default)

Видя, что это, вероятно, не то, что вы хотели, когда вы удалили ветку удаленного отслеживания, вы можете установить push.default на upstream (или tracking, если у вас git <1.7.4.3) </p>

upstream - выдвинуть текущую ветвь в ее восходящую ветвь.

с помощью

git config push.default upstream

и git прекратит попытки выдвинуть ветки, которые вы «перестали отслеживать».

Примечание: Более простым решением было бы просто переименовать вашу локальную ветку на что-то другое. Это также исключило бы некоторую путаницу.

3 голосов
/ 01 июня 2016

Вот одна строка для удаления всех ветвей удаленного отслеживания, соответствующих шаблону:

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

1 голос
/ 04 июня 2014

Это не ответ на вопрос, но я не мог понять, как получить достойное форматирование кода в комментарии выше ... так что auto-down-reputation-будь проклят, вот мой комментарий.

У меня есть рецепт, добавленный @Dobes в причудливую запись [alias] в моем .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"

Тогда я могу просто запустить

$ git bruntrack branchname
0 голосов
/ 11 июля 2019

Вы можете использовать этот способ для удаления удаленной ветки

git remote remove <your remote branch name>
0 голосов
/ 03 декабря 2018

git branch --unset-upstream перестает отслеживать все локальные филиалы, что нежелательно.

Удалите раздел [branch "branch-name"] из файла .git/config, а затем

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

работает лучше для меня.

0 голосов
/ 09 мая 2013

Самый простой способ сделать это - удалить ветку удаленно и затем использовать:

git fetch --prune (он же git fetch -p)

...