I happened to be looking around to see if there was a rust rewrite of rsync last night and stumbled across this post by the author of pijul that helps explain the benefits of pijul over git:
> Git is great in many ways, but doesn't really know how to merge changes correctly. Even worse, it doesn't know how to "unmerge" changes.
> It does try to merge branches, though, but doesn't give you any reliable guarantee on the result. For the unmerging part, it doesn't even try and you have to rebase your changes yourself, still without strong guarantees.
> Pijul uses a patch algebra to do these things, where patches have several nice properties:
> • Any two patches A and B either commute, or one of them explicitly references the other. This means that repositories behave as _sets of patches_ rather than as a linear history.
> • Patches are associative: applying C on top of a repository that has A and B will yield the same result as applying B and then C on top of a repository that has A. Git could have this, but unfortunately, it doesn't.
> • Patches have inverse patches.
> We also have a sane internal representation of conflicts, so that all conflicts don't have to be solved immediately after merging.
> I should add that Pijul is still quite unstable, and at this particular moment is in the middle of a giant protocol change.
> Git is great in many ways, but doesn't really know how to merge changes correctly. Even worse, it doesn't know how to "unmerge" changes.
> It does try to merge branches, though, but doesn't give you any reliable guarantee on the result. For the unmerging part, it doesn't even try and you have to rebase your changes yourself, still without strong guarantees.
> Pijul uses a patch algebra to do these things, where patches have several nice properties:
> • Any two patches A and B either commute, or one of them explicitly references the other. This means that repositories behave as _sets of patches_ rather than as a linear history.
> • Patches are associative: applying C on top of a repository that has A and B will yield the same result as applying B and then C on top of a repository that has A. Git could have this, but unfortunately, it doesn't.
> • Patches have inverse patches.
> We also have a sane internal representation of conflicts, so that all conflicts don't have to be solved immediately after merging.
> I should add that Pijul is still quite unstable, and at this particular moment is in the middle of a giant protocol change.
https://www.reddit.com/r/rust/comments/821sgo/announcing_rus...