el-get can install packages from non-ELPA sources, the most important of which is Github.
(It also includes emacswiki as a source, but tptacek has just reminded me that this is the world's scariest feature and I'm going to disable it posthaste.)
It also lets you declare all your packages in your setup file, and will install them from that declaration. That means you can stick your setup file on a brand-new machine, start emacs, and all your packages auto-install themselves and start working.
I've concluded, however, that I should have just done what you did. ;) Use package-install where it's handy, then commit everything that package-install pulls down to Git, along with any packages that I manually install from Github or other sources. (I could use Git submodules or subtree-merge for the latter… if I liked hairy complications.) This process is tedious, but it's conceptually simple, reliable, and results in a Git-controlled .emacs.d that I can just clone onto new machines so long as Github is up.