I would like to introduce you lovely OpenSource Lovers to a GIT-Alternative called FOSSIL that I also stumbled upon because of this Blog.<br> It’s basically opensource Github-in-a-box which means it’s an SCM with:
- Bug-tracker
- Ticketting-system
- Forum
- Wiki-system
- even a Chat-functionality
- Has built-in GUI
- Also has a Web-Server
- Self-Hostable like Gitea/Forgejo
& the best part it’s all in ONE STANDALONE FILE!!! which is extremely lightweight which you can copy to your $PATH & works even in crappy internet. how cool is that!!
However this tool supports a completely different style of development in FOSS called the “Cathedral-Style” whereas GIT suports a “Bazaar-Style”<br> The person behind Fossil is the creator of SQLite, <u>Dr.Richard Hipp</u> & they even made other projects to support Fossil like a PIC-Like language called PikChr<br> Well just in case; here’s a list of difference between Git vs Fossil<br> & guess what!! they even have a hosting service called CHISEL
Listen; Just check it out & use it for fun in your spare time even with the flaws it has (& Try out Darcs & Pijul as well)
dont forget about jujutsu
Since jujutsu is Git-compatible it has very much replaced Git for me and is what I’m using for everything now. Its workflow is so good and miles ahead of Git.
I was trying out Pijul for a while before that and while it has a lot of great ideas and has a lot of potential due to the way its foundations work its interface is way too janky right now and missing features and nothing I’ve reported or the many changes I’ve submitted have been fixed/pulled since March. I’d really like it to be good but alas…
Assuming you are using feature branches with git, I have quesitons.
What is the killer feature for you over git?
The killer feature for me is the mega-merge, which is a great workflow that is very difficult if not impossible to recreate in Git which allows you to work on many feature branches at once while keeping them independent. It’s basically a merge commit which you have checked out which has all your feature branches as a parent, and jj makes it trivial to manage this. This is usually how I want to work and with Git what ends up happening if I want to do that is I will add a new feature to an existing feature branch that doesn’t really belong there, but this obviously makes it very easy to write code which depends on the incomplete feature that came first and then becomes very hard to separate if you want to merge the second feature before the first.
This has also essentially saved me from what I did before with Git, which is having way too many work trees (still, shoutout to git worktree here), one for each branch.
Here’s the log from one of my repos that I use the mega-merge with right now: https://paste.gentoo.zip/JRxJDhiQ and the corresponding log on GitHub for the top branch; the log, which I’ve configured here to show the changes that are in my fork but not in the upstream fork, actually shows three main branches (master, nixos-unstable, nixos-24.11). You can see most of the 6 branches that master merges actually have a corresponding remote branch (shown between the date and the commit hash) because they have or had PRs open. Changing anything about this graph (rebasing it on top of new master@upstream, inserting a change somewhere, deleting/modifying an existing change, etc.) will rebase every dependent change, that is, the ones that have the modified one as a parent (!!!) on whatever changed and also update branch pointers, so when I push the next time, for example after a rebase, it will have updated all those branches for me and I don’t have to go through fixing each one. Especially the latter I think is not possible with Git, a rebase operation will only affect the current branch. I have no idea how Git deals with rebasing merge commits, I think I’ve tried once and it became a mess and I haven’t touched rebasing merge commits since.
Honorable mentions include
jj log -r 'mine() & description(glob:"foo:*")'.
You can also use this to select a set of commits to be squashed, rebased, deleted, or whatever.Thanks so much for this. I may end up trying this out. This n-branch auto rebase sounds like a thing I may end up loving.
Enjoy!
I ‘forgot’ it on purpose.
The compatibility with Git means it is ultimately shackled to the design decisions fundamental to Git which require hacky workarounds. The maker of Pijul has pointed out some of the fundamental ways it can never handle patches is the manner of Darcs/Pijul, but I am not in the position to pull some of these quotes.
I would rather see revolution over evolution, & the weird ties to Google & hosting the project Microsoft GitHub rub me wrong.
but they are working on their own vcs. I think git compatibility is not much more than a convenience in the long term.