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

Posted

技术标签:

【中文标题】你如何停止在 Git 中跟踪远程分支?【英文标题】:How do you stop tracking a remote branch in Git? 【发布时间】:2011-03-04 01:13:51 【问题描述】:

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

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

How do I delete a Git branch both locally and in GitHub?

我可以只做git branch -d the_branch,当我以后git push时它不会被传播?

仅当我稍后运行git push origin :the_branch 时它才会传播吗?

【问题讨论】:

【参考方案1】:

如Yoshua Wuyts'answer中所述,使用git branch

git branch --unset-upstream

其他选项:

您不必删除本地分支。

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

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

-r, --remotes 告诉 git 删除远程跟踪分支(即删除用于跟踪远程分支的分支集)。这个will not delete the branch on the remote repo!

见“Having a hard time understanding git-fetch”

没有本地跟踪分支的概念,只有远程跟踪分支。 所以origin/mastermasterorigin repo 中的一个远程跟踪分支

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

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

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

(git 1.8+,2012 年 10 月,commit b84869eCarlos Martín Nieto (carlosmn))

这将使任何推/拉完全不知道origin/&lt;remote branch name&gt;

【讨论】:

远程跟踪分支在 git fetch 后重新创建。可以排除这些吗? @Matt:我相信这可以通过设置remote.&lt;name&gt;.fetch refspec 配置设置来完成,但我不确定在指定 refspec 时是否可以排除分支。 @ruffin:这是完全正常的:git branch -d -r origin/&lt;remote branch name&gt; 将删除一个远程跟踪分支,如在您的仓库中声明的 本地。它不会删除远程仓库本身的分支(只有git push :development 会这样做)。因此,当您推送本地 development,其历史记录不同于远程开发分支(在远程 repo 上)时,您仍然会收到 non-fast-forward 警告。 @Marco 是的,但无论如何我更喜欢这样做,我觉得它“更干净”。 @GabrielStaples 我同意。有关远程跟踪的更多信息:***.com/a/44081446/6309、***.com/a/38202006/6309 和 ***.com/a/28341622/6309【参考方案2】:

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

$ git branch --unset-upstream

这适用于 Git v.1.8.0 或更高版本。 (来源:1.7.9 ref、1.8.0 ref)

source

【讨论】:

应该是选择的答案。 如果您不想删除当前分支,只需:git branch --unset-upstream [branchname] 看起来这是新的。多一点信息会很好。例如。介绍版本。 当然可以,发现后随时回复,我会很乐意更新评论 嗯,我在这样做并尝试 git pull origin/master 后得到fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. 【参考方案3】:

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

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

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

git branch -d <branch>

这不会删除远程分支。

【讨论】:

git branch -d &lt;branch&gt; 不需要删除关联。 我正在使用 JIRA。当我再次拉动时,分支出现了。我怎样才能防止这种情况发生? @Marco 正确,但如果您使用 git branch -vv,您仍然会看到旧分支,直到您使用 git branch -d &lt;branch&gt; @powder366 根据您的设置,git pull 可能会抓取 所有 个远程分支并重新添加它认为“出现”在远程的任何分支。您可以通过执行git config [--global] push.default simplegit config [--global] push.default current 来更改此“拉所有分支”行为。 More on push.default here. @SeldomNeedy 我认为您可能错过了 DVCS 的重点?关键是我可以有一个开始跟踪上游分支的分支,但是我为了追求上游分支没有使用的方法而分离。在这种情况下,分支既不是“旧的”(因为我仍在开发它)也不是“废弃的”(因为我正在使用它)。这是 DVCS 设计的很大一部分。这有意义吗?【参考方案4】:

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

删除test1分支部分中的merge = refs/heads/test1

【讨论】:

+1 我不能肯定地说这是最简单的方法,但它确实证明是我最容易理解的(希望因此能记住)! 不错的解决方案 +1。这实际上是跟踪注册的地方,易于更改,明确它的作用。命令行.git/config 也可用。 仅供参考,这与 Dobes Vandermeer 的“git config --unset”解决方案相同。 “git config”编辑这个文件。【参考方案5】:

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

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

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

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

(参见push.default 下的http://git-scm.com/docs/git-config)

看到这可能不是您删除远程跟踪分支时想要的,您可以将push.default 设置为upstream(或tracking,如果您有 git

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

使用

git config push.default upstream

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

如果只有远程跟踪分支不被跟踪(删除),那么我认为这是更短的单行替代方案:git branch -r -D $(git branch -r | grep -v "master")【参考方案7】:

本地跟踪分支

如果您谈论的是配置为来自上游 [远程分支] 的 push-to 和 pull- 的本地分支(例如 maindev),那么您可以使用以下命令禁用它:

❯ git branch --unset-upstream <LOCALBRANCH>

例如:

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

远程跟踪分支

如果您谈论的是名称为 &lt;REMOTE&gt;/&lt;BRANCH&gt;(例如 origin/mainorigin/dev)的分支,它们出现在您的 git log(和 .git/refs/remotes/&lt;REMOTE&gt;/ 目录)向您显示远程分支的状态,然后您可以通过用您自己的新自定义列表覆盖当前持有的远程跟踪分支列表来停止“跟踪”(更新它):

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

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

❯ 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).

PS

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

❯ 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)

git-remote(1):

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

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

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

git-branch(1):

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

--delete: 删除一个分支。

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

【讨论】:

【参考方案8】:

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

我在我的 .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

【讨论】:

+1。不错的别名,除了my answer above。【参考方案9】:

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

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

【讨论】:

我很困惑,OP 不想删除远程分支。 最好从本地存储库中清除跟踪的远程分支,这些分支已在远程裸存储库中删除。 --prune: Before fetching, remove any remote-tracking references that no longer exist on the remote. 虽然不是对原始问题的回答,但它解决了我的“如何停止在 Git 中跟踪远程分支?”的变体:如何停止在 git 中跟踪远程分支不再存在于远程。【参考方案10】:

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

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

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

最适合我。

【讨论】:

【参考方案11】:

你可以使用这种方式来移除你的远程分支

git remote remove <your remote branch name>

【讨论】:

这将删除该远程的 所有 个远程跟踪分支:如果您有多个远程跟踪分支,则可能有问题。

以上是关于你如何停止在 Git 中跟踪远程分支?的主要内容,如果未能解决你的问题,请参考以下文章

如何让新分支显示在 Eclipse Git 远程跟踪中?

通过 Git 远程跟踪分支的给定名称如何找到哪个本地分支跟踪它?

GIT-如何跟踪远程分支

如何将新的本地分支推送到远程 Git 存储库并对其进行跟踪?

git 使用

Git:在本地合并远程分支