Cheat sheet · No. III
Git.
Git is a content-addressed graph of commits. Almost every command that feels scary just moves a pointer — your work is rarely gone, it is usually just unreferenced.
The reference
DAILY
git status -sb- Short status with branch
git add -p- Stage hunks interactively
git commit -v- Commit with diff in editor
git diff --cached- What's staged
git log --oneline -20- Recent commits
git log --graph --oneline --all- Branch graph
UNDO
git restore <file>- Discard unstaged change
git restore --staged <file>- Unstage
git commit --amend- Edit last commit
git reset HEAD~1- Undo commit, keep changes
git reset --hard HEAD~1- Undo and discard
git revert <sha>- Inverse commit (safe for shared history)
BRANCH & MERGE
git switch -c <name>- Create + switch
git switch -- Previous branch
git merge --no-ff <b>- Merge with merge commit
git rebase <b>- Replay onto base
git rebase -i HEAD~5- Interactive rewrite
git cherry-pick <sha>- Pull one commit over
RECOVER
git reflog- Log of HEAD movements (90 days)
git reset --hard HEAD@{2}- Jump to reflog entry
git stash- Save unfinished work
git stash pop- Bring it back
git fsck --lost-found- Find dangling commits
REMOTE
git fetch --prune- Update tracking, drop deleted
git pull --rebase- Pull without merge commit
git push -u origin <b>- Push and set upstream
git push --force-with-lease- Safe force-push
SEARCH
git log -S "text"- Commits that add/remove "text"
git log -G "regex"- Commits matching regex in diff
git blame <file>- Per-line authorship
git bisect start- Binary-search for the breaking commit
Field notes
reflog is the safety net
Even after a hard reset or a botched rebase, HEAD@{n} remembers where you were for about 90 days. You can almost always get back.
revert vs reset
revert adds an inverse commit — safe on shared branches. reset rewrites history — only on branches no one else has pulled.
Force safely
Use --force-with-lease, never plain --force: it refuses to clobber commits you have not seen, so you never overwrite a teammate.
Commit small, tidy later
Messy local history is free to clean up with rebase -i before you push. Pushed history is not — so commit often, polish before sharing.