Git pull a certain branch from GitHub
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!
Simply track your remote branches explicitly and a simple git pull
will do just what you want:
git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name
The latter is a local operation.
Or even more fitting in with the GitHub documentation on forking:
git branch -f new_local_branch_name upstream/remote_branch_name
You could pull a branch to a branch with the following commands.
git pull {repo} {remotebranchname}:{localbranchname}
git pull origin xyz:xyz
When you are on the master branch you also could first checkout a branch like:
git checkout -b xyz
This creates a new branch, "xyz", from the master and directly checks it out.
Then you do:
git pull origin xyz
This pulls the new branch to your local xyz
branch.
The best way is:
git checkout -b <new_branch> <remote repo name>/<new_branch>
git fetch
will grab the latest list of branches.
Now you can git checkout MyNewBranch
Done :)
For more info see docs: git fetch