Dealing With Multiple Git Heads locally and on the server
I'm using Linonde to host my git repos and also the actual site files.
git branch -r looks like this:
company/master
company/stage
origin/HEAD -> origin/master
origin/master
prod/master
git branch looks like this:
mast开发者_如何学运维er
stage
I think I'm trying to simply have my local stage branch point to my company/master head. When I do a git push company stage
it seems to update my stage head on the server but I'm trying to get it to update the master head which is where my site seems to serve it's files from. Or I need to figure out how to point my site to the company/stage head.
I tried deleting my branch and making one with
git branch stage company/master
as I thought the start-point might be what I needed.
Put when I try to push after that I get the message:
error: failed to push some refs to 'root@foo:~repos/project_name'
To Prevent you from losing history, non-fasst-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.)
I tried a git pull
but it said everything was up to date and I couldn't see anything in the fast forward help docs addressing my situation.
Firstly, it's worth explaining what happens when you do:
git push company stage
The last parameter there is a really a refspec, which defines a mapping between a source ref and a destination ref - in the simple cases you're likely to be dealing with, these "refs" are branch names. If there's no :
in the refspec, then it's assumed that you want to push to a branch of the same name. So, the command you've run is equivalent to:
git push company stage:stage
If, instead, you want to update the master
branch in the company
repository, then you need to do:
git push company stage:master
Moving on, when you deleted your branch and recreated it with:
git branch stage company/master
... that creates entries in your git config that associate your local branch stage
with the branch master
in the repository company
. ¹ That means that if you are on the branch stage
, running git pull
should do the right thing, which in this case would be to update the remote-tracking branch company/master
, and merge that into stage
.
Unfortunately (and confusingly) these config options don't (by default) affect the behaviour of git push
, which I wrote about in some detail elsewhere. You don't mention the form of the git push
command that you then used, but you should have been doing:
git push company stage:master
... if you want to update the master
branch in the company
repository with your local stage
branch. (If you just try git push company
, that will try to push every "matching" branch between your local repository and company
, where "matching" means "a branch of the same name exists locally and remotely". You can change this behaviour by setting the push.default
config option to tracking
.)
¹ In earlier versions of git you would have had to add the --track
parameter, but for a while that has been the default where the start point is a remote-tracking branch.
精彩评论