Git Commands - Quick and Dirty

Git is a popular open source Version Control System that allows decentralized management of project repositories.

Here's a quick and dirty guide to common git commands:

This is not a tutorial on how to use git. It's meant as a quick way to look up git commands. Please do not use these commands if you're just learning to use git; kindly follow these links at the bottom of this post to get Git guides and tutorials.

Git Quick Commands Listing

Git Configuration:

Add your name and email (baked into each commit made)

git config --global user.name "Your Name"
git config --global user.email you@example.com

Configure text editor to use (e.g. to use vim)

git config --global core.editor vim

Adding colors

git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto

Listing all configurations set

git config --list

Other useful configurations

git config --global push.default simple
# only push the current branch (instead of pushing all matching)


git config --global branch.autosetuprebase always
# Automatically rebase pulls

Git Basics

Initialize a repository

git init
# initializes a new git repository


git add .
# adds all files in the current directory to the new repo


git commit -m "Initial commit"
# adds a commit to the new repo

Cloning a remote repository

git clone https://github.com/USERNAME/REPOSITORYNAME.git
# clone repository via https


git clone username@host:/path/to/repository
# clone repository via ssh

Adding files to repository

git add .
# adds all in the current directory to staging area


git add -A # perfoms git add .; git add -u

# Add all files (new, modified,deletions) to index (stage)


git add filename.txt
# Add specific files to staging area

Listing files and tracking status

git ls-files;
# List tracked files


git ls-files --others  # add --directory for directories

# Lists all untracked files

Removing a file from tracking

# Unstage a file but preserve it's contents

git reset filename

# Remove files from index, stage it's deletion from HEAD

git rm filename

To prevent tracking of files; add the file or directory to the .gitignore file (each file/directory on a new line).

Committing

git commit  
# will prompt for a commit message in the configured text editor


git commit -m "Fixes stuff x"

git commit -am "The commit message here"
# Quick Add & Commit - add all modified files and commit


# Status of files in index vs Working directory

git status

Resetting and Reverting Repo

Revert to previous commit (graceful - does not delete history)

git revert HEAD
# git revert [SHA-1]

Undo changes you've made to a file i.e. and replace it with the HEAD version.

git checkout -- myfile
# git checkout -- [FILENAME]

Reset to previous state: Do not use if already commited to shared remote

git reset --hard HEAD
# git reset --hard [SHA-1] # Reset completely delete history and staged


git reset --soft HEAD
# git reset --soft [SHA-1] # does not touch staging area or working tree

Re-clone from a remote repository; will loose changes not in the remote. (e.g if local git corrupt)

rm -fr .git
git init
git remote add origin [your-git-remote-url]
git fetch
git reset --mixed origin/master
git branch --set-upstream-to=origin/master master  

Git Branches

# Create local branch

git branch branchname

# Move/switch to a branch

git checkout branchname

# Create and switch to branch

git checkout -b branchname

# Fetch file from another branch

git checkout branchtwo -- path/to/file

# Push to a new remote branch, e.g. if remote name is origin

git push -u origin branchname

# Delete Local Branch

git branch -d branchname

# Delete remote branch

git push origin :branchname

# Forcefully delete from both local and remote

git branch -D branchname

# Update local database of remote branches (prune deleted)

git fetch -p

# Checkout branches with latest commits #esp for cleaning old branches

git for-each-ref --sort=-committerdate --format='%(refname:short) %(committerdate:short)'

Git merge

Before merging, checkout to branch you want to merge to:

git checkout master

# Merge local branch

git merge branchname

# Always generate merge commit even on fast-forward

git merge --no-ff branchname

# List branches that have been merged to current branch (e.g master)

git branch --merged

git branch --no-merged  #list branches that haven't been merged to current


# Delete merged branches

git branch --merged | xargs git branch -d

Merge remote branch

# Update the remote

git fetch origin
# Merge remote branch

git merge origin/branchname

# SHORTCUT - Fetch and merge tracked branch

git pull

Rewriting Git History

NOTE: Do not rewrite public commits/history

# Updates staged changes to previous commit message.(i.e replaces the previous commit)

git commit --amend

Git Rebase

Moving a branch to a new base commit (an ID, a branch name, a tag, or a relative reference to HEAD)

git rebase v0.2.2
# NOTE - all commits v0.2.2..HEAD will be rewritten

Interactive Rebasing

Changing multiple commit messages. git rebase -i 9fceb02 (9fceb02 is an example ID) provides an interactive text editor for modifying all commits after the base specified (eg 9fceb02)

git rebase -i HEAD~3
# Modify all commits after base specified (HEAD~3)


# Replace 'pick' command with rebasing command e.g

pick 6fceb02 Added this thing
squash 9fabb3a Awesome Featured added
squash a3a44as I changed stuff
# All squashed commit will be combined into the single 'picked' commit

# Note: Another text editor for combined commit messages opens

Other Interactive Rebase Commands:

  • p, pick - use commit
  • r, reword - use commit, but edit the commit message
  • e, edit - use commit, but stop for amending
  • s, squash - use commit, but meld into previous commit
  • f, fixup - like "squash", but discard this commit's log message
  • x, exec - run command (the rest of the line) using shell

Interactive Rebasing Tips

To reorder commits, reorder the lines; they are executed from top to bottom.
If you remove a line, THAT COMMIT WILL BE LOST
However, if you remove everything, the rebase will be aborted.
Empty commits are commented out

Working with Remotes

Adding remote - Connecting local repo with a remote repo (for example a repo on github)

git remote add origin https://github.com/USERNAME/REPOSITORY.git
#git remote add [name] [repourl]


# Verify remotes - List existing remotes

git remote -v

# List all remote branches

git branch -r

# Remove remote

git remote remove origin

# Replace remote url

git remote set-url origin https://github.com/USERNAME/REPOSITORY2.git

# To check out commits on an upstream master

git log --oneline master..origin/master

# Merge remote branch eg upstream master into current branch

git merge origin/master

# Rebase (fetch remote branch and merge)

git pull --rebase remote

# Fetch all remotes

git fetch --all #git fetch [remotename] #to fetch single remote


#push to a new remote branch

git push -u origin branchname

Stashing

Stash - Store modified tracked files and staged changes on a stach for reapplying later

#push stash onto stack

git stash

# Store stash with message

git stash save 'A custom message'

# List stored stashes

git stash list

# Reapply most recent stash

git stash apply
#for older stashes pick from list e.g git stash apply stash@{1}


# Remove stash from stack

git stash drop stash@{0}
#drops stash reference or if no parameter drops latest stash


# Clear all stashes

git stash clear

# Apply latest stash and remove from stack

git stash pop

Useful Commands

History - Checkout the history of your commits

git log --oneline --graph --decorate --all --color

# Filter logs

git log --author=author
git log --after="MMM DD YYYY"
git log --before="MMM DD YYYY"
git log --grep REGEXP  # Commits with matches to regular expression


#list history of file

git log --follow filename

# Show changes to file

git whatchanged file

# Show author of each line in file

git blame file

# Search through repo history

git rev-list --all | xargs git grep -F 'searchstring'
#git rev-list --all | xargs git grep 'REGEX' #to search for regular expression

Diff - Compare states

# Compare two commits

git diff master..upstream/branchname
#git diff HEAD~2..HEAD~1


# Compare staged changes to your last commit

git diff --cached

# Compare working directory to your last commit

git diff HEAD

Tagging

#annotated tag

git tag -a v1.5 -m 'Message Here'

#lightweight tag

git tag v1.5.2
#to create lightweight tag; don’t supply the -a, -s, or -m option


#list tags

git tag

#show tag and related commit

git show v1.2

# Tag older commit

git tag -a v2 9fceb02 -m "Message here"
# git tag -a v1.2 [SHA-1] -m "[your message]"



# Rename tag

git tag newtag oldtag
git tag -d oldtag
git push origin :refs/tags/oldtag
git push --tags

# Adding a message to an existing tag

git tag tagname tagname -f -m "the message"
# creates a tag of the same name with a message and overwrites old tag


# Push referenced tags along with branches

git push --follow-tags

Cleaning

# Perform clean dry-run - show files to delete

git clean -n

# Remove all untracked files from working copy

git clean -f

# Remove all untracked and ignored files and directories from working copy

git clean -fxd

# Cleanup unnecessary files and optimize the local repository

git gc #calls git prune with prunes loose objects older than 2wks


git gc --prune=all #prunes all loose objects

Useful Git Files

  • .gitignore
  • .gitattributes
  • .mailmap
  • .gitmodules

Guides and Tutorials on Git

Git Cheat Sheets (Printable)

September 22, 2014