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

557

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

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

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

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

Джейсон Коэн
источник

Ответы:

709

Как уже упоминалось в Yoshua Уитс ' ответ , используя git branch:

git branch --unset-upstream

Другие опции:

Вам не нужно удалять местное отделение.

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

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

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

Смотрите " Трудно понять git-fetch "

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

Как уже упоминалось в DOBES Вэндермир «s ответ , также необходимо сбросить настройки , связанные с локальной ветви:

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

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

(мерзавец 1.8+, октябрь 2012, совершить b84869e по Карлос Мартин Ньето ( carlosmn) )

Это сделает любой push / pull совершенно неосведомленным origin/<remote branch name>.

VonC
источник
8
Удаленная ветка отслеживания воссоздается после git fetch. Можно ли исключить это?
Мэтт Р
1
@Matt: я считаю, что это можно сделать, установив remote.<name>.fetchпараметр конфигурации refspec, но я не уверен, что вы можете исключить ветку при указании refspec.
VonC
Мне тоже так показалось; Я был в состоянии перебазировать свою локальную ветвь, хотя и после перемотки вперед очевидная связь между ветвями исчезла.
Willoller
7
@ruffin: это совершенно нормально: git branch -d -r origin/<remote branch name>удалит удаленную ветку отслеживания, как объявлено локально , в вашем репо. Он не удалит ветку на самом удаленном репо (это git push :developmentсделал бы только a ). Поэтому, когда вы продвигаете свой локальный журнал developmentс историей, отличной от удаленной ветки разработки (в удаленном репо), вы все равно получите non-fast-forwardпредупреждение.
VonC
1
@ Марко правда, но я все равно предпочитаю делать это, я нахожу это "чище".
VonC
200

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

$ git branch --unset-upstream

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

источник

Йошуа Вуйц
источник
20
Должен был быть выбранный ответ.
Кайзер
9
Если вы не хотите удалять текущую ветку, просто:git branch --unset-upstream [branchname]
Соната
2
Похоже, это новое. Немного больше информации было бы неплохо. Например, версия введения.
ManuelSchneid3r
Конечно, не стесняйтесь отвечать, когда узнаете, и я с удовольствием
обновлю
Хм, я получаю fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. после этого и пробую git pull origin / master
information_interchange
106

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

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

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

git branch -d <branch>

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

Добес Вандермер
источник
11
git branch -d <branch>это не требуется , чтобы удалить связь.
Марко
1
Я использую JIRA. Когда я снова потяну, появится ветка. Как я могу предотвратить это?
powder366
1
@ Marco Правильно, но если вы используете, git branch -vvвы все равно увидите старые ветви, пока не сделаете git branch -d <branch>.
SeldomNeedy
@ powder366 В зависимости от ваших настроек git pullможет захватить все удаленные ветки и заново добавить все, что, по его мнению, «появилось» на пульте. Вы можете изменить это поведение "тянуть все ветви", выполнив git config [--global] push.default simpleили git config [--global] push.default current. Подробнее push.defaultздесь .
SeldomNeedy
1
@SeldomNeedy Я думаю, что вы можете упустить точку DVCS? Дело в том, что у меня может быть ветвь, которая начинает отслеживать восходящую ветвь, но я отсоединяюсь, чтобы следовать подходу, который не использует восходящая ветвь. В этом случае ветвь не является ни "старой" (потому что я все еще развиваюсь на ней), ни "неиспользованной" (потому что я ее использую). Это большая часть дизайна DVCS. Имеет ли это смысл?
Марко
33

Самый простой способ - отредактировать .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ветки

Джейкоб Подземные воды
источник
3
+1 Я не могу однозначно сказать, что это самый простой метод, но он, безусловно, окажется самым легким для меня для понимания (и, надеюсь, для этого запоминающимся)!
Мудрец
Хорошее решение +1. Это на самом деле место, где отслеживание зарегистрировано, легко изменить, ясно, что он делает. Командная строка .git/configтоже доступна.
Хакре
5
Кстати, это то же самое, что решение "git config --unset" от Dobes Vandermeer. "git config" редактирует этот файл.
JZ
10

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

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если у вас есть мерзавец <1.7.4.3)

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

с помощью

git config push.default upstream

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

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

CletusW
источник
3

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

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

infomaniac
источник
Если только удаленные трекинг-ветки должны быть отслежены (удалены), то я думаю, что это более короткая однострочная альтернатива:git branch -r -D $(git branch -r | grep -v "master")
dma_k
1

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

У меня есть рецепт, добавленный @Dobes в причудливую запись shmancy [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
qneill
источник
1
+1. Хороший псевдоним, в дополнение к моему ответу выше .
VonC
-1

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

Удалить [branch "branch-name"]раздел из .git/configфайла с последующим

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

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

боб
источник
-1

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

git remote remove <your remote branch name>
Подвешенный
источник
1
Это приведет к удалению всех удаленных веток отслеживания для этого пульта: если у вас их несколько, это может быть проблематично.
VonC
-2

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

git fetch --prune (также известный как git fetch -p)

Марк Каудилл
источник
14
Я в замешательстве, ОП не хотел удалять удаленную ветку.
madth3
Это хорошо для очистки отслеженных удаленных веток из вашего локального репозитория, который был удален в удаленном пустом хранилище.
Марек Подыма