Do you ever write code, test it, and then edit that code some more? If so you just "rewrote" history. The history in the VCS is whatever you decide it to be when you actually commit. You can carefully shape what the history looks like with any VCS by being careful about what you commit. Git and mercurial simply allow you to shape the history after committing as well.