“Boost Your Git DX” out now

My new book, Boost Your Git DX is out now, on my birthday 🥳. It’s taken nearly a year of work with four months in early access.
This book is 353 pages across 18 chapters on improving your Git command line development experience. It covers the best tools, techniques, tips, tricks, and tactical tidbits that I’ve encountered in 11 years of using Git.
Team licenses are available and there’s an automatic regional discount for those in lower-income countries. It comes in DRM-free PDF, ePub, and AZW3.
Praise
Response from beta and early access readers has been encouraging. There’s a list of public posts about the book at the bottom of the Gumroad page. Here’s a selection:
whether you're new to git or an experienced veteran -- @AdamChainz's new book "Boost Your Git DX" has something for everyone! (even I learned a cool new thing:
git config --show-origin)
Adam's written two books before (Boost Your Django DX; Speed Up Your Django Tests) — both paid for themselves within the first hour of my purchase.
This one's a no-brainer, too.
This book transformed my day-to-day operations. As a self-taught engineer, I have found myself starved for mentorship, and Boost Your Git DX has been my most influential mentor in 2023.
Full table of contents
Here’s what you’ll learn within:
- Introduction
- About this book
- Read in any order
- Example commands and resources
- End-of-chapter feedback links
- Acknowledgements
- Changelog
- About this book
- Global configuration
- Git’s configuration files
- Store global configuration in
~/.config/git - Migrate from legacy
~/.gitconfigto~/.config/git/config - Read and change options with
git config - Trace options with
git config --show-scopeand--show-origin
- Store global configuration in
- Basic configuration
- Set your name and email address
- Use a different email address based on the working directory
- Use your favourite editor
- Set up a global ignore file
- Improve the default colourization with
color.*options - Enable
help.autoCorrectto fix mistyped commands
- Back up your configuration
- Set up your dotfiles repository
- Save ongoing configuration changes
- Track other configuration files
- Restore your backup
- Git’s configuration files
- Aliases
- Shell aliases
- Create shell aliases with
alias <name>=<command> - List aliases with
alias - Bypass aliases with
\
- Create shell aliases with
- Git aliases
- Create an alias that runs a single Git command
- Create an alias that runs shell commands
- Add a
git gitalias to help when you lose attention
- Shell aliases
- Shell configuration
- oh-my-zsh: instant enhancements and aliases
- Install oh-my-zsh
- Some handy Git aliases
- Learn your aliases on the go with zsh-you-should-use
- Starship: a powerful, performant prompt
- Install Starship
- Personalize your prompt
- Read Git state at a glance with Starship’s prompt
- oh-my-zsh: instant enhancements and aliases
- Shell tools
- Less: the power pager
- Activate lesser-known features with the
LESSenvironment variable - Scroll and search with keyboard shortcuts
- Search forwards with
/and backwards with? - Use Less with more Git commands
- Activate lesser-known features with the
- delta: dapper diff display
- Set up Git to use delta
- How delta enhances Git’s output
- Run delta directly as a diff tool
- ripgrep: rip-roaringly rapid grep
- Install ripgrep
- Search basics
- Change case sensitivity with
-ior-S - Unrestrict searches with specific options or
-u - Filter by file extensions with
-gor-t - Configure ripgrep in
~/.config/ripgreprc - Combine with delta for lovely formatting
- Less: the power pager
- Repository configuration
- Default branch naming
- Use
mainfor your default branches - Alias
masterasmainin legacy repositories
- Use
- Ignore files
- The basics of ignore files
- Ignore file tips
- Commands for debugging ignore files
- Default branch naming
- Hooks and the pre-commit framework
- Git hooks
- pre-commit: Universal Hook Manager
- Install pre-commit
- Configure pre-commit
- Update hooks with
pre-commit autoupdate - Extra protection from pre-commit-hooks
- ripsecrets: Protect your secrets
- Find more hooks
- Skip hooks temporarily with
--no-verifyorSKIP - oh-my-zsh plugin
- pre-commit ci: continuous integration for your hooks
- Command commonalities
- Common options
- Get short or long help with
-hor--help - Override configuration with
-c - Use repositories in other directories with
-C
- Get short or long help with
- Commit SHAs
- SHA abbreviation
- Show and copy the current commit SHA
- SHA-1 versus SHA-256
- Commit references
- Single commit references
- Commit range references
- Date specifications
- Top formats
- Pathspecs
- Top pathspec syntaxes
- Using pathspecs
- Common options
- Branches and
worktree- Switching branches
- Use
git switchinstead ofgit checkout - Top
git switchcommands
- Use
- Listing branches
- Basic branch listing commands
- Sort by recency and switch with fzf (fuzzy finder)
- Find branches missing a given commit
- Deleting old branches
- Configure your Git host to delete merged branches
- Enable automatic pruning of remote branches
- Add an alias to delete local branches
worktreeworktreebasics- Using a worktree to write a hotfix
- Switching branches
statusanddiffstatus- Use short format for denser output
- Shorten long format by disabling advice with
advice.statusHints - Hide untracked files with
-uno - List changed files with
git diff --name-only
diff- Improve diff generation with the “histogram” algorithm
- Enable inter-hunk context for more… context
- Enable language-specific hunk headings
- Use ExifTool to diff media files
- Use Pandoc to diff document files
- Disable file path prefixes to make them copyable
addandrestoreadd(andmvandrm)- The three commands:
add,mv, andrm - Add interactively with
git add -p - Add all changes with
git add -uor-A
- The three commands:
restore- Use
git restoreinstead ofcheckoutandreset - Top
git restorecommands - Restore interactively with
-p
- Use
commitandresetcommit- Improve commit message editing with verbose mode and “scissors” cleanup
- Use
-mto set the message without your editor - Use
-aor an alias to add all files and commit - Declare coauthors in
co-authored-bytrailers - Update the previous commit with
--amend - Create empty commits with
--allow-empty
reset- Undo commits and keep their changes with
--mixedor--soft - Undo commits and discard their changes with
--keep(not--hard) - Useful commit references for resetting
- Undo commits and keep their changes with
stashandapplystashstashbasics- Push stash entries with a description with
-m - Stash selected files by pathspec
- Stash only unstaged changes with
-kor staged changes with-S - Stash selected hunks interactively with
-p - Automatically stash during merge and rebase with the autostash options
applyapplybasics- Send and receive patches by copy and paste
applyoutside of a Git repository
pushandpullpush- Automatically create upstream branches with
push.autoSetupRemote - Force push with safety features
- Push a commit and its annotated tags with
--follow-tags
- Automatically create upstream branches with
pull- Rebase divergent branches when you pull with
pull.rebase - Make a branch pull from and push to different remotes
- Rebase divergent branches when you pull with
mergeandrebasemerge- Improve conflict display with the
zdiff3style - Open all conflicted files with the
edit-unmergedalias - Enable rerere to reuse recorded (conflict) resolutions
- Pick one side of conflicts with
git restoreorgit merge -X
- Improve conflict display with the
rebase- Control rebasing with interactive mode (
-i) - Top interactive mode actions
- Squash and rebase a branch with
--keep-base - Rebase stacked branches with
--update-refs - Run a command at each step with
-x - Automatically fix up commits with
rebase.autoSquash - Drop already-merged commits with
--empty drop
- Control rebasing with interactive mode (
logandrefloglog- Three levels of detail:
--oneline,--stat, and--patch - Reveal branching structure with
--graph - Filter by changes with the pickaxe options
-Sand-G - Filter by commit message content with
--grep - Restrict time with
--sinceand--until - Sort oldest first with
--reverse - Follow changes to a single file with
--follow - Follow changes to a code block with
-L - Reveal hidden changes in merge commits with
--cc
- Three levels of detail:
reflogreflogbasics- Restore a deleted branch
- Undo a commit amendment
- Undo a bad rebase
blameandbisectblameblamebasics- Blame a code block with
-L - Ignore mass-change commits with
blame.ignoreRevsFile
bisectbisectbasics- Mark a commit as untestable with
git bisect skip - Automate testing with
git bisect run - Automate testing of performance regressions
- Outroduction
- Honourable mentions
- Git features
- Extra tools
- Just for fun
- Further reading
- Git updates
- Git under the hood
- Thank you
- Honourable mentions
Acknowledgements
Many thanks to everyone who has helped me assemble this book.
My gratitude to Linus Torvalds for creating Git, Junio Hamano for maintaining it since 2005, and everyone who has contributed to it. The project is consistently managed and thoroughly documented, so as a stable platform, it’s a joy to use and write about.
Thank you to everyone who has ever written a blog post about Git. I probably read every such post during the research phase and learned a hell of a lot.
Also thanks to the hosts and guests on the two past Git podcasts: Git Minutes and All Things Git. I learned a lot of history trawling the archives.
I’d like to particularly thank all beta and early access readers who gave me feedback: Adrien Cossa, Alex McLarty, Angus Johnson (thanks Dad!), Anthony Sottile, Carles Pina i Estany, Carlton Gibson, Dan O’Leary, Daniel Andrlik, Glenn Dufke, Hugo van Kemenade, James Cooke, Jeroen Janssens, Jonathan Evans, Julius Šėporaitis, Lance Goyke, Ngazetungue Muheue, Pascal Fouque, Rodrigo Girão Serrão, Sage Abdullah, Spark Perreras, Thibaud Colas, and William Berg.
I would also like to thank my dear wife, Mafalda, for helping me find the time to write and prodding me towards the end. And similarly, I am grateful for the support of my parents, brother, sister-in-law, mother-in-law, and extended family.
I thank my baby boy Gerry for looking lovely, especially while sleeping strapped to my chest during the initial authoring process.
And finally, thank you, dear reader, for purchasing this book. I hope you learn some valuable things.
One summary email a week, no spam, I pinky promise.
Related posts:
Tags: git