📖 Guide
Git Commands Cheat Sheet — Complete Reference
Every Git command you need in this cheat sheet, searchable and organized. From basic commits to advanced rebasing.
187 commands across 14 categories
Related tool:Git Command Builder →
Setup & ConfigurationBasic WorkflowBranchingRemote RepositoriesStashingUndoing ChangesRewriting HistoryInspection & ComparisonTaggingAdvancedReflog & RecoverySigning Commits & TagsConflict Reuse (rerere)Resolving Merge Conflicts
Setup & Configuration
| Command | Description |
|---|---|
git init | Initialize a new Git repository in the current directory |
git init <dir>e.g. git init my-project | Create a new repository in the specified directory |
git clone <url>e.g. git clone https://github.com/user/repo.git | Clone a remote repository |
git clone --depth 1 <url> | Shallow clone (latest commit only) — faster for large repos |
git clone --branch <branch> <url>e.g. git clone --branch develop https://github.com/user/repo.git | Clone a specific branch |
git config --global user.name "Name" | Set your global Git username |
git config --global user.email "email" | Set your global Git email |
git config --global core.editor vim | Set default editor for commit messages |
git config --global init.defaultBranch main | Set default branch name for new repos |
git config --list | List all Git configuration settings |
git config --global alias.co checkoute.g. git co main | Create a command alias |
Basic Workflow
| Command | Description |
|---|---|
git status | Show working tree status — modified, staged, untracked files |
git status -s | Short-format status output |
git add <file>e.g. git add index.js | Stage a file for commit |
git add . | Stage all changes in the current directory |
git add -p | Interactively stage hunks — review each change before staging |
git add -A | Stage all changes including deletions |
git commit -m "message" | Commit staged changes with a message |
git commit -am "message" | Stage all tracked files and commit in one step |
git commit --amend | Modify the last commit (message or content) |
git commit --amend --no-edit | Add staged changes to last commit without changing message |
git diff | Show unstaged changesTry the Diff Checker → |
git diff --staged | Show staged changes (ready to commit) |
git diff HEAD | Show all changes since last commit (staged + unstaged) |
git diff <branch1> <branch2>e.g. git diff main develop | Compare two branches |
git log | Show commit history |
git log --oneline | Compact commit history (one line per commit) |
git log --oneline --graph | Visualize branch history as ASCII graph |
git log -n 5 | Show last 5 commits |
git log --author="name" | Filter commits by author |
git log --since="2024-01-01" | Show commits after a date |
git log -p <file> | Show commit history with diffs for a specific file |
Branching
| Command | Description |
|---|---|
git branch | List local branches |
git branch -a | List all branches (local + remote) |
git branch -v | List branches with last commit info |
git branch <name>e.g. git branch feature/login | Create a new branch |
git branch -d <name>e.g. git branch -d feature/login | Delete a merged branch |
git branch -D <name> | Force delete a branch (even if unmerged) |
git branch -m <old> <new>e.g. git branch -m old-name new-name | Rename a branch |
git switch <branch>e.g. git switch develop | Switch to a branch (modern syntax) |
git switch -c <name>e.g. git switch -c feature/auth | Create and switch to a new branch |
git checkout <branch> | Switch to a branch (classic syntax) |
git checkout -b <name> | Create and switch to a new branch (classic) |
git merge <branch>e.g. git merge feature/login | Merge a branch into the current branch |
git merge --no-ff <branch> | Merge with a merge commit (no fast-forward) |
git merge --squash <branch> | Squash all commits from branch into one |
git merge --abort | Abort a merge in progress (conflicts) |
Remote Repositories
| Command | Description |
|---|---|
git remote -v | List remote repositories with URLs |
git remote add <name> <url>e.g. git remote add origin https://github.com/user/repo.git | Add a remote repository |
git remote remove <name> | Remove a remote |
git remote rename <old> <new> | Rename a remote |
git remote set-url <name> <url> | Change a remote's URL |
git fetch | Download remote changes without merging |
git fetch --all | Fetch from all remotes |
git fetch --prune | Fetch and remove stale remote-tracking branches |
git pull | Fetch and merge remote changes |
git pull --rebase | Fetch and rebase instead of merge (cleaner history) |
git push | Push commits to the remote |
git push -u origin <branch>e.g. git push -u origin feature/auth | Push and set upstream for a new branch |
git push --force-with-lease | Force push safely (fails if remote has new commits) |
git push origin --delete <branch> | Delete a remote branch |
git push --tags | Push all tags to remote |
Stashing
| Command | Description |
|---|---|
git stash | Stash working directory changes |
git stash push -m "message" | Stash with a descriptive message |
git stash push -p | Interactively stash specific hunks |
git stash list | List all stashes |
git stash show | Show stash diff summary |
git stash show -p | Show full stash diff |
git stash pop | Apply most recent stash and remove it |
git stash apply | Apply most recent stash (keep in stash list) |
git stash apply stash@{2} | Apply a specific stash |
git stash drop stash@{0} | Delete a specific stash |
git stash clear | Delete all stashes |
git stash branch <name>e.g. git stash branch fix-from-stash | Create a branch from a stash |
Undoing Changes
| Command | Description |
|---|---|
git restore <file>e.g. git restore index.js | Discard working directory changes |
git restore --staged <file> | Unstage a file (keep changes) |
git restore --source=HEAD~1 <file> | Restore file from a previous commit |
git reset HEAD <file> | Unstage a file (classic syntax) |
git reset --soft HEAD~1 | Undo last commit, keep changes staged |
git reset --mixed HEAD~1 | Undo last commit, keep changes unstaged (default) |
git reset --hard HEAD~1 | Undo last commit and discard all changes ⚠️ |
git reset --hard origin/main | Reset branch to match remote ⚠️ |
git revert <commit>e.g. git revert abc1234 | Create a new commit that undoes a previous commit |
git revert HEAD | Revert the last commit |
git revert --no-commit <commit> | Revert without auto-committing |
git clean -fd | Remove untracked files and directories ⚠️ |
git clean -fdn | Dry run — show what would be removed |
git checkout -- <file> | Discard changes (classic syntax) |
Rewriting History
| Command | Description |
|---|---|
git rebase <branch>e.g. git rebase main | Rebase current branch onto another |
git rebase -i HEAD~3 | Interactive rebase — edit, squash, reorder last 3 commits |
git rebase --abort | Abort a rebase in progress |
git rebase --continue | Continue rebase after resolving conflicts |
git rebase --skip | Skip the current commit during rebase |
git cherry-pick <commit>e.g. git cherry-pick abc1234 | Apply a specific commit to current branch |
git cherry-pick <a>..<b> | Cherry-pick a range of commits |
git cherry-pick --no-commit <commit> | Apply changes without committing |
git commit --fixup <commit> | Create a fixup commit for later autosquash |
git rebase -i --autosquash HEAD~5 | Auto-squash fixup commits during interactive rebase |
Inspection & Comparison
| Command | Description |
|---|---|
git show <commit>e.g. git show abc1234 | Show details and diff for a commit |
git show HEAD:<file> | Show file content at a specific commit |
git blame <file>e.g. git blame src/app.js | Show who last modified each line |
git blame -L 10,20 <file> | Blame specific line range |
git log --stat | Show commit history with file change stats |
git log --all --oneline --graph | Full visual branch history |
git shortlog -sn | Show commit count per author |
git diff --name-only | Show only changed filenames |
git diff --stat | Show change statistics |
git bisect start | Start binary search for a bug-introducing commit |
git bisect bad | Mark current commit as bad |
git bisect good <commit> | Mark a commit as good |
git bisect reset | End bisect session |
git bisect skip | Skip the current commit when it can't be tested (e.g. doesn't build) |
git bisect run <script> | Automate bisection — script must exit 0 for good, 1-127 for bad, 125 to skip |
git bisect log | Show every bisection step performed so far |
git bisect replay <logfile> | Restore a bisect session from a previously saved log |
git bisect visualize | View remaining suspect commits in gitk (or git log if no GUI) |
git reflog | Show history of HEAD movements (recover lost commits) |
git blame -M <file> | Detect lines moved or copied within the same file, attributing them to their original commit |
git blame -C <file> | Detect lines moved or copied from other files changed in the same commit (stack -C -C or -C -C -C to widen the search) |
git blame -w <file> | Ignore whitespace-only changes when attributing lines |
git log -S"<string>"e.g. git log -S"frotz(nitfol" | Find commits that added or removed an exact occurrence of a string (pickaxe search) |
git log -G"<regex>" | Find commits whose diff contains an added/removed line matching a regexTry the Regex Tester → |
git log -S"<string>" --pickaxe-regex | Treat the -S search string as an extended POSIX regex instead of a literal string |
Tagging
| Command | Description |
|---|---|
git tag | List all tags |
git tag <name>e.g. git tag v1.0.0 | Create a lightweight tag |
git tag -a <name> -m "message"e.g. git tag -a v1.0.0 -m "Release 1.0" | Create an annotated tag |
git tag -a <name> <commit> | Tag a specific commit |
git tag -d <name> | Delete a local tag |
git push origin <tag> | Push a specific tag to remote |
git push origin --tags | Push all tags to remote |
git push origin --delete <tag> | Delete a remote tag |
git describe --tags | Describe current commit relative to nearest tag |
Advanced
| Command | Description |
|---|---|
git submodule add <url> <path> | Add a submodule |
git submodule update --init --recursive | Initialize and update all submodules |
git submodule foreach git pull | Update all submodules to latest |
git worktree add <path> <branch> | Create a linked working tree for a branch |
git worktree list | List all working trees |
git worktree remove <path> | Remove a working tree |
git worktree add -b <branch> <path> [<commit-ish>] | Create a worktree AND a new branch starting at <commit-ish> (defaults to HEAD) in one step |
git worktree prune | Clean up worktree metadata after a working tree was removed manually instead of via 'worktree remove' |
git sparse-checkout init | Enable sparse checkout (partial repo) |
git sparse-checkout set <dir> | Only check out specific directories |
git sparse-checkout add <dir> | Add more directories to an existing sparse checkout without replacing it — cone mode (directory-based patterns) has been the default since Git 2.37 |
git sparse-checkout list | List the directories/patterns currently included in the sparse checkout |
git sparse-checkout disable | Disable sparse checkout and restore all tracked files to the working directory |
git submodule status | Show the checked-out commit SHA and sync status for each submodule |
git submodule sync | Update submodules' recorded remote URLs to match .gitmodules |
git submodule update --remote | Update submodules to the latest commit on their tracked remote branch, instead of the superproject's recorded SHA |
git clone --recurse-submodules <url> | Clone a repository and initialize/checkout its submodules in one step |
git archive --format=zip HEAD > repo.zip | Export repo as a zip archive |
git gc | Run garbage collection to optimize repo |
git maintenance start | Enable scheduled background maintenance (commit-graph, gc, prefetch, and more) for this repo |
git maintenance run --task=gc | Run one specific maintenance task on demand instead of the full scheduled set |
git filter-branch | Rewrites history by running a filter over every commit — the official docs call its use "not recommended" due to safety and performance pitfalls; use git filter-repo (a separate, official-recommended tool) instead |
git fsck | Verify integrity of the repository |
git grep "pattern"e.g. git grep "TODO" | Search tracked files for a pattern |
git log --all -- <file> | Find all commits that touched a deleted file |
git rev-parse HEAD | Get the full SHA of current commit |
git rev-list --count HEAD | Count total commits in current branch |
Reflog & Recovery
| Command | Description |
|---|---|
git reflog show <ref>e.g. git reflog show main | Show the reflog for a specific ref instead of HEAD — defaults to HEAD when omitted |
git checkout -b recovered-branch HEAD@{5} | Recover a commit that a branch move/reset left behind, by branching from a reflog entry |
git reset --hard HEAD@{1} | Undo a bad reset/rebase/commit by resetting back to where HEAD pointed one move ago, per the reflog ⚠️ |
git fsck --unreachable | List objects that exist but aren't reachable from any ref — useful after a reflog entry has expired |
git fsck --lost-found | Write dangling commits/blobs into .git/lost-found/ so they can be inspected and recovered |
Signing Commits & Tags
| Command | Description |
|---|---|
git commit -S | Sign a commit with the configured key (GPG, X.509, or SSH depending on gpg.format) |
git config --global commit.gpgsign true | Sign every commit by default without passing -S each time |
git tag -s <name> -m "message" | Create a cryptographically signed annotated tag |
git tag -v <name> | Verify the cryptographic signature of a tag |
git log --show-signature | Show each commit's GPG signature verification status in the log |
git config --global gpg.format ssh | Use an SSH key instead of GPG/X.509 for signing (Git 2.34+) |
git config --global user.signingkey ~/.ssh/id_ed25519.pub | Set the SSH public key to sign with when gpg.format is ssh |
git commit --no-gpg-sign | Skip signing for one commit, overriding commit.gpgsign / a prior --gpg-sign |
Conflict Reuse (rerere)
| Command | Description |
|---|---|
git config --global rerere.enabled true | Enable rerere — Git will record how you resolve a conflict and auto-replay that resolution if the same conflict recurs |
git rerere status | List paths with conflicts whose resolution rerere will record |
git rerere diff | Show the diff of the currently recorded conflict resolution |
git rerere remaining | List conflicted paths rerere could not auto-resolve |
git rerere forget <path> | Discard the recorded resolution for a path so rerere asks again next time |
git rerere gc | Prune old recorded resolutions (unresolved conflicts older than 15 days, resolved ones older than 60, by default) |
Resolving Merge Conflicts
| Command | Description |
|---|---|
git diff --diff-filter=U | List only the currently unmerged (conflicted) files |
git checkout --ours -- <file> | Resolve a conflict by keeping your side of a file (stage #2) |
git checkout --theirs -- <file> | Resolve a conflict by keeping the other side of a file (stage #3) — gotcha: during a rebase these are swapped, so --ours means the branch being rebased onto |
git log --merge -p <path> | Show the diffs from each side of an in-progress, unresolved merge for a path |
git show :1:<file> | Show the common-ancestor version of a conflicted file |
git show :2:<file> | Show 'our' version of a conflicted file |
git show :3:<file> | Show 'their' version of a conflicted file |
git mergetool | Launch a configured graphical merge tool to resolve conflicts interactively |
git merge --continue | Conclude a merge after staging resolved files — equivalent to git commit, but checks a merge is actually in progress first |
📖 Free, searchable command reference. Bookmark this page for quick access.