Pijul: Version-Control Post-Git [video]
I don&#x27;t buy (as sold) the argument that we need associative and commutative merges, and I believe that this constraint when applied by the software makes resolving merge requirements harder on the user, rather than easier. It&#x27;s punting the slightly more solved part of the problem back on the user, when it&#x27;s one of the least favorite parts of the problem for the user.<p>The solution that he writes up is basically &quot;git merge&quot; and part of the reason that we have such a bad time with git is that the industry largely standardized on &quot;git rebase&quot;, which destroys many of the properties listed:<p>changes are partially ordered: if you merge, this is true, if you rebase, this is not, your change is strictly reodered atop the merge base, and you dear user are responsible for the hell of fixing the constant conflict this produces, even if an alternative merge order would implicitly fix this. when pijul says &quot;partial ordering&quot; here, it means (in slightly abstract and minutely different terms) it&#x27;s doing what git merge does, because it&#x27;s better. As it happens one of the various reasons rebase became popular was that `git log` order shifts around for efficiency and correctness reasons, when people mostly want the output of `git log --topo-order` by default, which for the common case of &quot;merge right onto left&quot; presents &quot;right first, then left&quot; in linearized history, unless there&#x27;s a content defined order. Pijul dodges the presentation problem by just not presenting this information at all. Git&#x27;s mistake was in many ways not hiding enough from users - but it came from kernel engineers, who don&#x27;t want things being hidden.<p>No git rerere: rerere is a hack to try to make rebase pretend that it doesn&#x27;t drop usable merge information on the floor, if you stop imposing rebase on yourself you don&#x27;t need the rerere hack.<p>Partial clones &amp; large files: these are storage structure optimizations, and yes, a problem for git, though for example git lfs approach is similar in solution to the described pijul solution: &quot;we only need a description of operations&quot; - that&#x27;s how you would describe lfs changes. As it happens, that&#x27;s also how you would describe subproject updates, and yes, sure subproject UX isn&#x27;t great, but now we&#x27;re back to a UX problem, not a storage problem.<p>Working with large graphs: cache snapshots and index deltas, um, yeah. You don&#x27;t have to squint very hard to draw equivalence here either.<p>I&#x27;m not apologizing for git, but there&#x27;s a lot of &quot;here&#x27;s some non-ascii literals on a slide, it&#x27;s science&quot; presented, but not actually a very substantial shift in trade-offs when applied in practice. There are some pathologies improved, and some worsened, and there are some more onus put on the user for some cases, and some removed for other cases. It&#x27;s a very different (at the minute level) structure, sure, but I&#x27;ve not been sold that it makes a set of trade-offs that substantially change the game, it&#x27;s just the other side of the field, not all that dissimilar from choosing between two different database engines.<p>An example of it not being that different in practice: can you conflict with yourself in pijul? Absolutely, and you end up with the pijul version of merge commits, e.g. <a href="https:&#x2F;&#x2F;nest.pijul.com&#x2F;pijul&#x2F;thrussh&#x2F;changes&#x2F;7S7FHFDVSSRB4DCBZINHNWM3QJS6KYAR2L2HADDBDN4IHKN6KGLAC" rel="nofollow noreferrer">https:&#x2F;&#x2F;nest.pijul.com&#x2F;pijul&#x2F;thrussh&#x2F;changes&#x2F;7S7FHFDVSSRB4DC...</a>, more than that you can conflict with yourself multiple times (which is basically the rerere problem but actually distributed, which was somewhat erroneously claimed to be eradicated). It hasn&#x27;t substantially moved the needle on merging history quality _in practice_. The manual is very incomplete on this, i.e. <a href="https:&#x2F;&#x2F;pijul.org&#x2F;manual&#x2F;conflicts.html" rel="nofollow noreferrer">https:&#x2F;&#x2F;pijul.org&#x2F;manual&#x2F;conflicts.html</a> and there are some nascent but very slow tools to unhide the totality of conflicts in a repo <a href="https:&#x2F;&#x2F;nest.pijul.com&#x2F;laumann&#x2F;pijul-conflicts" rel="nofollow noreferrer">https:&#x2F;&#x2F;nest.pijul.com&#x2F;laumann&#x2F;pijul-conflicts</a> which would bring the rerereal problem (couldn&#x27;t resist, sorry) into the light.<p>What&#x27;s the largest team concurrently working on one project full time using pijul today? I ask because small numbers of users don&#x27;t create many interesting conflicts often, and don&#x27;t provide a good insight for the properties of a VCS at scale&#x2F;in practice. You can use CVS with zero problems when you&#x27;re on your own. There&#x27;s an embedded theory which is that you can do very lazy conflict resolution requirement and that it&#x27;ll pay off. I&#x27;d like to see that theory tested at scale.