Progress:
TIER 3

Expert

Plumbing. Transport. The content-addressable filesystem with a tracker bolted on top.

Welcome to Tier 3 — expert. This is where Git stops being "a content tracker" and reveals itself as a content-addressable filesystem with a tracker bolted on top. Pay attention.

The plumbing is the actual VCS. Porcelain is a thin shell around it. Once you can read plumbing, you can debug any porcelain weirdness, write your own scripts that do exactly what you want, and stop being mystified by the terms in the docs.

Tier 3 covers:

The plumbing manipulators — the commands that mutate the object database and the index directly: hash-object, update-index, commit-tree, write-tree, update-ref, read-tree, pack-objects. Used together, these are git commit. Not metaphorically — literally.

The plumbing interrogators — cat-file, ls-tree, rev-parse, rev-list, for-each-ref, merge-base. Tools that let you read the object DB and refs at any granularity. Every shell script you'll ever write to do "something Git-related but custom" is built from these.

The transport layer — daemon, http-backend, fetch-pack, upload-pack, send-pack, receive-pack. How clones, fetches, and pushes actually work over the wire. If you've ever wondered what happens between git push and the remote saying "ok," it's in this tier.

By the end of Tier 3 you'll be able to: read any commit hash and walk its tree by hand with cat-file; build a commit from scratch using hash-object/mktree/commit-tree/update-ref; understand the wire protocol well enough to debug a stuck push; and recognize, when you're staring at someone's clever-looking shell incantation, exactly what it's doing.

Then you go to the certification page, print it, and frame it.

📚 Modules in this tier (56)

M00○
Tier 3 intro — start here
Mindset, prerequisites, what you'll know by the end.
M01○
git apply
Lower-level than git am. No commit, no email parsing — just patch.
M02○
git checkout-index
The plumbing that 'switch' uses to write files.
M03○
git commit-graph
Massive log/walk speedup. Modern repos all want this.
M04○
git commit-tree
The atom of git commit. Take a tree SHA, get a commit SHA.
M05○
git hash-object
Where the SHA-1/SHA-256 magic happens.
M06○
git index-pack
Turns received pack into a usable indexed pack.
M07○
git merge-file
Merge engine you can drive on arbitrary files outside a repo.
M08○
git merge-index
How merges actually wire conflicts into the index.
M09○
git mktag
Plumbing for git tag -a.
M10○
git mktree
Build a tree by hand from blob SHAs.
M11○
git multi-pack-index
MIDX. Big perf win on giant repos with many packs.
M12○
git pack-objects
The compression engine behind clone, fetch, push, gc.
M13○
git prune-packed
Tidies up after pack-objects.
M14○
git read-tree
What 'switch' uses to load a different tree into the index.
M15○
git replay
Newer, library-friendly cousin of cherry-pick.
M16○
git symbolic-ref
How HEAD points at a branch instead of a SHA.
M17○
git unpack-objects
Reverse of pack-objects.
M18○
git update-index
The hammer beneath git add.
M19○
git update-ref
Move a branch tip without touching HEAD.
M20○
git write-tree
Counterpart to commit-tree. Together they implement git commit.
M21○
git cat-file
The object-database microscope. Learn -p, -t, -s, --batch.
M22○
git cherry
Used to detect what you've already cherry-picked upstream.
M23○
git diff-files
What git diff (no args) is built on.
M24○
git diff-index
What git diff --cached is built on.
M25○
git diff-pairs
Plumbing for tools that already know which blobs to diff.
M26○
git diff-tree
What git show uses internally.
M27○
git for-each-ref
The duct tape of any ref-related script you'll ever write.
M28○
git for-each-repo
Multi-repo orchestration in one binary.
M29○
git get-tar-commit-id
Recover provenance from a tarball produced by git archive.
M30○
git last-modified
Faster than 'log -- path' in a loop.
M31○
git ls-files
Tracked, ignored, untracked — slice it however.
M32○
git ls-remote
Curl for Git remotes.
M33○
git ls-tree
ls(1) for git trees.
M34○
git merge-base
How merge and rebase decide what's new on each side.
M35○
git name-rev
Reverse of rev-parse: SHA in, name out.
M36○
git pack-redundant
Helps shrink an over-packed repo. Deprecated in newer Gits.
M37○
git repo
Newer porcelain-ish helper for repo metadata.
M38○
git rev-list
Engine behind git log, cherry, bisect — the DAG walker.
M39○
git rev-parse
Turn HEAD~3 / origin/main / :/typo / etc. into a SHA.
M40○
git show-index
Inspect what's inside a pack index.
M41○
git show-ref
for-each-ref's older, simpler sibling.
M42○
git unpack-file
Plumbing helpful in mergetool wrappers.
M43○
git var
Editor, pager, default branch — what Git thinks they are.
M44○
git verify-pack
Use after a suspicious push/clone to confirm sanity.
M45○
git daemon
The simplest possible Git server. No auth, no encryption.
M46○
git fetch-pack
What 'fetch' invokes to negotiate and receive packs.
M47○
git http-backend
The thing your nginx/apache mounts to serve repos over HTTPS.
M48○
git send-pack
What 'push' invokes to ship a pack to the remote.
M49○
git update-server-info
What dumb-HTTP servers need run after each push.
M50○
git http-fetch
Object-by-object download over plain HTTP.
M51○
git http-push
Object-by-object upload over plain HTTP. Almost never wanted.
M52○
git receive-pack
Lives on the remote. Validates and stores incoming packs.
M53○
git shell
Restricted shell for SSH-only Git accounts.
M54○
git upload-archive
Streams a tarball back across the wire.
M55○
git upload-pack
The complement to fetch-pack.