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 loca开发者_运维百科l repo?
The answer to Push branches to Git gives me the error "! [rejected]" and mentions "non fast forward".
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
A safe approach is to create a local branch (i.e. xyz) first and then pull the remote branch into your locals.
# create a local branch
git checkout -b xyz
# make sure you are on the newly created branch
git branch
# finally pull the remote branch to your local branch
git pull origin xyz
Here is the syntax that could pull a remote branch to a local branch.
git pull {repo} {remotebranchname}:{localbranchname}
git pull origin xyz:xyz
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
I am not sure I fully understand the problem, but pulling an existing branch is done like this (at least it works for me :)
git pull origin BRANCH
This is assuming that your local branch is created off of the origin/BRANCH.
Simply put, If you want to pull from GitHub the branch the-branch-I-want
:
git fetch origin
git branch -f the-branch-I-want origin/the-branch-I-want
git checkout the-branch-I-want
This helped me to get remote branch before merging it into other:
git fetch repo xyz:xyz
git checkout xyz
for pulling the branch from GitHub you can use
git checkout --track origin/the-branch-name
Make sure that the branch name is exactly the same.
I did
git branch -f new_local_branch_name origin/remote_branch_name
Instead of
git branch -f new_local_branch_name upstream/remote_branch_name
As suggested by @innaM.
When I used the upstream version, it said 'fatal: Not a valid object name: 'upstream/remote_branch_name''. I did not do git fetch origin
as a comment suggested, but instead simply replaced upstream
with origin
. I guess they are equivalent.
git pull <gitreponame> <branchname>
Usually if you have only repo assigned to your code then the gitreponame would be origin.
If you are working on two repo's like one is local and another one for remote like you can check repo's list from git remote -v. this shows how many repo's are assigned to your current code.
BranchName should exists into corresponding gitreponame.
you can use following two commands to add or remove repo's
git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
you may also do
git pull -r origin master
fix merge conflicts if any
git rebase --continue
-r is for rebase. This will make you branch structure from
v master
o-o-o-o-o
\o-o-o
^ other branch
to
v master
o-o-o-o-o-o-o-o
^ other branch
This will lead to a cleaner history. Note: In case you have already pushed your other-branch to origin( or any other remote), you may have to force push your branch after rebase.
git push -f origin other-branch
you can try with
git branch -a
or git fetch
to get latest list of branches.
git checkout theBranch
//go in to the branch
git checkout -b "yourNewBranch"
// to work in your own branch in base "theBranch"
These work for me.
- To pull a specific remote branch to the current local branch you are in.
(Where
<remote_repo>
is the remote repository and<remote_branch>
is the specific remote branch you want to pull)
git pull <remote_repo> <remote_branch>
e.g.
git pull origin remote_master
- To pull a specific remote branch to a specific local branch.
(Where
<local_branch>
is the specific local branch you want to pull into)
git pull <remote_repo> <remote_branch>:<local_branch>
e.g.
git pull origin remote_master:local_master
A simple solution to get new branch from remote to local
fetching the remote branch
git fetch xyz
switch to that branch locally
git switch xyz
finally, check if xyz appears on your local branches by running
git branch
The Local User Needs to Update Both the Master Branch and the XYZ Branches Separately
None of these posts answers the original question!
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".
If you want to merge a remote xyz
branch into a local xyz
branch, where both branches exist off a master branch in a remote and local repository, just select or "checkout" the local xyz
branch first, then do a "pull" on the same remote branch. Simple!
git checkout xyz
git pull origin xyz
But, the user got an error! That update did not work. Why?
If this is failing, it has nothing to do with the two xyz
branches on remote and local repositories not being able to merge. It sounds like the master branch on the remote repository has been changed with new commits the local repository does not have. The fast-forward message likely means that the xyz
branch on the remote repo cannot update the local repo's xyz
branch until the local repo gets all the changes added to its master branch from the remote repo first.
These could be new commits or changes the other developer added to the remote master branch, who then ran a rebase on their xyz
branch to move it to the end of those new commit HEADS in the remote master. The local repo user has no way to merge that change as its master branch is missing those new added commits at the end, so cannot update the xyz
rebase change until its local master branch on its repo is updated with a merge via a pull
, first.
So go ahead and update the local master with the remote master's updates first using a pull
, then try your xyz
branch pull
again...
git checkout master
git pull origin
git checkout xyz
git pull origin xyz
Remember, a pull
is just a fetch
then merge
from a remote repo to your local repo on whatever branch you are currently focused on.
精彩评论