In general, the develop branch contains code in the development stage. Once changes are ready to be added to the final product, changes are committed to the master branch.
Source: https://www.digitalocean.com/community/tutorials/how-to-use-git-branches
Concerning Geth, this post from Nov 17, 2016 clarifies:
"A bit before the Frontier release last July, we switched to a source repository model where the master branch contained the latest stable code and develop contained the bleeding edge source code we were working on.
This repository model however had a few drawbacks: a) people new to the project wanting to contribute always started hacking on master, only to realize later that their work was based on something old; b) every time a major release was made, master needed to be force-pushed, which looked pretty bad from a repository history perspective; c) developers trying to use the go-ethereum codebase in their own projects rarely realized there was a more advanced branch available.
Beginning with Geth 1.5, we will no longer maintain a separate master branch for latest-stable and develop branch for latest-edge, rather we will switch to master as the default and development branch of the project, and each stable release generation will have its own indefinitely living branch (e.g. release/1.4, release/1.5). The release branches will allow people to depend on older generations (e.g. 1.4.x) without finding surprising git issues with history rewrites. And having master as the default development branch would allow developers to use the latest code."
Source: https://blog.ethereum.org/2016/11/17/whoa-geth-1-5/
Edit: added eth blog post