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

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

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

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

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

320257 次浏览

约书亚·乌伊茨'回答中所述,使用git branch

git branch --unset-upstream

其他选项:

您不必删除本地分支。

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

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

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

查看“很难理解git-get

没有本地跟踪分支的概念,只有远程跟踪分支。
所以origin/masterorigin存储库中master的远程跟踪分支

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

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

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

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

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

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

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

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

git branch -d <branch>

这不会删除远程分支。

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

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

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

正如VonC上面提到的。但是,如果您保留分支的本地副本git push还是会试图推动那个分支(这可能会给你一个非快进错误就像对Ruffin一样)。这是因为配置push.default默认为matching,这意味着:

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

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

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

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

使用

git config push.default upstream

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

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

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

git获取--prune(又名git获取-p)

这不是这个问题的答案,但是我不知道如何在上面的评论中获得像样的代码格式…所以自动下降-声誉该死,这是我的评论。

我有@Dobes在我的. gitconfig中的一个花哨的shmancy[别名]条目中提供的食谱:

# 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

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

$ git branch --unset-upstream

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

以下是删除与模式匹配的所有远程跟踪分支的一行代码:

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

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

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

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

对我来说是最好的。

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

git remote remove <your remote branch name>

本地跟踪分支

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

❯ git branch --unset-upstream <LOCALBRANCH>

例如:

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

远程跟踪分支

如果您正在谈论名称<REMOTE>/<BRANCH>(例如origin/mainorigin/dev)的分支,这些分支显示在您的git 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).

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分支(1):

    --unset-upstream: 删除.

    的上游信息

    --delete: 删除一个分支。

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