
Happy New Year!
It has been 203 days since the release of git gud, and I’m incredibly grateful for how many people have played and enjoyed the game. Hopefully, everyone has picked up a new Git command or two along the way as well.
This update is a big one, the largest so far. One of the most important additions is the new Content Pack system, which is the plan going forward for continued development. Content packs will introduce new sets of challenges built around themed, real-world–style scenarios. Each pack will be low cost (around a dollar or two) and will go on sale whenever the base game does. It’s important to me to keep git gud accessible while still being able to justify the time required to add meaningful new content and improvements. The first content pack will be releasing shortly alongside an introductory sale.
You may notice that this update includes a lot of changes. While some of that work was driven by the first content pack, I also added 246 new unit and integration tests. This surfaced a number of edge cases and areas that needed improvement, and it should significantly reduce the chance of regressions, particularly cases where previously valid challenge solutions would break after a major update.
git gud now includes support for git-filter-repo. I originally avoided this since it isn’t part of core Git, but I’ve listened to the community feedback encouraging its use over git filter-branch. Existing challenges will continue to accept either tool as valid solutions, but an upcoming content pack introduces scenarios where company policy explicitly forbids filter-branch.
I’ve also made another pass at tab completion. This iteration should be a noticeable improvement and closer to real-world behavior across common terminal environments.
Finally, macOS support is now included. This has been available in the development branch for about a week with no reported issues so far. If any problems do come up, please report them in the Steam Discussions bug reporting forum so they can be addressed quickly.
As a small but important note: going forward, each release will be archived as a beta branch. If you run into issues with 1.5.0, you’ll be able to revert to 1.4.2 while waiting for fixes. This was requested by a university that uses git gud in coursework and needs tighter control over version upgrades.
Thanks again to everyone for the continued support,
Sky
Changelog 1.5.0
New Features
- Content Pack system added
- Initial implementation of git filter-repo
- Added --create-branch flag to git worktree
- Added echo game command
- Significant improvements to the Tab Complete functionality
- Added support for MacOS
Git Simulation Improvements
- Improved git rebase emulation for closer real-world behavior
- Especially around rebase todo ordering
- Improved git filter-branch emulation accuracy
- Improved git bisect to reduce redundant simulation guidance
- Removed unsafe substrings in both rebase and bisect simulations
- Merge emulation is now graph-based:
- Introduced a new CommitGraph utility used across the simulation
- Merge commits are now true multi-parent commits (no-ff merges link both histories)
- Merge validation now checks commit ancestry and reachability instead of commit message text
Validator Updates
- Improved validators for Bisect, Rebase, Branch, Commit, File, and Stash
- Improved file validator for restore related edge cases
- Revised all git clean validators
- Revised CommandNotUsed:
- Now fully blocks execution of disallowed commands for a challenge
- Examples: git add in Challenge 4, git pull in Challenge 71
- Fixed branch validator supporting checkout-based creation but not git switch (Challenge 81 notably)
- Fixed filter-branch validator not accepting --index-filter
- Fixed clone validator not accepting --mirror
Bug Fixes
- Fixed header displaying Completed: {diff} instead of Difficulty: {diff}
- Fixed git checkout saying switched to branch when already there
- Fixed edge case where Back from a challenge set prompted a progress reset
- Fixed git bisect good/bad marking the next commit instead of the current one
- Fixed restore revision specifier handling
- Fixed stash save/push not supporting positional message arguments
- Fixed `git log` validator --oneline flag placement
- Fixed inconsistencies in git log --author parsing
- Fixed git rebase <upstream> <branch> targeting support
- Fixed git restore --staged edge cases