How do you stop tracking a remote branch in Git?
Asked Answered
G

11

801

How do you stop tracking a remote branch in Git?

I am asking to stop tracking because in my concrete case, I want to delete the local branch, but not the remote one. Deleting the local one and pushing the deletion to remote will delete the remote branch as well:

Can I just do git branch -d the_branch, and it won't get propagated when I later git push?

Will it only propagate if I were to run git push origin :the_branch later on?

Gastrolith answered 15/6, 2010 at 15:6 Comment(0)
E
1118

As mentioned in Yoshua Wuyts' answer, using git branch:

git branch --unset-upstream

Other options:

You don't have to delete your local branch.

Simply delete the local branch that is tracking the remote branch:

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

-r, --remotes tells git to delete the remote-tracking branch (i.e., delete the branch set to track the remote branch). This will not delete the branch on the remote repo!

See "Having a hard time understanding git-fetch"

there's no such concept of local tracking branches, only remote tracking branches.
So origin/master is a remote tracking branch for master in the origin repo

As mentioned in Dobes Vandermeer's answer, you also need to reset the configuration associated to the local branch:

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

Remove the upstream information for <branchname>.
If no branch is specified it defaults to the current branch.

(git 1.8+, Oct. 2012, commit b84869e by Carlos Martín Nieto (carlosmn))

That will make any push/pull completely unaware of origin/<remote branch name>.

Enduring answered 15/6, 2010 at 15:11 Comment(15)
The remote tracking branch is recreated after git fetch. Is it possible to exclude these?Ullman
@Matt: I believe this would be done by setting the remote.<name>.fetch refspec config setting, but I am not sure if you can exclude a branch when specifying a refspec.Enduring
It appeared that way to me too; I was able to rebase my local branch though and after the fast-forward the apparent connection between the branches disappeared.Sphenoid
Didn't work for me. When pushing, I'm still getting warnings about the branches I deleted. As the OP, I want to stop tracking some of the remote branches I pushed to in the past. So after git branch -d -r origin/development, when I git push I still get ! [rejected] development -> development (non-fast-forward)Kerby
@ruffin: this is completely normal: git branch -d -r origin/<remote branch name> will delete a remote tracking branch as declared locally, in your repo. It will not delete the branch on the remote repo itself (only a git push :development would do that). So when you are pushing your local development, with an history different than the remote development branch (on the remote repo), you will still get the non-fast-forward warning.Enduring
@Enduring I did this primarily to have this repository "forget" it was tracking branch no longer used (in this clone), and this does unfortunately not help.Inconvenience
@ThorbjørnRavnAndersen what git branch -a and git config -l return (in particular branch.name.remote and branch.name.merge)? Those information could be the basis of a new Stack Overflow question.Enduring
I found that the steps provided by @Dobes Vandermeer worked - the repository forgot about the branch I once visited in this clone, but did not want to work on again there.Inconvenience
@VonC: deleting the remote branch is not required to stop tracking it!Unbolt
@Unbolt true, but I prefer doing it anyway, I find it "cleaner".Enduring
Im using JIRA. When I do pull again the branch appears. How can I prevent that?Henden
@Henden not sure: that could be a question of its own.Enduring
there's no such concept of local tracking branches, only remote tracking branches. This isn't quite true--or at least it requires further explanation. Someone could say they have a "local tracking branch" and mean quite literally: "a branch which is locally-stored, and which is also a tracking branch," which would be a correct (albeit somewhat ambiguous) thing to say. So, it's better to say there's no such thing as a local-tracking branch, but there is such thing as a locally-stored remote-tracking branch, which is precisely what a remote-tracking branch is.Peoples
One should also note a locally-stored remote-tracking branch, named remote_name/branch_name (ex: origin/my_branch) is what is updated by git fetch. Note/source: I first mentioned my remarks in this comment and the one above in a GitHub comment here.Peoples
@GabrielStaples I agree. For more on remote tracking: https://mcmap.net/q/13625/-need-clarification-on-pulling-git-branches, https://mcmap.net/q/13626/-compare-files-in-git-remote-vs-local and https://mcmap.net/q/13627/-git-pull-command-output-message-meaning-into-which-branchEnduring
G
284

To remove the upstream for the current branch do:

$ git branch --unset-upstream

This is available for Git v.1.8.0 or newer. (Sources: 1.7.9 ref, 1.8.0 ref)

source

Gaiseric answered 16/3, 2015 at 15:7 Comment(5)
If you don't want to remove the current branch, simply: git branch --unset-upstream [branchname]Spillage
Sure it is, feel free to reply when you find out and I'll happily update the commentGaiseric
Hmm, I'm getting fatal: 'origin/master' does not appear to be a git repository fatal: Could not read from remote repository. after doing this and trying a git pull origin/masterAbsentee
And if you want to easily see what remote branches you're tracking, use git branch -vvGravettian
@Absentee You should do git pull origin master (space between the two, not /). git-fetch and git-pull want a URL (or its alias, e.g., origin) and a branch (e.g., master). On the other hand, git-log and git-branch want just a branch, i.e., origin/master, other_remote_repo/develop, or my_local_branch.Bradlybradman
L
115

To remove the association between the local and remote branch run:

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

Optionally delete the local branch afterwards if you don't need it:

git branch -d <branch>

This won't delete the remote branch.

Lateen answered 30/7, 2010 at 23:14 Comment(8)
git branch -d <branch> is not required to remove the association.Unbolt
Im using JIRA. When I do pull again the branch appears. How can I prevent that?Henden
@Unbolt Correct, but if you use git branch -vv you will still see the old branches until you do git branch -d <branch>.Cletuscleve
@Henden Depending on your settings, git pull may grab all remote branches and re-add any it considers to have "appeared" on remote. You can change this "pull all branches" behavior by doing git config [--global] push.default simple or git config [--global] push.default current. More on push.default here.Cletuscleve
@SeldomNeedy They are not "old" branches! They're just branches that are no longer tracking the remote ones -- which happens to be the subject of the question.Unbolt
@Unbolt would you prefer I said "(locally) disused" ? In most cases to most people, this translates as "old".Cletuscleve
@SeldomNeedy I think you might be missing the point of a DVCS? The point is that I can have a branch that starts out tracking an upstream branch, but that I detach in order to pursue an approach that the upstream branch is not using. In that case, the branch is neither "old" (because I'm still developing on it) nor "disused" (because I'm using it). This is a large part of the design of a DVCS.. Does that make sense?Unbolt
git branch -d doesn't delete the remote tracking branch (the origin/blah that appears in git log and git br -a). VonC's answer has the -r flag you need.Perlite
P
43

The simplest way is to edit .git/config

Here is an example file

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
[remote "origin"]
        url = [email protected]:repo-name
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "test1"]
        remote = origin
        merge = refs/heads/test1
[branch "master"]
        remote = origin
        merge = refs/heads/master

Delete the line merge = refs/heads/test1 in the test1 branch section

Pestilent answered 8/11, 2011 at 7:28 Comment(4)
+1 I cannot say definitively that this is the easiest method, but it certainly proves the easiest for me to understand (and hopefully therefor to remember)!Oligosaccharide
Nice solution +1. This is actually the place where the tracking is registered, easy to change, clear what it does. Commandline .git/config is available, too.Ursulina
fyi, this is the same as the "git config --unset" solution by Dobes Vandermeer. "git config" edits this file.Falk
In my case, which I am not sure anyone will have, I had the new remote branch tracking default set up, and I temporarily switched to a second remote I have set up to the same github repo that is https based instead of my normal ssh based remote because I was on a plane and ssh was not allowed. It automatically set up the remote, and then when not on the plane, I deleted the branch, but I couldn't check it out again because it said there were 2 remote tracking branches. I ended up just removing the remote until next time.Seko
B
23

Local-tracking branches

If you're talking about local branches (e.g. main, dev) that are configured to push-to and pull-from an upstream [remote branch], then you can disable that with:

❯ git branch --unset-upstream <LOCALBRANCH>

E.g.:

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

Remote-tracking branches

If you're talking about branches of the name <REMOTE>/<BRANCH> (e.g. origin/main, origin/dev) that show up in your git log (and .git/refs/remotes/<REMOTE>/ directory) showing you the state of a remote branch, then you can stop having it "tracked" (having it updated) by overwriting the current list of held remote-tracking branches with your own new custom list:

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

If additionally, you don’t want to see those remote-tracking branches anymore in your git log (and .git/refs/remotes/<REMOTE>/ directory), then you can remove them with:

❯ 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

Stale Remote branches

Finally, if there are remote branches that have been removed from the remote repository itself (have become stale), and you want to update your local repository to reflect that, then you can by deleting (pruning) them:

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

PS

You can check the state of tracking with:

❯ 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: Changes the list of branches tracked by the named remote. This can be used to track a subset of the available remote branches after the initial setup for a remote.

    prune: Deletes stale references associated with . By default, stale remote-tracking branches under are deleted, but depending on global configuration and the configuration of the remote we might even prune local tags that haven't been pushed there.

    show: Gives some information about the remote .

  • git-branch(1):

    --unset-upstream: Remove the upstream information for .

    --delete: Delete a branch.

    --remotes: List or delete (if used with -d) the remote-tracking branches.

Bumkin answered 25/9, 2021 at 15:25 Comment(2)
Is there a way to batch delete remote branches? In my case the branches aren't stale, the remote itself is stale. Doing git branch --delete --remotes -- staleremote/hotfix for each branch is tedious.Ichthyolite
as of August 2023 this is the cleanest answerKappenne
P
18

You can delete the remote-tracking branch using

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

as VonC mentions above. However, if you keep your local copy of the branch, git push will still try to push that branch (which could give you a non-fast-forward error as it did for ruffin). This is because the config push.default defaults to matching which means:

matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.

(see http://git-scm.com/docs/git-config under push.default)

Seeing as this is probably not what you wanted when you deleted the remote-tracking branch, you can set push.default to upstream (or tracking if you have git < 1.7.4.3)

upstream - push the current branch to its upstream branch.

using

git config push.default upstream

and git will stop trying to push branches that you have "stopped tracking."

Note: The simpler solution would be to just rename your local branch to something else. That would eliminate some potential for confusion, as well.

Potman answered 8/6, 2012 at 18:22 Comment(0)
B
4

Here's a one-liner to remove all remote-tracking branches matching a pattern:

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

Bolme answered 1/6, 2016 at 10:17 Comment(1)
If only remote-tracking branches are to be untracked (deleted), then I think this is shorter one-line alternative: git branch -r -D $(git branch -r | grep -v "master")Bristow
B
1

This is not an answer to the question, but I couldn't figure out how to get decent code formatting in a comment above... so auto-down-reputation-be-damned here's my comment.

I have the recipe submtted by @Dobes in a fancy shmancy [alias] entry in my .gitconfig:

# 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"

Then I can just run

$ git bruntrack branchname
Book answered 4/6, 2014 at 15:7 Comment(1)
+1. Nice alias, in addition to my answer above.Enduring
U
0

The easiest way to do this is to delete the branch remotely and then use:

git fetch --prune (aka git fetch -p)

Unhappy answered 9/5, 2013 at 17:36 Comment(3)
I'm confused, the OP did not wanted to delete the remote branch.Silva
It is good to clean tracked remote branches from your local repository which was deleted on remote bare repository.Felicitasfelicitate
--prune: Before fetching, remove any remote-tracking references that no longer exist on the remote. though not an answer to the original question asked it solved my variation of 'How do you stop tracking a remote branch in Git?': how do you stop tracking a remote branch in git which does not exist on remote anymore.Toffic
E
-1

git branch --unset-upstream stops tracking all the local branches, which is not desirable.

Remove the [branch "branch-name"] section from the .git/config file followed by

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

works out the best for me.

Ewing answered 3/12, 2018 at 15:23 Comment(0)
S
-4

You can use this way to remove your remote branch

git remote remove <your remote branch name>
Suggestibility answered 11/7, 2019 at 7:46 Comment(1)
That would remove all remote tracking branches for that remote: il you have more than one, that could be problematic.Enduring

© 2022 - 2024 — McMap. All rights reserved.