【发布时间】:2011-03-04 01:13:51
【问题描述】:
如何停止跟踪Git 中的远程分支?
我要求停止跟踪,因为在我的具体情况下,我想删除本地分支,而不是远程分支。删除本地分支并将删除推送到远程也会删除远程分支:
我可以只做git branch -d the_branch,当我以后git push时它不会被传播?
仅当我稍后运行git push origin :the_branch 时它才会传播吗?
【问题讨论】:
如何停止跟踪Git 中的远程分支?
我要求停止跟踪,因为在我的具体情况下,我想删除本地分支,而不是远程分支。删除本地分支并将删除推送到远程也会删除远程分支:
我可以只做git branch -d the_branch,当我以后git push时它不会被传播?
仅当我稍后运行git push origin :the_branch 时它才会传播吗?
【问题讨论】:
如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/master是master在originrepo 中的一个远程跟踪分支
正如Dobes Vandermeer的answer中提到的,您还需要重置与本地分支关联的配置:
git config --unset branch.<branch>.remote
git config --unset branch.<branch>.merge
删除
<branchname>的上游信息。
如果没有指定分支,则默认为当前分支。
(git 1.8+,2012 年 10 月,commit b84869eCarlos Martín Nieto (carlosmn))
这将使任何推/拉完全不知道origin/<remote branch name>。
【讨论】:
remote.<name>.fetch refspec 配置设置来完成,但我不确定在指定 refspec 时是否可以排除分支。
git branch -d -r origin/<remote branch name> 将删除一个远程跟踪分支,如在您的仓库中声明的 本地。它不会删除远程仓库本身的分支(只有git push :development 会这样做)。因此,当您推送本地 development,其历史记录不同于远程开发分支(在远程 repo 上)时,您仍然会收到 non-fast-forward 警告。
【讨论】:
git branch --unset-upstream [branchname]
fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository.
要删除本地和远程分支之间的关联运行:
git config --unset branch.<local-branch-name>.remote
git config --unset branch.<local-branch-name>.merge
如果您不需要,可以选择在之后删除本地分支:
git branch -d <branch>
这不会删除远程分支。
【讨论】:
git branch -d <branch> 不需要删除关联。
git branch -vv,您仍然会看到旧分支,直到您使用 git branch -d <branch>。
git pull 可能会抓取 所有 个远程分支并重新添加它认为“出现”在远程的任何分支。您可以通过执行git config [--global] push.default simple 或git config [--global] push.default current 来更改此“拉所有分支”行为。 More on push.default here.
最简单的方法是编辑.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/config 也可用。
您可以使用删除远程跟踪分支
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 将停止尝试推送您“停止跟踪”的分支。
注意:更简单的解决方案是将本地分支重命名为其他名称。这也将消除一些混乱的可能性。
【讨论】:
这是一个删除所有匹配模式的远程跟踪分支的单行代码:
git branch -rd $(git branch -a | grep '{pattern}' | cut -d'/' -f2-10 | xargs)
【讨论】:
git branch -r -D $(git branch -r | grep -v "master")
如果您谈论的是配置为来自上游 [远程分支] 的 push-to 和 pull- 的本地分支(例如 main、dev),那么您可以使用以下命令禁用它:
❯ git branch --unset-upstream <LOCALBRANCH>
例如:
❯ git branch --unset-upstream dev
❯ git branch --unset-upstream feature-x
如果您谈论的是名称为 <REMOTE>/<BRANCH>(例如 origin/main、origin/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).
您可以通过以下方式检查跟踪状态:
❯ 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 一起使用)远程跟踪分支。
【讨论】:
这不是问题的答案,但我无法弄清楚如何在上面的评论中获得体面的代码格式......所以我的评论是自动降低声誉。
我在我的 .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
【讨论】:
最简单的方法是远程删除分支,然后使用:
git fetch --prune(又名 git fetch -p)
【讨论】:
--prune: Before fetching, remove any remote-tracking references that no longer exist on the remote. 虽然不是对原始问题的回答,但它解决了我的“如何停止在 Git 中跟踪远程分支?”的变体:如何停止在 git 中跟踪远程分支不再存在于远程。
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>
【讨论】: