gitmergebranchpull

Pull a certain branch from the remote server


Say that someone created a branch xyz. How do I pull the branch xyz from the remote server (e.g. GitHub) and merge it into an existing branch xyz in my local repo?

The answer to Push branches to Git gives me the error "! [rejected]" and mentions "non fast forward".


Solution

  • But I get an error "! [rejected]" and something about "non fast forward"

    That's because Git can't merge the changes from the branches into your current master. Let's say you've checked out branch master, and you want to merge in the remote branch other-branch. When you do this:

    $ git pull origin other-branch
    

    Git is basically doing this:

    $ git fetch origin other-branch && git merge other-branch
    

    That is, a pull is just a fetch followed by a merge. However, when pull-ing, Git will only merge other-branch if it can perform a fast-forward merge. A fast-forward merge is a merge in which the head of the branch you are trying to merge into is a direct descendent of the head of the branch you want to merge. For example, if you have this history tree, then merging other-branch would result in a fast-forward merge:

    O-O-O-O-O-O
    ^         ^
    master    other-branch
    

    However, this would not be a fast-forward merge:

        v master
    O-O-O
    \
     \-O-O-O-O
             ^ other-branch
    

    To solve your problem, first fetch the remote branch:

    $ git fetch origin other-branch
    

    Then merge it into your current branch (I'll assume that's master), and fix any merge conflicts:

    $ git merge origin/other-branch
    # Fix merge conflicts, if they occur
    # Add merge conflict fixes
    $ git commit    # And commit the merge!