Cheat Sheets / CI/CD & GitOps

Git for Engineers cheat sheet

84 commands from every lesson of Git for Engineers — Level by Level, on one page.

01 · How Git works

Set up once

git config --global user.name "Your Name"Name recorded in your commits
git config --global user.email you@example.comEmail recorded in your commits
git config --global init.defaultBranch mainNew repositories start on main
git config --global pull.rebase truegit pull rebases instead of creating merge commits
git config --list --show-originEvery setting and the file it comes from

Look inside

git init / git clone <url>Start a repository / copy an existing one
git log --oneline --graph --allThe commit graph with every branch
git cat-file -p HEADThe raw commit object: tree, parent, author, message
git cat-file -p HEAD^{tree}The snapshot (tree) that commit points to
git rev-parse HEADThe full SHA of the current commit
cat .git/HEADWhere HEAD points (usually a branch)

02 · The everyday workflow

See changes

git status -sbShort status with the current branch
git diffUnstaged changes
git diff --stagedWhat the next commit will contain
git diff main...featureWhat a branch changed since it split from main

Stage and commit

git add -pStage change by change (interactive hunks)
git commit -m "fix(api): return 404 for unknown order"Commit with a message
git commit --amendFix the last commit (only if not pushed yet)
git restore --staged <file>Unstage a file

Read history

git log --oneline -20Last 20 commits, one line each
git log -p -- path/to/fileEvery change to one file, with diffs
git log -S "max_connections"Commits that added or removed a string
git blame -L 40,60 app.pyWho last changed lines 40–60, and in which commit
git show <sha>One commit: message and diff

03 · Branching and merging

Branches

git switch -c feature/loginCreate a branch and switch to it
git switch mainGo back to main
git branch -vvLocal branches with their upstream and last commit
git branch -d feature/loginDelete a merged branch (-D forces)

Combine

git merge --ff-only feature/loginMerge only if it's a fast-forward
git merge --no-ff feature/loginAlways create a merge commit
git rebase mainReplay the current branch's commits on top of main
git rebase -i HEAD~4Reorder, squash or reword the last 4 commits

Conflicts

git statusLists conflicted files
git diff --name-only --diff-filter=UOnly the conflicted files
git add <file> && git merge --continueMark resolved and finish a merge
git rebase --continue / --abortContinue or cancel a rebase
git merge --abortCancel a merge and go back

04 · Remotes and pull requests

Remotes

git remote -vWhere fetch and push go
git remote add upstream <url>Add the original repository when working from a fork
git fetch --all --pruneDownload all remote updates, drop deleted branches
git pull --rebaseFetch and replay your local commits on top
git push -u origin feature/xPush a new branch and set its upstream
git push --force-with-leaseOverwrite your own rewritten branch safely

Authentication

ssh-keygen -t ed25519 -C you@example.comCreate an SSH key for the Git server
ssh -T git@github.comTest SSH authentication
git config --global credential.helper cacheCache HTTPS credentials in memory for a while

05 · Branching strategies and releases

Tags and releases

git tag -a v1.4.0 -m "Release 1.4.0"Annotated release tag
git push origin v1.4.0Publish one tag (git push --tags publishes all)
git describe --tagsNearest tag and commits since it, e.g. v1.4.0-3-g3f1c9a0
git log v1.3.0..v1.4.0 --onelineWhat changed between two releases

Release branches and hotfixes

git switch -c release/1.4 v1.4.0Start a release branch from a tag
git cherry-pick -x <sha>Copy a fix onto another branch, recording where it came from
git branch --contains <sha>Which branches already include a commit?

06 · Undo and recovery

Undo, by situation

git restore <file>Discard unstaged changes in a file
git restore --staged <file>Unstage, keep the changes
git reset --soft HEAD~1Undo the last commit, keep its changes staged
git reset --hard origin/mainThrow away local commits and changes, match the remote
git revert <sha>New commit that undoes <sha> (safe on shared branches)
git revert -m 1 <merge-sha>Revert a merge commit

Park, move, find

git stash push -m "wip login"Park uncommitted work
git stash list / git stash popSee / restore parked work
git cherry-pick <sha>Copy one commit onto the current branch
git reflogEverywhere HEAD has been, including 'lost' commits
git branch rescue <sha>Give a lost commit a branch again
git bisect start; git bisect bad; git bisect good v1.3.0Binary-search for the commit that broke something

07 · Repositories for infrastructure and GitOps

Hooks and scanning

pip install pre-commit && pre-commit installEnable the hooks in .pre-commit-config.yaml for this clone
pre-commit run --all-filesRun every hook on the whole repository
gitleaks detect --source . --verboseScan the repository history for secrets
gitleaks protect --stagedScan only what you're about to commit

Signing

git config --global gpg.format sshSign commits with an SSH key
git config --global user.signingkey ~/.ssh/id_ed25519.pubWhich key signs
git config --global commit.gpgsign trueSign every commit
git log --show-signature -1Check the signature on the last commit

History clean-up

git filter-repo --path secrets.env --invert-pathsRemove a file from all history (after rotating the secret)

08 · Large repos and troubleshooting

Faster clones

git clone --depth 1 <url>Only the latest commit (CI builds)
git clone --filter=blob:none <url>Partial clone: file contents fetched on demand
git sparse-checkout set apps/payments charts/Only these folders in the working tree
git lfs track "*.iso"Store large binaries outside normal Git objects
git count-objects -vHHow big the repository really is

Fix common errors

git pull --rebase && git pushPush rejected (non-fast-forward): integrate first
git switch -c rescueIn detached HEAD with new commits: keep them on a branch
ssh -vT git@github.comDebug SSH authentication step by step
git config --global core.autocrlf inputNormalise line endings on commit (Linux/macOS)
git submodule update --init --recursiveFetch submodules after cloning