views:

668

answers:

1

Find find git docs very cryptic regarding this issue. I want to do a simple thing, but it seems doing it is not simple at all.

I have the following situation:

$ git remote -v
origin  git://192.168.0.49/mnt/repos
stick   /mnt/titanium/podaci/repos

I can use git pull to fetch and merge from origin, and that works fine:

$ git pull
Already up-to-date.

I can pull from stick like this:

$ git pull stick master
Already up-to-date.

However, when I pull from stick without the master part, I get this message:

$ git pull stick
From /mnt/titanium/podaci/repos
 * [new branch]      su2009  -> stick/su2009
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = <nickname>
    branch.master.merge = <remote-ref>
    remote.<nickname>.url = <url>
    remote.<nickname>.fetch = <refspec>

See git-config(1) for details.

Some things confuse me here. What does "your configuration file" mean here? Which file should I edit, and what exactly should I type in? What's nickname in this case?

I would expect that what I'm trying to accomplish is very common, but I haven't been able to find and straight-to-the-point answer with an example.

+1  A: 

What does "your configuration file" mean here?

Your repo's configuration file, found at .git/config at the root of your repo. (There's also a per-user global config file at ~/.gitconfig, but you don't want to put repo-specific settings there.)

Which file should I edit, and what exactly should I type in?

You can use the git config program to write configuration information, instead of entering it manually. However, if you want to do it manually, just open up .git/config -- the syntax is fairly straightforward.

What's nickname in this case?

Nickname, in this case, is the name of the remote -- so "stick". You don't have to worry about the remote.* options, as those have already been set up, but you do need to set the branch.* options. These options tell Git what to merge when doing a git pull from stick.

Say you want to merge in master from stick when doing a git pull from stick. You can do so like this:

$ git config branch.master.remote stick             # Sets stick as default remote for git pull. Note that origin will no longer be the default remote for git pull!
$ git config branch.master.merge refs/heads/master  # Automatically merge in stick's master branch when doing a git pull

So now, when you do a git pull without any remote or refspec info, it'll fetch all the branches from stick, and merge in stick's master branch. Note that origin will not be the default remote anymore; to merge in origin's master branch, you'll have to use git pull origin master.

If you don't want to change the default remote to stick, you'll have to continue using git pull stick master.

mipadi
Your last sentence is crucial. I was hoping there was some way to work around that problem.
Milan Babuškov
I don't know of one off-hand -- `branch.<nickname>.remote` and `branch.<nickname>.merge` work hand-in-hand, and each branch can only have one `remote` listing.
mipadi
Well, I guess it's just the way Git works. Maybe I'll submit a feature request to developers if it ever gets on my nerves too much (which is not very likely to happen). Answer accepted.
Milan Babuškov