Git: which is the default configured remote for branch?

123.6k views Asked by At

I have a remote bare repository hub. I work only in the master branch. The last sentence of this error message below makes me wonder: How do I find out which is the "default configured remote for your current branch"? And how do I set it?

[myserver]~/progs $ git remote -v
hub     ~/sitehub/progs.git/ (fetch)
hub     ~/sitehub/progs.git/ (push)

[myserver]~/progs $ git branch -r
  hub/master

[myserver]~/progs $ cat .git/HEAD
ref: refs/heads/master

[myserver]~/progs $ git pull hub
You asked to pull from the remote 'hub', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.
7

There are 7 answers

6
scragz On BEST ANSWER

Track the remote branch

You can specify the default remote repository for pushing and pulling using git-branch’s track option. You’d normally do this by specifying the --track option when creating your local master branch, but as it already exists we’ll just update the config manually like so:

Edit your .git/config

[branch "master"]
  remote = origin
  merge = refs/heads/master

Now you can simply git push and git pull.

[source]

7
urschrei On

You can do it more simply, guaranteeing that your .gitconfig is left in a meaningful state:

Using Git version v1.8.0 and above

git push -u hub master when pushing, or:
git branch -u hub/master

OR

(This will set the remote for the currently checked-out branch to hub/master)
git branch --set-upstream-to hub/master

OR

(This will set the remote for the branch named branch_name to hub/master)
git branch branch_name --set-upstream-to hub/master

If you're using v1.7.x or earlier

you must use --set-upstream:
git branch --set-upstream master hub/master

0
leonbloy On

For the sake of completeness: the previous answers tell how to set the upstream branch, but not how to see it.

There are a few ways to do this:

git branch -vv shows that info for all branches. (formatted in blue in most terminals)

cat .git/config shows this also.

For reference:

0
Gabriel Staples On

Git: which is the default configured remote for a branch?

"Get" commands

For a branch named branch_name, read it out with this:

git config branch.branch_name.remote

Examples:

# main branch
git config branch.main.remote
# master branch
git config branch.master.remote

Sample output:

origin

"Set" commands

Change the default remote for a branch like this:

# for branch "branch_name", change the default remote to "remote_name"
git config branch.branch_name.remote remote_name

# Examples:
# main -> origin
git config branch.main.remote origin
# main -> upstream
git config branch.main.remote upstream

There is no output when running the set commands just above.

See all remotes

See all of your remote names and their URLs with:

git remote -v

The -v means "verbose".

Example run and output:

wiki_copy_demo.wiki$ git remote -v
origin  [email protected]:ElectricRCAircraftGuy/wiki_copy_demo.wiki.git (fetch)
origin  [email protected]:ElectricRCAircraftGuy/wiki_copy_demo.wiki.git (push)
upstream    https://github.com/nicolargo/glances.wiki.git (fetch)
upstream    https://github.com/nicolargo/glances.wiki.git (push)

git config general details

You can programmatically read out any given branch's locally-stored remote-tracking remote name via git config branch.branch_name.remote.

Assume that you have a branch named main and its remote it tracks is set to origin. In that case, your .git/config file will contain this, among other things:

[branch "main"]
    remote = origin
    merge = refs/heads/main

Running this:

git config branch.main.remote

...will therefore read out that configuration setting and return the value of remote, which is origin.

And running this:

git config branch.main.remote upstream

...will change the value of remote from origin (its previous value) to upstream.

You can use these patterns to programmatically read or write any git config variable, even ones you invent or make up yourself.

Example: this command: git config --global blametool.editor subl adds these lines to the bottom of your global ~/.gitconfig file:

[blametool]
    editor = subl

And you can read out that variable value, subl, with: git config blametool.editor.

That's how I set a blametool for my git blametool script.

1
darkdiatel On

the command to get the effective push remote for the branch, e.g., master, is:

git config branch.master.pushRemote || git config remote.pushDefault || git config branch.master.remote

Here's why (from the "man git config" output):

branch.name.remote [...] tells git fetch and git push which remote to fetch from/push to [...] [for push] may be overridden with remote.pushDefault (for all branches) [and] for the current branch [..] further overridden by branch.name.pushRemote [...]

For some reason, "man git push" only tells about branch.name.remote (even though it has the least precedence of the three) + erroneously states that if it is not set, push defaults to origin - it does not, it's just that when you clone a repo, branch.name.remote is set to origin, but if you remove this setting, git push will fail, even though you still have the origin remote

1
Dean Householder On

The programmatic version of the answer to this question is:

git branch --list "$(git branch --show-current)" "--format=%(upstream:remotename)"

This will output just the current branch's default remote name. The --show-current option will not work before Git version 2.22.0.

0
bric3 On

This information depends on the remote, so different remote (on the same local clone) could have different default branches

$ git remote show origin | grep 'HEAD branch'  | cut -d' ' -f5
main

(Obviously repeat if necessary on any other remote origin, upstream, etc.)