Progress:
TIER 2

Intermediate

Ancillary, foreign-SCM bridges, and pure helpers. Where porcelain stops being the whole story.

Welcome to Tier 2 — intermediate. The "I've been using Git for a year and I want to actually understand it" tier.

This tier is wider than it is deep. It covers the ancillary commands — the manipulators (config, reflog, repack, remote, replace), the interrogators (blame, fsck, count-objects, merge-tree), the foreign-SCM bridges (svn, p4, cvs — yes, still relevant in 2026 if you're rescuing legacy code), and the pure helpers (check-attr, check-ignore, credential, hook).

A lot of these commands you'll use rarely. That's fine. The point of knowing them isn't to use them daily — it's so you recognize the right tool when the situation calls for it. When your repo's blowing up to 12 GB, you should know that count-objects -v and repack -ad exist before you start googling. When git filter-branch lights up in a Stack Overflow answer, you should know it's been deprecated for years and git filter-repo is the right answer.

Some modules in this tier are deliberately short. git mailinfo doesn't need a page-long explanation; it parses an email and you'll never call it directly. The 12-section template still applies, but a section may collapse to one sentence. That's by design. The full layout means you always know where to look.

📚 Modules in this tier (58)

M00
Tier 2 intro — start here
Mindset, prerequisites, what you'll know by the end.
M01
git config
Layered config: system, global, local, worktree. Learn the layers.
M02
git fast-export
Half of repo-to-repo migration. Pairs with fast-import.
M03
git fast-import
How most VCS-import tools (svn, hg, bzr) get into Git.
M04
git filter-branch
Don't. Use git filter-repo. Listed for completeness.
M05
git mergetool
Hands conflicts to vimdiff/meld/kdiff3/etc.
M06
git pack-refs
Turns hundreds of loose ref files into one. fsck-friendly.
M07
git prune
Usually invoked indirectly by gc.
M08
git reflog
Your safety net. Almost everything you 'lost' is in here.
M09
git refs
Switching from files to reftable, etc. Plumbing-adjacent.
M10
git remote
Add, rename, prune, set URLs.
M11
git repack
Loose objects in, packfiles out.
M12
git replace
Local-only object aliasing. Niche, occasionally lifesaving.
M13
git annotate
POSIX-style output. Still works.
M14
git blame
Who broke this and when. Be kind in the comments.
M15
git bugreport
Dumps environment, version, config — for filing bugs upstream.
M16
git count-objects
Loose objects, packs, sizes. Quick health check.
M17
git diagnose
Newer than bugreport. More artifacts.
M18
git difftool
Hands diffs to meld/vimdiff/etc.
M19
git fsck
Find dangling and broken objects.
M20
git help
git help <cmd>, or git <cmd> --help. Read the manuals.
M21
git instaweb
Browse your repo locally on 127.0.0.1.
M22
git merge-tree
What would happen if I merged X into Y? Without touching either.
M23
git rerere
Re-Recorded Resolution. Conflict autopilot — once you opt in.
M24
git show-branch
An ancient ASCII multi-branch viewer. Sometimes still the right tool.
M25
git verify-commit
Validates signed commits.
M26
git verify-tag
Validates signed tags. Releases love these.
M27
git version
Sometimes the answer is 'upgrade'.
M28
git whatchanged
Like git log --raw with a different default. Mostly historical.
M29
gitweb
Web frontend that ships with Git. Old. Still works.
M30
git archimport
If you still have any of these, this is how you escape.
M31
git cvsexportcommit
One-way bridge for the holdouts.
M32
git cvsimport
Migration tool for the historical.
M33
git cvsserver
Pretend to be CVS so old clients can pull.
M34
git imap-send
Stage email-patches in your drafts folder.
M35
git p4
A real-world coexistence tool when you can't migrate yet.
M36
git quiltimport
Old kernel/userspace workflow ingestion.
M37
git request-pull
The pre-Github-PR way to ask for a merge.
M38
git send-email
format-patch + sendmail in one. Still the kernel's workflow.
M39
git svn
Workable if your team is mostly on Git but origin is svn.
M40
git check-attr
Why is this file being treated like text? This tells you.
M41
git check-ignore
Tells you which .gitignore rule matched.
M42
git check-mailmap
Apply .mailmap to a name to see the canonical form.
M43
git check-ref-format
Is 'feature/$thing' a legal branch name? Ask this.
M44
git column
Internal formatter. Used by ls-files and friends.
M45
git credential
Used internally to fetch and store creds.
M46
git credential-cache
Caches creds for a few minutes.
M47
git credential-store
Writes creds in cleartext. Convenient. Insecure. Know the trade.
M48
git fmt-merge-msg
Used by git merge to compose its commit message.
M49
git hook
Small porcelain over the .git/hooks dir.
M50
git interpret-trailers
The Co-authored-by:/Signed-off-by: handler.
M51
git mailinfo
Used by git am internally.
M52
git mailsplit
Pre-step for git am on a big mailbox.
M53
git merge-one-file
What .gitattributes merge=union etc. dispatches to.
M54
git patch-id
Same change, different commit IDs — patch-id matches them up.
M55
git sh-i18n
Internationalization plumbing for shell-based commands.
M56
git sh-setup
Sourced by Git's shell-script subcommands.
M57
git stripspace
Used by hooks and editors to tidy commit messages.