&gt; This is only true if you allow commits that haven&#x27;t individually passed your CI suite to be pushed. That&#x27;s insane.<p>It&#x27;s also pretty common in open source projects (due to limited CI resources or other reasons). I also note that this is not the only problem: the problem is that these commits never existed in the wild. This can also lead to subtle problems that CI simply can&#x27;t catch.<p>&gt; Working at an organization (Google) that for the most part doesn&#x27;t use branches and where other merges are impossible (every file must have previously been resolved against whatever is at HEAD prior to submitting), I respectfully disagree[0]. A linear history of individually reviewed and validated changes is MUCH easier to deal with than the regularly branched&#x2F;merged history of my previous gig (which did use git, along with pre-push change review for each change).<p>Your problem here is that Git does not have a good way of  displaying structured history and just throws the raw DAG or a topologically or chronologically sorted list at the user; lack of named branches means that you&#x27;re largely looking at an anonymous soup of objects with no tools to filter them. Contrast with Bazaar&#x27;s hierarchical logs (augmented with branch nicknames), for example, if you want to make a serious argument.<p>&gt; They&#x27;re a leaky abstraction, though. Unless you mutate published history (which I do think is insane)<p>Published mutable history is not per se insane. Please familiarize yourself with Darcs&#x2F;Pijul&#x2F;Mercurial&#x27;s changeset evolution. Note that I am not saying this is necessarily a good idea, it&#x27;s just not per se insane. Not all projects have the same requirements&#x2F;workflow&#x2F;number of contributors&#x2F;etc.<p>&gt; it&#x27;s inevitable that your nice bundle of merged changes will one day be incomplete: additional changes to make the bundle actually function as intended will be required. These will end up detached from it as some other commit series on HEAD or merged into HEAD.<p>Note that when I say that this is an abstraction mechanism, it&#x27;s not the only abstraction mechanism. This, again, is a Git problem [1], not a VCS problem. This is, for example, where named branches come into play; see in particular Fossil&#x27;s tagging mechanism (which has little to do with Git-style tags) or Veracity&#x27;s stamps.<p>[1] Git is a solid workhorse for a DVCS, but it is a very basic version control system, sort of the lowest common denominator in the DVCS world. This makes it a poor basis for arguments as to what <i>can</i> be done in a VCS.