Unfortunately, code tells you what somebody did, but rarely why or when they did it. It also doesn't tell you if they made the right decision when they did it. Without lots of experience, it's hard to decode the context or history behind many of these things.
To that end, I wish Git were just a touch better about diff-ing, because all too often it does something like this:
function A(){
// some code
- }
-
- function B(){
- // some other code
}
Where something like deleting all of function B ends up looking like partially editing function A.
It's an idle wish, as I know there is no way for Git to understand all of the corner cases of issues like this, but it would make playing the commit history back much more readable. But if it worked like I wanted, it plus a viewer that animated the changes between commits would be just about a perfect tool for writing tutorials about software development as a continuous pursuit, rather than just program code as an end result.