How to set default remote in git?

There is no default remote, each branch can track a specific branch from a remote repo.

If you have created the branch using git checkout -b <branch-name> where <branch-name> is the name of a remote branch then the new branch tracks that branch (from whatever remote hosts it).

If you created the branch locally then used git push --set-upstream <remote-name> <branch-name> then the local branch <branch-name> tracks the remote branch <remote-name>/<branch-name>.

You can always use git branch --set-upstream-to to change the remote branch that is tracked by the current branch or git branch --unset-upstream to tell it to not track any remote branch.


In addition to the response above that describes how to set the remote repository for an existing branch in your local copy, I felt it would be worthwhile to expand on this, by noting that while a default remote cannot be setup for git pull, a default remote can be set for git checkout in your repository using the checkout.defaultRemote setting. This way, git checkout some-branch, git push, and git pull will all Just Work™ the way you intended, without specifying or thinking about the remote name at all. Read on for a full explanation.

Note to OP: In my examples below I'm going to use the remote name origin instead of your specific remote named black because for most people, the default origin remote is the one you'd want to setup like this. For your purposes though, just replace any instance of origin with black.

Simplify your branch checkout process:

First, you'd type the following in the console:

git config checkout.defaultRemote origin

This command adds the following section to your repository's .git/config file:

[checkout]
     defaultRemote = origin

Now, with a default branch configured, each time you want to setup a new local copy of a remote branch that exists on the "origin" remote repository, you only need to type:

git checkout some-branch

And git will assume you actually meant:

git checkout --track origin/some-branch

Which can also be shortened to:

git checkout -u origin/some-branch

This is an amazing lifehack. It is a much smarter alternative method of setting up a local copy than the solution mentioned above with git checkout -b some-branch and is so very useful when you actually know that the branch already exists on one or more remotes. Particularly, if you're working with multiple remotes and not using defaultRemote, you would need to type the long form git checkout --track origin/branch-name each time you checkout a branch, because git doesn't know from which remote it should track. Save yourself a headache and just set this up always. (See final thoughts below for a suggested approach).

Simplify your git push and git pull process:

As hinted at above, having your local branches auto-configured to track from the defaultRemote means that when you need to do a git pull while on some branch you checked out, git already knows exactly which remote to pull from. This is very, very helpful.

Note: if the local branch tracks one remote and you want to pull code from a different remote, or if the local branch is not setup to track a remote at all, then you can either:

  • manually specify the correct remote to pull from:

      git pull <remote-name>
    

    This must be done each time you want to pull from the remote.

  • fix the remote tracking branch permanently on a branch-by-branch basis using:

      git branch --set-upstream-to <remote-name/branch-name>
    

    OR

      git config branch.<branch-name>.remote <remote-name>
      git config branch.<branch-name>.merge refs/heads/<branch-name>
    

    This is a one-time change; all subsequent git pull commands should now pull from the remote/branch you specified.

Caveats and implications:

For git config checkout.defaultRemote origin to be of any real benefit for a git pull command scenario, this command/configuration needs to be set up when you first start working on a project with multiple remotes, or as soon as you start adding additional remotes. The reason is because this configuration will only have an effect on branches you're going to check out after having set this configuration; it doesn't have any effect on existing branches. In which case, all existing local branches that don't already track from a specific remote will need to be modified separately to add the intended remote before a simple git pull will work.

Final thoughts

If you find yourself hitting this issue often on various projects, a more comprehensive setting would be to work under the convention that the default remote should always be added as the "origin" remote in all your projects. You can then set this configuration globally with:

git config --global checkout.defaultRemote origin

To automate the process for this branch :

git config branch.<your-branch>.remote black