478

Heroku has a policy of ignoring all branches but 'master'.

While I'm sure Heroku's designers have excellent reasons for this policy (I'm guessing for storage and performance optimization), the consequence to me as a developer is that whatever local topic branch I may be working on, I would like an easy way to switch Heroku's master to that local topic branch and do a "git push heroku -f" to over-write master on Heroku.

What I got from reading the "Pushing Refspecs" section of http://progit.org/book/ch9-5.html is

git push -f heroku local-topic-branch:refs/heads/master

What I'd really like is a way to set this up in the configuration file so that "git push heroku" always does the above, replacing local-topic-branch with the name of whatever my current branch happens to be. If anyone knows how to accomplish that, please let me know!

The caveat for this, of course, is that this is only sensible if I am the only one who can push to that Heroku app/repository. A test or QA team might manage such a repository to try out different candidate branches, but they would have to coordinate so that they all agree on what branch they are pushing to it on any given day.

Needless to say, it would also be a very good idea to have a separate remote repository (like GitHub) without this restriction for backing everything up to. I'd call that one "origin" and use "heroku" for Heroku so that "git push" always backs up everything to origin, and "git push heroku" pushes whatever branch I'm currently on to Heroku's master branch, overwriting it if necessary.

Would this work?

[remote "heroku"]
 url = [email protected]:my-app.git
 push = +refs/heads/*:refs/heads/master

I'd like to hear from someone more experienced before I begin to experiment, although I suppose I could create a dummy app on Heroku and experiment with that.

As for fetching, I don't really care if the Heroku repository is write-only. I still have a separate repository, like GitHub, for backup and cloning of all my work.

Footnote: This question is similar to, but not quite the same as Good Git deployment using branches strategy with Heroku?

Jonathan Hall
80.4k19 gold badges162 silver badges206 bronze badges
asked Jun 4, 2010 at 4:37
2
  • 1
    The currently most voted answer is the idiomatic way of doing this (and Imo the real correct answer) Commented Feb 7, 2017 at 0:33
  • An alternative https resource about pushing refspecs: git scm documentation about pushing refspecs. Commented Nov 9, 2018 at 19:35

13 Answers 13

1703

See https://devcenter.heroku.com/articles/git#deploying-code

$ git push heroku yourbranch:main
Raunaqss
1,33713 silver badges17 bronze badges
answered Jun 21, 2012 at 17:35
Sign up to request clarification or add additional context in comments.

6 Comments

May require a -f force.
@DaveMeehan this still works. You're trying to do git push :master which deletes the master branch by overwriting it with nothing. That's different than overwriting it with another branch. Heroku probably has safeguards in place to prevent deleting the master branch.
@nxmohamad It does not unless your branch in behind the master branch and you want to override the current code on Heroku.
looks like we need force push git push -f heroku yourbranch:master @jassa
Is there a way to do this but have the branch deploy at a different url (so it doesn't affect the production version of the site)?
|
147

When using a wildcard, it had to be present on both sides of the refspec, so +refs/heads/*:refs/heads/master will not work. But you can use +HEAD:refs/heads/master:

git config remote.heroku.push +HEAD:refs/heads/master

Also, you can do this directly with git push:

git push heroku +HEAD:master
git push -f heroku HEAD:master
answered Jun 5, 2010 at 10:54

6 Comments

whats the difference btween these two commands or do we have to carry out both
@SaadMasood: Those last to git push commands do the same thing. See git push --help for the meaning of the -f option and the + in the refspec.
@Chris Johnson: Could you please tell us what the -f parameters means instead of RTFMing the guys here?
@AHH -f stands for force. It worked for me with jassa’s answer.
@Cameron Wilby HEAD just refers to the very last commit in your for branch (the head of the branch), and because of the way git works will include every preceding commit up to that point.
|
80
git push -f heroku local_branch_name:master
jislam
8523 gold badges14 silver badges38 bronze badges
answered Nov 14, 2011 at 15:00

4 Comments

Watch out, this uses -f or --force, and it's always best to ensure you know what you're doing when you force push.
@tomasz-mazur why does it require -f?
Yes we may need to use -f in some cases like working with multiple in-progress branches and replace the whatever in heroku and test the working branch, please advice in case do we have any other better way to test
it works on my computer, thanks for the answer, actually is this syntax valid in normal Github repository?
19

For me, it works,

git push -f heroku otherBranch:master

The -f (force flag) is recommended in order to avoid conflicts with other developers’ pushes. Since you are not using Git for your revision control, but as a transport only, using the force flag is a reasonable practice.

source :- offical docs

answered Nov 9, 2019 at 2:25

Comments

13

The safest command to push different local Git branches to Heroku/master.

git push -f heroku branch_name:master

Note: Although, you can push without using the -f, the -f (force flag) is recommended in order to avoid conflicts with other developers’ pushes.

answered Nov 24, 2016 at 6:50

2 Comments

don't you think it's better practice to do without the -f first? then if there are conflicts, to first confirm that it's okay to write over them
Don't just do the -f blindly!
7
git push heroku $(git branch --show-current):master

Alternately:

git push heroku HEAD:master
answered Jun 19, 2020 at 1:00

1 Comment

possibly best solution as this could be added in a make fille as: heroku-deply-current-branch: git push heroku $(git branch --show-current):main
6

Also note that if your using the git flow system and your feature branch might be called

feature/mobile_additions

and with a git remote called stagingtwo, then the command to push to heroku would be

git push stagingtwo feature/mobile_additions:master
answered Jan 22, 2014 at 4:57

Comments

4

You should check out heroku_san, it solves this problem quite nicely.

For example, you could:

git checkout BRANCH
rake qa deploy

It also makes it easy to spin up new Heroku instances to deploy a topic branch to new servers:

git checkout BRANCH
# edit config/heroku.yml with new app instance and shortname
rake shortname heroku:create deploy # auto creates deploys and migrates

And of course you can make simpler rake tasks if you do something frequently.

answered Dec 21, 2010 at 4:24

Comments

2
answered Jun 4, 2010 at 17:27

1 Comment

1

Heroku labs now offers a github add-on that let's you specify which branch to push.

See Heroku's write up on this beta feature.

You'll need to sign-up as a beta tester for the time-being.

answered Dec 2, 2014 at 2:01

Comments

1

At some point in 2022, the syntax 'git push heroku otherbranchname:master' stopped working for me. It would always just return "Everything up-to-date". After consulting the Heroku docs, I found that "master" had been changed to "main", so the syntax is now like this:

git push heroku otherbranchname:main

answered Sep 27, 2022 at 7:07

Comments

0

I think it should be

push = refs/heads/*:refs/heads/*

instead...

Chris Johnsen
227k28 gold badges215 silver badges189 bronze badges
answered Jun 5, 2010 at 10:05

Comments

0
$ git push heroku yourbranch:main

if you are using the heroku web dashboard, you can choose and deploy the github branch directly from there as well which is way better.

answered Jul 15 at 15:44

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.