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 interrogatorscat-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 layerdaemon, 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.