Git Cheat Sheet

Getting Started

Start a new repo:

git init

Clone an existing repo:

git clone <url>

Prepare to Commit

Add untracked file or unstaged changes:

git add <file>

Add all untracked files and unstaged changes:

git add .

Choose which parts of a file to stage:

git add -p

Move file:

git mv <old> <new>

Delete file:

git rm <file>

Tell Git to forget about a file without deleting it:

git rm --cached <file>

Unstage one file:

git reset <file>

Unstage everything:

git reset

Check what you added:

git status

Make Commits

Make a commit (and open text editor to write message):

git commit

Make a commit:

git commit -m 'message'

Commit all unstaged changes:

git commit -am 'message'

Move Between Branches

Switch branches:

git switch <name> OR git checkout <name>

Create a branch:

git switch -c <name> OR git checkout -b <name>

List branches:

git branch

List branches by most recently committed to:

git branch --sort=-committerdate

Delete a branch:

git branch -d <name>

Force delete a branch:

git branch -D <name>

Diff Staged/Unstaged Changes

Diff all staged and unstaged changes:

git diff HEAD

Diff just staged changes:

git diff --staged

Diff just unstaged changes:

git diff

Diff Commits

Show diff between a commit and its parent:

git show <commit>

Diff two commits:

git diff <commit> <commit>

Diff one file since a commit:

git diff <commit> <file>

Show a summary of a diff:

git diff <commit> --stat git show <commit> --stat

Ways to refer to a commit

Every time we say <commit>, you can use any of these:

a branch
main
a tag
v0.1
a commit ID
3e887ab
a remote branch
origin/main
current commit
HEAD
3 commits ago
HEAD^^^ or HEAD~3

Discard Your Changes

Delete unstaged changes to one file:

git checkout <file>

Delete all staged and unstaged changes to one file:

git checkout HEAD <file>

Delete all staged and unstaged changes:

git reset --hard

Delete untracked files:

git clean

'Stash' all staged and unstaged changes:

git stash

Edit History

"Undo" the most recent commit (keep your working directory the same):

git reset HEAD^

Squash the last 5 commits into one:

git rebase -i HEAD~6

Then change "pick" to "fixup" for any commit you want to combine with the previous one

Undo a failed rebase:

git reflog BRANCHNAME

Then manually find the right commit ID in the reflog, then run:

git reset --hard <commit>

Change a commit message (or add a file you forgot):

git commit --amend

Code Archaeology

Look at a branch's history:

git log main git log --graph main git log --oneline

Show every commit that modified a file:

git log <file>

Show every commit that modified a file, including before it was renamed:

git log --follow <file>

Find every commit that added or removed some text:

git log -G banana

Show who last changed each line of a file:

git blame <file>

Combine Diverged Branches

Combine with rebase:

git switch banana git rebase main G A A B B A->B C C B->C D D B->D E E D->E main_label main main_label->C banana_label banana banana_label->E G A A B B A->B C C B->C D D B->D D2 D C->D2 E E D->E E2 E D2->E2 main_label main main_label->C banana_label banana banana_label->E2 lost_label "lost" lost_label->E

Combine with merge:

git switch main git merge banana G A A B B A->B C C B->C D D B->D E E D->E main_label main main_label->C banana_label banana banana_label->E G A A B B A->B C C B->C D D B->D M C->M E E D->E E->M main_label main main_label->M banana_label banana banana_label->E

Combine with squash merge:

git switch main git merge --squash banana git commit G A A B B A->B C C B->C D D B->D E E D->E main_label main main_label->C banana_label banana banana_label->E G A A B B A->B C C B->C D D B->D S D E C->S E E D->E main_label main main_label->S banana_label banana banana_label->E

Bring a branch up to date with another branch (aka "fast-forward merge"):

git switch main git merge banana G A A B B A->B C C B->C D D C->D E E D->E invisible main_label main main_label->C banana_label banana banana_label->E G A A B B A->B C C B->C D D C->D E E D->E main_label main main_label->E banana_label banana banana_label->E

Copy one commit onto the current branch:

git cherry-pick <commit> G A A B B A->B C C B->C D D B->D E E D->E main_label main main_label->C G A A B B A->B C C B->C D D B->D D2 D C->D2 E E D->E main_label main main_label->D2

Restore an Old File

Get the version of a file from another commit:

git checkout <commit> <file> OR git restore <file> --source <commit>

Add a Remote

git remote add <name> <url>

Push Your Changes

Push the main branch to the remote origin:

git push origin main

Push the current branch to its remote "tracking branch":

git push

Push a branch that you've never pushed before:

git push -u origin <name>

Force push:

git push --force-with-lease

Push tags:

git push --tags

Pull Changes

Fetch changes (but don't change any of your local branches):

git fetch origin main

Fetch changes and then rebase your current branch:

git pull --rebase

Fetch changes and then merge them into your current branch:

git pull origin main OR git pull

Fetch all branches:

git fetch --all

Configure Git

Set a config option:

git config user.name 'Your Name'

Set option globally:

git config --global ...

Add an alias:

git config alias.st status

See all possible config options:

man git-config

Important Files

Local git config:

.git/config

Global git config:

~/.gitconfig

List of files to ignore:

.gitignore
scroll-to-top