128

TL;DR: I have a "tracked" branch that I can't pull.

So here I am in "bucket-4":

$ git branch -v
  bucket-1       410f7b5 * gh-53 * gh-48 * "Share App"
  bucket-2       7ed70a2 * upgrade to SOLR 3.3.0
  bucket-3       400ffe4 * emergency fix prod issue
* bucket-4       64c2414 Merge branch 'bucket-3' into bucket-4
  master         8dc4854 [ahead 1] * gh-73

I'd like to pull in changes from my remote:

$ git pull

You asked me to pull without telling me which branch you
want to merge with, and 'branch.bucket-4.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "bucket-4"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Hmm, odd, I thought I already added "bucket-4" as a tracking branch. Let's see:

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:abcd/main.git
  Push  URL: git@github.com:abcd/main.git
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    bucket-3
    master
  Remote branches:
    bucket-1       tracked
    bucket-2       tracked
    bucket-3       tracked
    bucket-4       tracked
    master         tracked
  Local branches configured for 'git pull':
    bucket-1       merges with remote bucket-1
    bucket-2       merges with remote bucket-2
    bucket-3       merges with remote bucket-3
    master         merges with remote master
  Local refs configured for 'git push':
    bucket-1       pushes to bucket-1       (up to date)
    bucket-2       pushes to bucket-2       (up to date)
    bucket-3       pushes to bucket-3       (up to date)
    bucket-4       pushes to bucket-4       (local out of date)
    master         pushes to master         (fast-forwardable)

Indeed, bucket-4 is marked as "tracked", yet somehow it's configured for push, but not pull.

Looking at my .git/config file, I see that I have "remote" and "merge" entries for most of my branches, but not for bucket-4. How is it even considered "tracked" without this?

[remote "origin"]
    url = git@github.com:abcd/main.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "rel-2011-07-07"]
    remote = origin
    merge = refs/heads/rel-2011-07-07
[branch "bucket-1"]
    remote = origin
    merge = refs/heads/bucket-1
[branch "bucket-2"]
    remote = origin
    merge = refs/heads/bucket-2
[branch]
    autosetupmerge = true
[branch "bucket-3"]
    remote = origin
    merge = refs/heads/bucket-3

I see that the likely solution here is to add remote/merge entries for bucket-4 in my config file. But how is it considered "tracked" without this? bucket-4 was created locally, then pushed to the server from this repo, so I suspect that somehow I didn't set up tracking properly for this branch.

Is there some configuration I can add in order to make all local branches track their remotes properly in the future?

Mohammed H
  • 6,880
  • 16
  • 81
  • 127
George Armhold
  • 30,824
  • 50
  • 153
  • 232
  • 2
    This question pointed me in the right direction, I just had to add an entry in my .git/config file for the branch I was trying to pull then it worked fine. – Mr. Bungle Jul 26 '12 at 10:58
  • Yup me too, and the way to do that is as Mark Longair described below with git branch --set-upstream bucket-4 origin/bucket-4 – Jonathon Horsman Jul 18 '13 at 11:44

2 Answers2

193

It says bucket-4 pushes to bucket-4 just because the default when pushing a branch is to push it to one with a matching name on the remote. (Note that this is still the default, even if the local branch is tracking a remote-tracking branch and the remote-tracking branch corresponds to a branch with a different name in the remote repository.)

The simplest way to set up the association between your bucket-4 and bucket-4 in origin is to make sure that the next time you push, you do:

git push -u origin bucket-4

Alternatively, you can do:

git branch --set-upstream-to origin/bucket-4

To answer a couple of your questions directly:

How is it even considered "tracked" without this?

In this case it isn't - it's not tracking the remote-tracking branch in any sense if there's no branch.bucket-4.merge or branch.bucket-4.remote in your git config. The output from git remote show origin is just showing you where the branch would be pushed by default.

Is there some configuration I can add in order to make all local branches track their remotes properly in the future?

I don't think that there is. When you created bucket-4 locally, as I assume happened, the remote-tracking branch didn't exist, so it can't be set up at that point - it would be very confusing default behaviour. You just need to remember to add -u to your first git push of that branch to its upstream repository.

I hope that's of some help.

Mark Longair
  • 446,582
  • 72
  • 411
  • 327
  • 7
    `git branch --set-upstream` worked perfectly for me before doing the pull – ohaal Oct 30 '12 at 21:21
  • git branch --set-upstream bucket-4 origin/bucket-4 worked for me :-) – Aliza Dec 24 '13 at 12:22
  • What if you don't want to push? I have this same problem but I do not want to push from the repo that this problem occurs on. I just switched remote origins and I want to pull down the latest HEAD for the branch that is apparently no longer tracked (even though it was tracked before I switched remote origin). In the end I deleted the problematic clone and re-cloned from the new origin. – geoidesic Dec 24 '15 at 08:35
  • 1
    Actually when trying `git --set-upstream origin/` you get an error as the flag is deprecated. It is recomended to use `git branch --track origin/` or `--set-upstream-to` as the second answer suggested. I guess the answer could be updated, @MarkLongair ? – AymDev Sep 22 '18 at 08:57
  • Thanks for the suggestion, @AymDev - I've made that change. – Mark Longair Sep 28 '18 at 12:04
6

git branch --set-upstream <branch> origin/<branch> was deprecated at least as of 1.8.2.3 (my version).

Use git branch --set-upstream-to=origin/<branch> <branch> instead.

d_roge
  • 61
  • 1
  • 1
  • 3
    Did you mean for this to be a comment on [Mark's answer](http://stackoverflow.com/a/7388440/456814)? Also, it was actually deprecated in [Git version 1.8.0](https://github.com/git/git/blob/v2.0.4/Documentation/RelNotes/1.8.0.txt#L42-L47). –  Aug 06 '14 at 18:33