What you may miss off-the-bat is that Heroku’s copy of your app is actually a git repository. It’s like github’s repository of your code, but it is used for the special purpose of deploying the app.
When you do a deploy to Heroku, you are pushing only your latest commits to the master branch of the Heroku repository for your app.
Type more .git/config at the command line of one of your apps, you will see a git remote for the heroku repository
url = email@example.com:abc-app.git
fetch = +refs/heads/*:refs/remotes/heroku/*
In my case, the name of my heroku app is abc-app (made up) but I’ve attached it to a git identifier (just something I type at the command line) called heroku_abc_app
To deploy this app, I would use:
git push heroku_abc_app master:master
This is saying I want to put my local master branch (the first “master”) to the master branch of the remote repository (the second “master” after the colon) to the repository which is identified by heroku_abc_app (defined in .git/config), in my case that repository happens to be at firstname.lastname@example.org:abc-app.git
You can also push a different branch to Heroku, like this
git push heroku_abc_app some_branch:master
This is saying you want to push some_branch onto the master branch of your your app. Be careful – if you push a branch and then try to push another branch (or master) onto a non-downstream git timeline, you will get rejected. You can easily fix this with --force at the end of your command.
Although Heroku’s git repository acts just like a real git repository, most of us use github as the authoritative source for our app’s code and the Heroku git setup only for deploying.