如何在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 在他的回答中所提到,使用 git branch
命令:
git branch --unset-upstream
您不必删除本地分支。
只需删除跟踪远程分支的本地分支:
git branch -d -r origin/<remote branch name>
-r, --remotes
参数告诉git删除远程跟踪分支(即删除设置为跟踪远程分支的分支)。这个操作不会删除远程仓库上的分支!
详见"Having a hard time understanding git-fetch"
本地跟踪分支并不存在,只有远程跟踪分支。
因此,origin/master
是origin
仓库中master
分支的远程跟踪分支。
如Dobes Vandermeer在回答中所述,你还需要重置与本地分支相关联的配置。
git config --unset branch.<branch>.remote
git config --unset branch.<branch>.merge
移除
<branchname>
的上游信息。
如果没有指定分支,则默认为当前分支。
(git 1.8+,2012年10月,提交记录 b84869e 由 Carlos Martín Nieto (carlosmn
) 提交)
这将使任何 push/pull 完全不知道 origin/<remote branch name>
存在。
git branch --unset-upstream [branchname]
。请注意,这个命令不会改变你的当前分支。 - Sonatagit branch -vv
。 - Daniel要删除本地分支和远程分支之间的关联,请运行以下命令:
git config --unset branch.<local-branch-name>.remote
git config --unset branch.<local-branch-name>.merge
如果不需要该本地分支,可以选择在此之后删除它:
git branch -d <branch>
这不会删除远程分支。
git branch -d <branch>
命令。 - Marcogit branch -vv
,在执行 git branch -d <branch>
命令之前仍将看到旧分支。 - Seldom 'Where's Monica' Needygit branch -d
不会删除远程跟踪分支(在git log
和git br -a
中显示的origin/blah
)。VonC的回答中有你需要的-r
标志。 - undefined最简单的方法是编辑.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
也可用。 - hakre如果你正在谈论配置为向上游[远程分支] push
和 pull
的本地分支(例如main
,dev
),那么你可以通过以下方式禁用它:
❯ git branch --unset-upstream <LOCALBRANCH>
E.g.:
❯ 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).
E.g.:
# 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>
...or
# manually
❯ git branch --delete --remotes -- <REMOTE>/<BRANCH>
Deleted remote-tracking branch <REMOTE>/<BRANCH> (was 1f1a655).
您可以使用以下方式检查跟踪状态:
❯ git remote show <REMOTE>
E.g.:
❯ 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一起使用)远程跟踪分支。
git branch --delete --remotes -- staleremote/hotfix
是很繁琐的。 - Mark Jeronimusgit 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
(如果您使用的是git < 1.7.4.3,则为tracking
)。
使用上游-将当前分支推送到其上游分支。
git config push.default upstream
并且 Git 将停止尝试推送您已“停止跟踪”的分支。
注意:更简单的解决方案是将本地分支重命名为其他名称。这也可以消除一些混淆的可能性。
git branch -rd $(git branch -a | grep '{pattern}' | cut -d'/' -f2-10 | xargs)
请注意,此命令保留HTML标记。git branch -r -D $(git branch -r | grep -v "master")
。 - dma_k# 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)
git branch --unset-upstream
停止跟踪所有本地分支,这是不可取的。
从 .git/config
文件中删除 [branch "branch-name"]
部分,然后执行
git branch -D 'branch-name' && git branch -D -r 'origin/branch-name'
对我来说是最好的选择。
remote.<name>.fetch
refspec配置来完成,但我不确定在指定refspec时是否可以排除一个分支。 - VonCgit branch -d -r origin/<远程分支名称>
将删除在你的本地仓库中声明的远程跟踪分支。它不会删除远程仓库本身上的该分支(只有git push :development
才能做到这一点)。因此,当你推送具有与远程开发分支(在远程仓库上)不同历史记录的本地development
时,仍会收到“非快进”的警告。 - VonC