Understanding Git
eecs.harvard.edu
eecs.harvard.edu
Scott Chacon's gitcasts included a keynote he gave which also has a good explanation of the repository and how it works: http://www.gitcasts.com/posts/railsconf-git-talk. He has a peepcode book covering the same material, which I bought out of appreciation for gitcasts at the time.
It's actually a relatively simple model, when you focus primarily on the data structures.
http://www.scribd.com/doc/6377254/Git-from-the-bottom-up-by-...
http://www.newartisans.com/2008/04/git-from-the-bottom-up.ht...
First off, a fetch will never result in a fast forward, since it is just modifying remote references, not merging local references. If you fetch in this scenario, it will not cause an error or you to lose your commit. It just updates the remote reference. You can then merge, resolve any conflicts and you're set. Doing a pull is just doing these two steps as one -- i.e. a pull = fetch + merge. After merging, you can push back.
This is great for developers, but bad for end-users, as a lot of users will run away before learning new concepts(they're busy enough already), while others will take a macho posturing attitude towards it and look down on the people who ran away. The community gets polarized. Git exemplifies this kind of thing, for better or for worse.
It's not a huge surprise that so many developers have switched from Linux to OSX, since the latter has made many more provisions towards the newbie end-user; it indicates that most developers don't want to take on this kind of burden, at least not all the time.