Question

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:

master
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.

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top