home blog portfolio Ian Fisher

Git

Distributed version control software. Originally created by Linus Torvalds for developing the Linux kernel.

Why 'distributed'? As opposed to an older generation of 'centralized' version-control systems like CVS, which required you to talk to a central server to even make a commit.

Notorious for its unfriendly command-line interface, nonetheless it remains the de facto standard for open source software.

Git is open-source software that runs on your computer; it is separate from GitHub, a commercial product owned by Microsoft for hosting Git repositories online.

Cheatsheet

Clone repo at single tag

git clone --depth 1 --branch <tag> <url>

Use the stash

git stash push FILE
git stash  # pushes all changes to the stash
git stash pop
git stash apply  # like pop but leaves entry on the stash
git stash drop
git stash clear
git stash list

Discard unstaged changes

git restore FILE

Unstage changes

git restore --staged FILE

Undo last commit

git reset HEAD~1  # keep the changes in index
git reset HEAD~1 --hard  # throw away the changes!

Restore old version of file

git checkout HEAD~20 -- FILE

Search commit logs

git log --grep PATTERN

Show diffs

git diff  # unstaged changes
git diff --staged  # staged changes
git diff HEAD  # unstaged and staged changes
git diff HEAD~20  # changes since commit
git diff HEAD~20 HEAD~10 -- FILE  # changes in between commits

Show earlier version of file

git show HEAD~20:my-file.txt

Branches

# Create a new branch and switch to it
git checkout -b my-new-branch

# Switch to an existing branch
git checkout my-existing-branch

# List branches
git branch

# Delete a branch
git branch -d my-branch

Rebasing and merging

# Interactively rebase
git rebase -i HEAD~5

# Rebase current branch onto master
git rebase master

# Merge master into current branch
git merge master

Remotes

# View list of remote repositories
git remote -v

# Push changes to a remote repository
git push

# Pull changes from a remote repository
git pull

# Push tags to the remote
git push --tags

Tags

# List all tags
git tag

# List tags matching a pattern
git tag -l 'v2.*'

# Create an annotated tag
git tag -a NAME -m MESSAGE

# Show an annotated tag
git show NAME

Store credentials

# omit 'cache ...' to store permanently
$ git config --global credential.helper store 'cache --timeout=3600'

Careful: The passwords are stored in plaintext on the filesystem!