Question: Sometimes, package updates from MELPA can break some part of emacs and when that happens I'd like to be able to revert back to using an older version of the package.

Right now, I can do it in two ways:

* I've set emacs to delete files by moving to trash and when I update a package, the older version is trashed. I can retrieve the older version and replace the one in `~/.emacs.d/elpa`.
* Go to the github repo of the package that broke functionality, fetch an older version of the package, replace the one in `~/.emacs.d/elpa` with the one from gitub, byte-recompile the file(s).

Both these ways involve a lot of manual work moving things around. Is there an easier(preferably automatic) way to downgrade packages installed from MELPA?

Answer: 
I find an easy way to downgrade: managing your own melpa archive.

1. Clone [melpa](https://github.com/melpa/melpa) repo.
2. Follow [melpa's custom melpa archive wiki page](https://github.com/melpa/melpa/wiki/Custom-Melpa-Archive) to remove all recipes.
3. Find the commit of the package you want to down grade to, and create a new recipe with that commit for the package. (see [melpa's readme](https://github.com/melpa/melpa#recipe-format) about how to specify the commit)
4. Run `make` to build the downgraded package
5. Add your own melpa archive, which can be a local directory, to the `package-archives` list.
6. Install the downgraded package using the package menu. Or you can use `package-pinned-packages` to restrict the archive where the package should be downloaded from.
Lots of people elect not to commit ELPA packages to version control, but this is an example of why I believe you should do so.

Reverting *anything* is trivial if it's all committed.

Depending on the state of the upstream ELPA packages is a risk.