Git Cheatsheet
Staging and Committing
Use this Git reference while you build software engineering projects, review code, or refresh the syntax you reach for most.
Staging Files (git add)
git add <file> # Stage a specific file git add <dir>/ # Stage all changes in a directory git add . # Stage all changes in the current directory (recursive) git add -A # Stage all changes across the entire working tree git add *.js # Stage files matching a glob git add -u # Stage modifications and deletions only (not new files) git add -p # Interactively stage hunks (patch mode) git add -i # Interactive staging menu git add -N <file> # Intend to add (marks untracked file for git diff)
Patch Mode (-p) Interactive Commands
| Key | Action |
|---|---|
y | Stage this hunk |
n | Skip this hunk |
s | Split hunk into smaller hunks |
e | Manually edit the hunk |
q | Quit, don't stage remaining |
a | Stage this and all remaining hunks in the file |
d | Skip this and all remaining hunks in the file |
? | Print help |
Unstaging Files (git restore / git reset)
git restore --staged <file> # Unstage a file (keep changes in working tree) git restore --staged . # Unstage everything git reset HEAD <file> # Same as restore --staged (older syntax) git reset HEAD # Unstage all staged changes
Discarding Working Tree Changes
git restore <file> # Discard unstaged changes in a file (irreversible) git restore . # Discard all unstaged changes git restore --source=HEAD~2 <file> # Restore file to state at HEAD~2 git checkout -- <file> # Older equivalent of git restore <file>
Warning:
git restore <file>permanently discards uncommitted changes.
Committing (git commit)
git commit -m "message" # Commit staged changes with inline message git commit # Open editor for commit message git commit -a -m "message" # Stage all tracked-file changes and commit git commit --amend # Amend the last commit (message or staged content) git commit --amend --no-edit # Amend last commit without changing the message git commit --amend -m "new msg" # Amend last commit and change message git commit --allow-empty -m "trigger CI" # Commit with no changes git commit -v # Show diff in editor while writing commit message git commit --dry-run # Show what would be committed without committing git commit --no-verify # Skip pre-commit and commit-msg hooks
Commit with Multiple Lines
git commit -m "subject line More detailed explanation after a blank line. Can span multiple paragraphs."
Commit Signing
git commit -S -m "signed commit" # GPG-sign this commit git commit --gpg-sign=<key> -m "msg" # Sign with a specific key
Viewing Staged Changes (Before Commit)
git diff --staged # Show diff of what is staged vs. last commit git diff --cached # Identical to --staged (older alias) git diff --staged --stat # Summary of staged changes git diff --staged <file> # Staged diff for a specific file only
Viewing Unstaged Changes
git diff # Diff of working tree vs. staging area git diff <file> # Diff for a specific file git diff HEAD # Diff of working tree (all changes) vs. HEAD git diff --word-diff # Show word-level diff instead of line-level git diff --stat # Show summary of changed files
Removing and Moving Files
git rm <file> # Remove file from working tree and stage the removal git rm --cached <file> # Remove from index only (keep file on disk) git rm -r <dir>/ # Recursively remove a directory git mv <old> <new> # Rename/move a file and stage the change
Commit Message Conventions (Conventional Commits)
<type>(<scope>): <short summary>
[optional body]
[optional footer(s)]Common types: feat, fix, docs, style, refactor, test, chore, perf, ci, build
# Examples git commit -m "feat(auth): add passwordless login" git commit -m "fix(api): handle null user in billing check" git commit -m "docs: update README with setup instructions"
Checking What Will Be Committed
git status # High-level view of staged/unstaged/untracked git diff --staged --name-only # Just the filenames that are staged git diff --staged --name-status # Filenames with M/A/D status codes