Question:
I have a project with multiple branches. I’ve been pushing them to GitHub, and now that someone else is working on the project I need to pull their branches from GitHub. It works fine in master. But say that someone created a branch xyz
. How can I pull branch xyz
from GitHub and merge it into branch xyz
on my localhost
?
But I get an error “! [rejected]” and something about “non fast forward”.
Any suggestions?
Answer:
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:
1 2 |
$ git pull origin other-branch |
Git is basically doing this:
1 2 |
$ 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:
1 2 3 4 |
O-O-O-O-O-O ^ ^ master other-branch |
However, this would not be a fast-forward merge:
1 2 3 4 5 6 |
v master O-O-O \ \-O-O-O-O ^ other-branch |
To solve your problem, first fetch the remote branch:
1 2 |
$ git fetch origin other-branch |
Then merge it into your current branch (I’ll assume that’s master
), and fix any merge conflicts:
1 2 3 4 |
$ git merge origin/other-branch # Fix merge conflicts, if they occur # Add merge conflict fixes $ git commit # And commit the merge! |