Lazygit Turns 5: Musings on Git, TUIs, and open source
jesseduffield.com
jesseduffield.com
Nowadays, lazygit is my main interface to git - it's intuitive, addresses the complexity of git head-on, and doesn't even assume you'll remember its shortcuts constantly (except for ']' for some reason, which isn't shown in the bottom shortcuts row). I found that I had to handle other git porcelain (i.e. UIs) really like porcelain, constantly afraid of breaking something. lazygit in constrast just feels like someone made a visual representation of git's design and allowed you to interact with it.
It’s almost as old as git. Fossil has been around since 2006, while git was born in 2005.
> Merge conflicts aren’t first class
Another DVCS where conflicts are first class is Pijul. It also has a solid theoretical foundation, which it inherited (and expanded upon) from its predecessor, Darcs.
> It’s almost as old as git. Fossil has been around since 2006, while git was born in 2005.
I'm assuming the author recently discovered fossil, but it is an absurd statement regardless :)
I've sort of wanted to use fossil for a real project of my own, but its own idea of workflows just... puts me off completely. I stick to Git. Git won the minds of developers not because it was first (by far, it wasn't), but because it's better than the rest.
> Warp: a terminal emulator whose killer feature is allowing you to edit your command as if you were in vscode/sublime
I exhort anyone interested in this feature to enable vi mode for your shell; zsh, bash, and ksh all support it. Readline also supports it, which will let you use it in CLIs like REPLs and psql. It is glorious.
Aside: how is it implemented? Does readline have to reimplement vi style editing; or is there some sort of vi lib?
> my staged files disappear from my list of file changes
> a new commit is appended to my git log
> my branch ends up with a new head commit, diverging from its upstream
> If you create a commit from the command line, you see none of this.
Sure, if you're not using an addon like powerline-shell. If you do, all of those are immediately obvious.
I'd argue it's less "commandline bad" and more "stock commandline bad."
So on the topic of visualization, can someone make a simple(?) GUI tool that has all these entities, and sequentially animates some arrows, with annotations, showing just what the heck is going on ? Do it for the most commonly used commands but also for the rarely-used ones. And for every command that invokes it (presumably using a hook), then display OK/Cancel.
Git training wheels. Meant to be abandoned once you get the hang of it.
Keyboard-driven git UI's which aren't GUI are relatively niche. (I can think of magit, tig, and lazygit).
Whereas, a git beginner may be more likely to start using git with a GUI, e.g. the git panel in VSCode, or something like GitKraken.
they make it the default to merge current branch into current branch (pull with merge) and they default to committing large amounts of code under a simple message.
i know fulltime devs who use git every day, who have no idea what a rebase is - they think merge does what really rebase does, and thats mostly the fault of bad defaults.
git commit -p should be the default committing interface also; assuming you like git history which can be bisected, reverted, etc.
Even if they cater to novice users, they aren’t novice users themselves and lack of experience is no longer an excuse when Git wrapper authors make bad choices about defaults.
The main problem is that many people just don’t care, and view VCS as an afterthought, after the actual work is done. They don’t even know how powerful git can be when used optimally.
Maintaining a clean git history is work. You have to think about it, and invest into it. But it is well worth it, in the mid to long term.
I understand different projects have different requirements for version control, but as someone who does not work on massive codebases with a huge amount of collaborators I enjoy that the GUI I use somewhat hides the complexity I don’t want to engage with.
Merged master into master
commitsHow true is this? I believed that people learned git using the CLI.
I learned git from the official book - pro-git. It's entirely based on the CLI. I've trained many to use git - again with CLI. Magit is fun to use - primarily because its UI is directly based on the CLI paradigms. Magit is often just a shortcut for the git CLI (using transient menus).
I was never really able to settle on a GUI, other than for inspecting the commit graph/DAG. The only VC tool I learned with a GUI was subversion, using TortoiseSVN. But the limitations of that GUI was very apparent and had to drop it soon afterwards.
All of my co-workers use git GUIs.
I use the CLI, not out of love for it, but because git is so needlessly complex and arcane that I'm scared to use GUIs. For every other tool, I prefer to use GUIs, but they're simple enough that I don't get surprised and there's no major consequences (such as making me spend 2 hours researching a solution) if there's an issue. Not so with git. Git has an awful CLI. It's needlessly complex for 99.999% of projects.
I write in Evernote notebooks as a learning journal and also a personal knowledge base (howto guides, troubleshooting guide, snippets, etc). Every note is written for a good reason, there's no meaningless info in it.
Here is the number of notes in my git notebook, along with a few others for comparison:
-git: 55 notes
-Linux: 200 notes
-C++: 130 notes
It's insane that git occupies so much mental space considering it's a single-purpose tool.
I truly wish it was never created, or at least never caught on, we might have another decentralized VCS dominating the space with an interface written for normal people.
If anyone other than Linus Torvalds had written it, we would all be using something else. If midwit geeks weren't so vain and wanted to feel cool for using the same VCS as the Linux kernel, we could've been using something else. (No, I can't choose to use something else, the dominant winner affects you whether you like it or not, same as IE6 and Chrome.)
No arguments here. What I meant is that it's very hard for me to understand what's happening behind the scenes unless I'm using the CLI. The tool is hard nevertheless.
> If midwit geeks weren't so vain and wanted to feel cool for using the same VCS as the Linux kernel, we could've been using something else.
The fact is, git won. I was personally into mercurial. The CLI was much more sane.
One of the biggest issue with git is that it uses both the snapshot model (for the storage format) and the diff/patch model (for many operations like merge and rebase). You have to know which of these applies to any operation for it to make sense.
Git always uses snapshots. The diff thing is just a question of how this is exposed in the UI.
For example, consider the case of an interactive rebase where you delete a commit. If it was based on snapshots, only that commit should disappear. The changes introduced by that commit should remain in the subsequent snapshots/commits. However, that is not what happens. The change introduced by the commit disappears from all subsequent commits/snapshots. This means that all the subsequent snapshots are modified by subtracting the patch from the commit that was deleted.
The problem is if you mainly use a UI and get into a bad state then the UI tends to make it worse and you have a bad mental model so you're left asking for help and finding it hard to describe what you need. That's my experience anyway, I see that happen about once a month among my peers.
I used Mercurial a lot before trying Git for the first time, the projects then switched to Git.
With Mercurial I felt right at home with the command line. Everything was simple and made sense, and I seldom had to consult the documentation after a short time learning it. I never felt the need for a GUI, or that it would improve things.
With Git it was the complete opposite. Nothing made sense at the command line. I had to do web searches for just about everything I did, either to figure out what arcane set of switches to use or to make sure I didn't fuck things up. After a short while I gave up and found a GUI, which made Git much, much better to use.
Perhaps things have improved somewhat, I hear they've cleaned up the command line options a bit. But looking at the manual[1] its clearly still far from Mercurial-level of usability[2].
[1]: https://git-scm.com/docs/git-reset#Documentation/git-reset.t...
[2]: https://book.mercurial-scm.org/read/undo.html#rolling-back-a...
TortoiseGit is ugly and sucks, but the only time I've had to drop to the command line is when I need to look for the intersection or disjoint commits
TortoiseGit has many great features, including ways to compare anything you can think of.
I'm still not over Mercurial losing the DVCS wars.
With Mercurial I didn't have to, it just flowed.
Rebasing isn't difficult, merging isn't difficult. Staging is stupid so I ignore it. The stash is stupid, so I ignore it (why not just make a new branch and commit?). Bisecting isn't difficult.
Seriously, the concepts are not rocket science. Git just makes it hard to remember how to correctly invoke the thing you want to do for no good reason other than that it was hacked together in a fit of pique and those decisions have stayed with us ever since.
And a lot of the functionality is centered around an email-based workflow, which makes sense for the Linux kernel, and doesn't make sense for anybody else.
[1]: https://git-scm.com/book/en/v2/Git-Basics-Undoing-Things
I'm someone who used to train newbie staff using the git CLI. As the other commenter pointed out, the CLI often doesn't feel very intuitive. However, I personally felt that it's hard to convey what's happening behind the scenes unless you're on the CLI. And in git, it's very important to know the underlying data format and operations - unlike in case of Mercurial, for example.
Visual Studio has an excellent history browser when I need to operate on specific commits. Both Visual Studio and Visual Studio Code have great basic git capabilities and amazing conflict editors to never touch the cli.
If they're faster than CLI it's because they are also CLI experts who have an ideological mission. Nobody cares about this situation. Overall the CLI is still faster in the majority of cases at most workplaces.
Lazygit is the only other UI I've seen which presents all the relevant information without having to tediously click/scroll through a lot of clutter.
It's an awesome project, highly recommend.
If anything I'd just recommend you set your own shortcuts to avoid doing an unearthly amount of damage, typing keys as shortcuts when you're thinking you're typing a commit message :)
Doesn't the conclusion seem obvious? Most devs aren't Apple fans.
Lazygit: Simple terminal UI for Git commands - https://news.ycombinator.com/item?id=36782018 - July 2023 (79 comments)
Lazygit: A simple terminal UI for Git commands - https://news.ycombinator.com/item?id=29394162 - Nov 2021 (141 comments)
Show HN: I made a tool that made me faster at Git - https://news.ycombinator.com/item?id=17689014 - Aug 2018 (229 comments)
But once closed, I was not bothered again. The program itself feels great, like it could become a daily tool.
> Engineers are trained to think logically. As a result, they come to believe that all people must think this way, and they design their machines accordingly. When people have trouble, the engineers are upset, but often for the wrong reason. "What are these people doing" they will wonder. "Why are they doing that?" The problem with the designs of most engineers is that they are too logical. We have to accept human behavior the way it is, not the way we would wish it to be.
— Don Norman, The Design of Everyday Things