如何停止在Git中跟踪远程分支?


555

如何停止在Git中跟踪远程分支?

我要求停止跟踪,因为在我的具体情况下,我想删除本地分支,而不是远程分支。删除本地分支并将其推送到远程也将删除远程分支:

我可以这样做git branch -d the_branch,以后再也不会传播git push吗?

它只会在git push origin :the_branch以后运行时传播吗?

Answers:


707

Yoshua Wuyts回答所述,使用git branch

git branch --unset-upstream

其他选项:

您不必删除本地分支。

只需删除跟踪远程分支的本地分支:

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

-r, --remotes告诉git删除远程跟踪分支(即,删除设置为跟踪远程分支的分支)。这不会删除该分支上的远程回购

请参阅“ 难以理解git-fetch

没有本地跟踪分支的概念,只有远程跟踪分支。
所以origin/master是一个远程跟踪分行masterorigin回购

Dobes Vandermeer回答中所述,您还需要重置与本地分支关联的配置:

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

删除的上游信息<branchname>
如果未指定任何分支,则默认为当前分支。

(git 1.8 +,2012年10月,由CarlosMartínNieto(提交b84869ecarlosmn

这将使任何推/拉完全不知道origin/<remote branch name>


8
在git fetch之后重新创建远程跟踪分支。是否可以排除这些?
Matt R

1
@Matt:我相信可以通过设置refspec remote.<name>.fetch配置设置来完成,但是我不确定在指定refspec时是否可以排除分支。
VonC

在我看来也是如此。虽然我能够重新建立我的本地分支,但在快速前进之后,分支之间的明显联系消失了。
willoller 2010年

7
@ruffin:这是完全正常的:git branch -d -r origin/<remote branch name>将在您的仓库中删除本地声明的远程跟踪分支。它不会删除远程仓库本身上的分支(只有a git push :development可以这样做)。因此,当您推送development具有与远程开发分支(在远程仓库上)不同的历史记录的local时,您仍然会收到non-fast-forward警告。
VonC 2012年

1
@Marco是的,但是无论如何我还是喜欢这样做,我发现它“更干净”。
VonC

200

要删除当前分支的上游,请执行以下操作:

$ git branch --unset-upstream

这适用于Git v.1.8.0或更高版本。(来源:1.7.9参考1.8.0参考

资源


20
应该是选择的答案。
kaiser 2015年

9
如果您不想删除当前分支,只需:git branch --unset-upstream [branchname]
Sonata

2
看起来这是新的。多一点信息会很好。例如,版本介绍。
ManuelSchneid3r

当然可以,发现后请随时回复,我会很乐意更新评论
Yoshua Wuyts

嗯,我正在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>不是需要解除关联。
Marco Marco

1
我正在使用JIRA。当我再次拉时,出现分支。我该如何预防?
powder366 2015年

1
@Marco正确,但是如果您使用它,git branch -vv您仍然会看到旧的分支,直到您这样做为止git branch -d <branch>
SeldomNeedy

@ powder366根据您的设置,git pull可能会抢占所有远程分支并重新添加任何它认为已“出现”在远程上的分支。您可以通过执行git config [--global] push.default simple或更改此“拉所有分支”行为git config [--global] push.default currentpush.default这里更多
SeldomNeedy

1
@SeldomNeedy我认为您可能缺少DVCS的要点?关键是我可以有一个分支,该分支开始跟踪上游分支,但是我为了进行上游分支不使用的方法而分离。在那种情况下,分支既不是“旧的”(因为我仍在开发中),也不是“废弃的”(因为我正在使用它)。这是DVCS设计的很大一部分。这有意义吗?
Marco Marco

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/test1test1分支部分


3
+1我无法确切地说这是最简单的方法,但是对于我来说,它无疑是最容易理解的(希望可以记住)!
圣人

不错的解决方案+1。实际上,这是注册跟踪的地方,易于更改,清楚其作用。命令行.git/config也可用。
hakre 2013年

5
fyi,这与Dobes Vandermeer的“ git config --unset”解决方案相同。“ 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.defaultupstream(或者tracking如果git <1.7.4.3)

上游-将当前分支推到其上游分支。

使用

git config push.default upstream

并且git将停止尝试推送您已“停止跟踪”的分支。

注意:更简单的解决方案是将本地分支重命名为其他名称。这也将消除一些混淆的可能性。


3

这是删除所有匹配模式的远程跟踪分支的一线工具:

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


如果仅要取消跟踪(删除)远程跟踪分支,那么我认为这是一种较短的单行替代方法:git branch -r -D $(git branch -r | grep -v "master")
dma_k

1

这不是问题的答案,但是我无法在上面的注释中弄清楚如何获得合理的代码格式...因此,我该死的是auto-down-putation-damned。

我的.gitconfig中有一个花哨的shmancy [alias]条目,该菜单由@Dobes替换:

# 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

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
我很困惑,OP不想删除远程分支。
madth3

最好从本地裸存储库中删除已删除的远程分支的远程分支。
Marek Podyma
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.