TL;DR
You can't successfully push to a non-bare repository.
Three Practical Options
Option 1
Actually, you can push a non-bare repository if you try hard enough, but it won't update your working tree for you even if you do. For example, the push error message says:
You can set 'receive.denyCurrentBranch' configuration variable to
'ignore' or 'warn' in the remote repository to allow pushing into
its current branch; however, this is not recommended unless you
arranged to update its work tree to match what you pushed in some
other way.
You'd have to change the configuration on the non-bare remote, and add a post-receive hook to update the working tree. So, it's generally not useful to do it when there are easier ways to go about it.
Option 2
You could also create a post-receive hook on your bare repository that would use ssh (or similar) to connect to the remote host with the non-bare repository and do a pull whenever the bare repository is updated. This is pretty similar to the previous option, but doesn't require any configuration changes on the non-bare repository.
Option 3
Polling is another option. You could do something similar to https://stackoverflow.com/a/11254771/1301972, where you're polling your bare repository for a pull at timed intervals. This option requires no git configuration or custom hooks at all, so that's what I'd recommend as a general solution if you have access to a crontab.