672

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

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

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

如果我git push origin :the_branch稍后运行,它只会传播吗?

4

11 回答 11

902

正如Yoshua Wuyts回答中提到的,使用git branch

git branch --unset-upstream

其他选项:

您不必删除本地分支。

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

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

-r, --remotes告诉 git 删除远程跟踪分支(即删除分支集以跟踪远程分支)。这不会删除远程仓库上的分支

请参阅“很难理解 git-fetch

没有本地跟踪分支的概念,只有远程跟踪分支。repo中的远程跟踪分支也是
如此origin/mastermasterorigin

正如Dobes Vandermeer回答中提到的,您还需要重置与本地分支关联的配置:

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

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

(git 1.8+,2012 年 10 月,由Carlos Martín Nieto提交 b84869e ( )carlosmn

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

于 2010-06-15T15:11:39.713 回答
241

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

$ git branch --unset-upstream

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

来源

于 2015-03-16T15:07:24.183 回答
109

要删除本地和远程分支之间的关联,请运行:

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

如果您不需要它,可以选择在之后删除本地分支:

git branch -d <branch>

这不会删除远程分支。

于 2010-07-30T23:14:44.683 回答
40

最简单的方法是编辑.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

于 2011-11-08T07:28:49.040 回答
14

您可以使用删除远程跟踪分支

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

正如上面提到的VonC。但是,如果您保留分支的本地副本,git push 仍会尝试推送该分支(这可能会给您带来非快进错误,就像对 ruffin 所做的那样)。这是因为配置push.default默认为matching这意味着:

匹配 - 推送所有匹配的分支。在两端具有相同名称的所有分支都被认为是匹配的。这是默认设置。

(见http://git-scm.com/docs/git-configpush.default

当您删除远程跟踪分支时,这可能不是您想要的,您可以设置push.defaultupstream(或者tracking如果您有 git < 1.7.4.3)

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

使用

git config push.default upstream

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

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

于 2012-06-08T18:22:45.213 回答
7

本地跟踪分支

如果您正在谈论配置为-to 和-from 上游 [远程分支] 的本地分支(例如main, ) ,那么您可以使用以下命令禁用它:devpushpull

❯ git branch --unset-upstream <LOCALBRANCH>

例如:

❯ git branch --unset-upstream dev
❯ git branch --unset-upstream feature-x

远程跟踪分支

如果您正在谈论出现在您(和 目录)中的名称分支<REMOTE>/<BRANCH>(例如origin/main, ),向您显示远程分支的状态,那么您可以通过覆盖当前来停止“跟踪”(更新)它具有您自己的新自定义列表的远程跟踪分支列表:origin/devgit log.git/refs/remotes/<REMOTE>/

❯ git remote set-branches <REMOTE> [<REMOTE-BRANCH> …]

如果另外,您不想再在您的git log(和.git/refs/remotes/<REMOTE>/目录)中看到那些远程跟踪分支,那么您可以使用以下命令删除它们:

❯ git branch --delete --remotes -- <REMOTE>/<BRANCH>
Deleted remote-tracking branch <REMOTE>/<BRANCH> (was 1f1a655).

例如:

# keep tracking `origin/main`, and `origin/dev`,
# untrack all other `origin/*` remote branches
❯ git remote set-branches origin main dev

# delete remote branches previously tracked, from the
# `.git/refs/remotes/<REMOTE>/` directory
❯ git branch --delete --remotes -- origin/feature-x origin/feature-y
❯ git branch --delete --remotes -- origin/hotfix-z

陈旧的远程分支

最后,如果已经从远程存储库本身中删除了远程分支(已经过时),并且您想要更新本地存储库以反映这一点,那么您可以通过删除(修剪)它们:

# automatically
❯ git remote prune <REMOTE>
Pruning <REMOTE>
URL: <REMOTEURL>
 * [pruned] <REMOTE>/<BRANCH>

...或者

# manually
❯ git branch --delete --remotes -- <REMOTE>/<BRANCH>
Deleted remote-tracking branch <REMOTE>/<BRANCH> (was 1f1a655).

附言

您可以通过以下方式检查跟踪状态:

❯ git remote show <REMOTE>

例如:

❯ git remote show origin
* remote origin
  Fetch URL: /Users/johndoe/bare-remote
  Push  URL: /Users/johndoe/bare-remote
  HEAD branch: ant
  Remote branches:
    brooms  tracked
    bull    tracked
    cat     tracked
    deer    tracked
    dog     tracked
    foxy    tracked
    john    tracked
    master  tracked
    new     tracked
    tim     tracked
    timothy tracked
  Local branches configured for 'git pull':
    ant    merges with remote ant
    master merges with remote master
  Local refs configured for 'git push':
    ant    pushes to ant    (up to date)
    master pushes to master (up to date)

  • 混帐远程(1):

    set-branches:更改命名远程跟踪的分支列表。这可用于在远程初始设置后跟踪可用远程分支的子集。

    prune:删除与 关联的过时引用。默认情况下,旧的远程跟踪分支会被删除,但根据全局配置和远程配置,我们甚至可能会修剪尚未推送到那里的本地标签。

    show: 提供有关遥控器的一些信息。

  • git 分支(1):

    --unset-upstream: 删除 的上游信息。

    --delete: 删除一个分支。

    --remotes:列出或删除(如果与 -d 一起使用)远程跟踪分支。

于 2021-09-25T15:25:47.167 回答
4

这是一个删除所有匹配模式的远程跟踪分支的单行代码:

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

于 2016-06-01T10:17:40.463 回答
1

这不是问题的答案,但我无法弄清楚如何在上面的评论中获得体面的代码格式......所以我的评论是自动降低声誉。

我在我的 .gitconfig 中的一个花哨的 shmancy [别名] 条目中有 @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
于 2014-06-04T15:07:26.180 回答
0

最简单的方法是远程删除分支,然后使用:

git fetch --prune(又名 git fetch -p)

于 2013-05-09T17:36:27.727 回答
-1

git branch --unset-upstream停止跟踪所有本地分支,这是不可取的。

从文件中删除该[branch "branch-name"]部分,然后.git/config

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

对我来说是最好的。

于 2018-12-03T15:23:49.197 回答
-4

您可以使用这种方式删除您的远程分支

git remote remove <your remote branch name>
于 2019-07-11T07:46:36.907 回答