Git pull/fetch with refspec differences
Using refspec is a convenient way to grab a remote branch and create a similar one but with given name (or the other way round: create a remote one with a given name different from the local one). I'm puzzled about one tiny thing - as pull will also do the merge with current branch I would expect different behavior from:
git fetch origin master:mymas开发者_如何学Goter
and from
git pull origin master:mymaster
Both of the above commands seem to produce exactly same result - that is a local branch called mymaster, same as origin/master. Am I right or is there a vague difference between the two?
Finally, using a refspec will create a local branch not a tracking branch, right? Since tracking branches are pushed automagically when one invokes git push without any arguments AFAIK
A refspec is just a source/destination pair. Using a refspec x:y
with fetch
tells git to make a branch in this repo named "y" that is a copy of the branch named "x" in the remote repo. Nothing else.
With pull
, git throws a merge on top. First, a fetch is done using the given refspec, and then the destination branch is merged into the current branch. If that's confusing, here's a step-by-step:
git pull origin master:mymaster
- Go to origin and get branch "master"
- Make a copy of it locally named "mymaster"
- Merge "mymaster" into the current branch
Fully qualified, that would be refs/heads/mymaster
and refs/heads/master
. For comparison, the default refspec set up by git on a clone is +refs/heads/*:refs/remotes/origin/*
. refs/remotes
makes a convenient namespace for keeping remote branches separate from local ones. What you're doing is telling git to put a remote-tracking branch in the same namespace as your local branches.
As for "tracking branches", that's just an entry in your config file telling git where to pull and push a local branch to/from by default.
git fetch origin master:mymaster
updates branch mymaster in the local repository by fetching from the master branch of the remote repository.
git pull origin master:mymaster
does above and merges it into the current branch.
git fetch origin master:mymaster
However, the command must meet the following two conditions strictly:
The local current branch cannot be mymaster.
The local mymaster branch is the ancestor of origin/master.
then will make fast-forward merge. Otherwise it will report a fatal.
When both of the above conditions are true, execute the command:
git pull origin master:mymaster
In addition to executing the command:
git fetch origin master:mymaster
Will also execute:
git merge FETCH_HEAD
Notice:not git merge mymaster
FETCH_HEAD is different from mymaster, because mymaster maybe already fast-forward merge.
I had used smartgit to create branch, so might be at that branch doesn't properly merged into master. Created support branch for release ie support/4.2, tag automatically get created but now wehn I try to do git pull, it shows me same error. As support/4.2 brannch is created in github but not properly merged in local. So I have used this :- git pull origin master:mymaster
In my case - git pull origin support/4.2:support/4.2
It works :)
精彩评论