> People have even made up rationalizations about fictional concepts such as "historical purity".
The idea behind not rewriting history is not to gain some kind of academic pleasure from purity. It's to make sure that the commits being committed are actually the same ones that you actually wrote and (hopefully) found to be working, so that when a bug makes you refer to the commit later, you (a) don't start scratching your head as to why it didn't do what you thought you saw it do yesterday, and (b) can actually refer to it to figure out what the correct code should've looked like.
If you don't see what I mean, here's an example. Say you have
foo():
foo1()
foo2()
foo4()
foo5()
and you turned it into this:
foo():
foo1()
foo2()
foo4()
foo5()
foo6()
Now now if someone has in the meantime done this:
foo():
foo1()
foo2()
if (!foo3()): return 0
foo4()
foo5()
then after a rebase you will end up with
foo():
foo1()
foo2()
if (!foo3()): return 0
foo4()
foo5()
foo6()
which is
not code that you ever had, and which is likely to fail because your assumption that foo6() will always be hit will no longer be valid.
With a rebase, not only will this be confusing when you look back and make you blame the wrong person or lead you in the wrong direction, but it will also remove the option of rolling back to the latest of either of the two branches that you combined. You'll only be able to revert to the "known-good" branch that was rebased onto, not the one that was rebased.
Oh, and did I mention you very likely just lost the working (pre-rebase) version of your code entirely? Have fun digging it out of your reflog if you notice it quickly enough, and good luck finding a copy if you do so too late. You'll have probably deleted the branch by now, and chances are nobody else will have a copy lying around for no reason either. After some period of time you'll have no idea what the working code looked like, because the only version you have is the one that already incorporated the branch you rebased onto.