The non-bare repository is the one developers use - it has a working copy checked out, i.e. the code is directly available.
In case of a bare repository all that's there is the contents of the .git
folder. This is great for pushing/pulling to/from the repository but for obvious reasons not suitable to view the code directly or work on the code.
So, when you want to develop stuff you want a non-bare repository. When you want to push to another machine create a bare one there and push to it from your non-bare one. If you use e.g. GitHub you won't create that bare repository manually - you create it on the website (which usually creates a bare one internally and sets up access control) and then setup it as a remote locally (the address of the repository is displayed so you just need to copy&paste it).