I hate to pick, really, but you've made a couple of odd assertions in your post that I feel I need to address for the reasons in your first paragraph. Your example that "any commit after the first initial push" is a failure is a bit of a misnomer, especially (for example) in an agile project where each commit is an atomic enhancement, a step toward a short term goal. It's only a failure if that code doesn't work or has completely missed the point of its spec. Enhancement doesn't imply the code that came before it was incorrect (which your assertion does). Otherwise your notion of failure is entirely correct, and new developers should definitely be aware that the entire learning process is fraught with experimentation and failure. Don't take my criticisms as a rebuttal, but rather a fine tuning of some of the details.