Git cheatsheet

Awesome git client cheatsheet.

Setup

Show current configuration:
1
$ git config --list
Show repository configuration:
1
$ git config --local --list
Show global configuration:
1
$ git config --global --list
Show system configuration:
1
$ git config --system --list
Set a name that is identifiable for credit when review version history:
1
$ git config --global user.name “[firstname lastname]”
Set an email address that will be associated with each history marker:
1
$ git config --global user.email “[valid-email]”
Set automatic command line coloring for Git for easy reviewing:
1
$ git config --global color.ui auto
Set global editor for commit
1
$ git config --global core.editor vi

Configuration Files

Repository specific configuration file [–local]:
1
<repo>/.git/config
User-specific configuration file [–global]:
1
~/.gitconfig
System-wide configuration file [–system]:
1
/etc/gitconfig

Create

Clone an existing repository:

There are two ways:

Via SSH

1
$ git clone ssh://[email protected]/repo.git

Via HTTP

1
$ git clone http://domain.com/user/repo.git
Create a new local repository:
1
$ git init

Local Changes

Changes in working directory:
1
$ git status
Changes to tracked files:
1
$ git diff
Add all current changes to the next commit:
1
$ git add .
Add some changes in <file> to the next commit:
1
$ git add -p <file>
Commit all local changes in tracked files:
1
$ git commit -a
Commit previously staged changes:
1
$ git commit
Commit with message:
1
$ git commit -m 'message here'
Commit skipping the staging area and adding message:
1
$ git commit -am 'message here'
Commit to some previous date:
1
$ git commit --date="`date --date='n day ago'`" -am "<Commit Message Here>"
Change last commit:

Don’t amend published commits!

1
$ git commit -a --amend
Amend with last commit but use the previous commit log message

Don’t amend published commits!

1
$ git commit --amend --no-edit
Change committer date of last commit:
1
GIT_COMMITTER_DATE="date" git commit --amend
Change Author date of last commit:
1
$ git commit --amend --date="date"
Move uncommitted changes from current branch to some other branch:
1
2
3
$ git stash
$ git checkout branch2
$ git stash pop
Restore stashed changes back to current branch:
1
$ git stash apply

Restore particular stash back to current branch:

  • {stash_number} can be obtained from git stash list
1
$ git stash apply [email protected]{stash_number}
Remove the last set of stashed changes:
1
$ git stash drop

A text search on all files in the directory:
1
$ git grep "Hello"
1
$ git grep "Hello" v2.5

Commit History

Show all commits, starting with newest (it’ll show the hash, author information, date of commit and title of the commit):
1
$ git log
Show all the commits(it’ll show just the commit hash and the commit message):
1
$ git log --oneline
Show all commits of a specific user:
1
$ git log --author="username"
Show changes over time for a specific file:
1
$ git log -p <file>
Display commits that are present only in remote/branch in right side
1
$ git log --oneline <origin/master>..<remote/master> --left-right
Who changed, what and when in <file>:
1
$ git blame <file>
Show Reference log:
1
$ git reflog show
Delete Reference log:
1
$ git reflog delete

Branches & Tags

List all local branches:
1
$ git branch

List local/remote branches

1
$ git branch -a
List all remote branches:
1
$ git branch -r
Switch HEAD branch:
1
$ git checkout <branch>
Checkout single file from different branch
1
$ git checkout <branch> -- <filename>
Create and switch new branch:
1
$ git checkout -b <branch>

Checkout and create a new branch from existing commit

1
$ git checkout <commit-hash> -b <new_branch_name>
Create a new branch based on your current HEAD:
1
$ git branch <new-branch>
Create a new tracking branch based on a remote branch:
1
$ git branch --track <new-branch> <remote-branch>
Delete a local branch:
1
$ git branch -d <branch>
Rename current branch to new branch name
1
$ git branch -m <new_branch_name>
Force delete a local branch:

You will lose unmerged changes!

1
$ git branch -D <branch>
Mark the current commit with a tag:
1
$ git tag <tag-name>
Mark the current commit with a tag that includes a message:
1
$ git tag -a <tag-name>

Update & Publish

List all current configured remotes:
1
$ git remote -v
Show information about a remote:
1
$ git remote show <remote>
Add new remote repository, named <remote>:
1
$ git remote add <remote> <url>
Download all changes from <remote>, but don’t integrate into HEAD:
1
$ git fetch <remote>
Download changes and directly merge/integrate into HEAD:
1
$ git remote pull <remote> <url>
Get all changes from HEAD to local repository:
1
$ git pull origin master
Get all changes from HEAD to local repository without a merge:
1
$ git pull --rebase <remote> <branch>
Publish local changes on a remote:
1
$ git push remote <remote> <branch>
Delete a branch on the remote:
1
$ git push <remote> :<branch> (since Git v1.5.0)

OR

1
$ git push <remote> --delete <branch> (since Git v1.7.0)

Publish your tags:
1
$ git push --tags

Configure the merge tool globally to meld (editor)

1
$ git config --global merge.tool meld
Use your configured merge tool to solve conflicts:
1
$ git mergetool

Merge & Rebase

Merge branch into your current HEAD:
1
$ git merge <branch>
Rebase your current HEAD onto <branch>:

Don’t rebase published commit!

1
$ git rebase <branch>
Abort a rebase:
1
$ git rebase --abort
Continue a rebase after resolving conflicts:
1
$ git rebase --continue
Use your editor to manually solve conflicts and (after resolving) mark file as resolved:
1
$ git add <resolved-file>
1
$ git rm <resolved-file>
Squashing commits:
1
$ git rebase -i <commit-just-before-first>

Now replace this,

1
2
3
pick <commit_id>
pick <commit_id2>
pick <commit_id3>

to this,

1
2
3
pick <commit_id>
squash <commit_id2>
squash <commit_id3>

Undo

Discard all local changes in your working directory:
1
$ git reset --hard HEAD
Get all the files out of the staging area(i.e. undo the last git add):
1
$ git reset HEAD
Discard local changes in a specific file:
1
$ git checkout HEAD <file>
Revert a commit (by producing a new commit with contrary changes):
1
$ git revert <commit>
Reset your HEAD pointer to a previous commit and discard all changes since then:
1
$ git reset --hard <commit>
Reset your HEAD pointer to a remote branch current state.
1
$ git reset --hard <remote/branch> e.g., upstream/master, origin/my-feature
Reset your HEAD pointer to a previous commit and preserve all changes as unstaged changes:
1
$ git reset <commit>
Reset your HEAD pointer to a previous commit and preserve uncommitted local changes:
1
$ git reset --keep <commit>
Remove files that were accidentally committed before they were added to .gitignore
1
2
3
$ git rm -r --cached .
$ git add .
$ git commit -m "remove xyz file"

Git-Flow

Improved Git-flow

Index


Setup

You need a working git installation as prerequisite. Git flow works on OSX, Linux and Windows.
OSX Homebrew:
1
$ brew install git-flow-avh
OSX Macports:
1
$ port install git-flow
Linux (Debian-based):
1
# apt install git-flow
Windows (Cygwin):
You need wget and util-linux to install git-flow.
1
$ wget -q -O - --no-check-certificate https://raw.githubusercontent.com/petervanderdoes/gitflow/develop/contrib/gitflow-installer.sh install <state> | bash

Getting Started

Git flow needs to be initialized in order to customize your project setup. Start using git-flow by initializing it inside an existing git repository:
Initialize:
1
git flow init

OR

To use default
1
git flow init -d

Features

Develop new features for upcoming releases. Typically exist in developers repos only.
Start a new feature:
This action creates a new feature branch based on ‘develop’ and switches to it.
1
git flow feature start MYFEATURE
Finish up a feature:
Finish the development of a feature. This action performs the following:
1) Merged MYFEATURE into ‘develop’.
2) Removes the feature branch.
3) Switches back to ‘develop’ branch
1
git flow feature finish MYFEATURE
Publish a feature:
Are you developing a feature in collaboration? Publish a feature to the remote server so it can be used by other users.
1
git flow feature publish MYFEATURE
Getting a published feature:
Get a feature published by another user.
1
git flow feature pull origin MYFEATURE
Tracking a origin feature:
You can track a feature on origin by using
1
git flow feature track MYFEATURE

Make a Release

Support preparation of a new production release. Allow for minor bug fixes and preparing meta-data for a release
Start a release:
To start a release, use the git flow release command. It creates a release branch created from the ‘develop’ branch. You can optionally supply a [BASE] commit sha-1 hash to start the release from. The commit must be on the ‘develop’ branch.
1
git flow release start RELEASE [BASE]
It’s wise to publish the release branch after creating it to allow release commits by other developers. Do it similar to feature publishing with the command:
1
git flow release publish RELEASE
(You can track a remote release with the:
flow release track RELEASE``` command)
1
2
3
4
5
6
7

##### Finish up a release:
###### Finishing a release is one of the big steps in git branching. It performs several actions:
###### 1) Merges the release branch back into 'master'
###### 2) Tags the release with its name
###### 3) Back-merges the release into 'develop'
###### 4) Removes the release branch

git flow release finish RELEASE

1
###### Don't forget to push your tags with ```git push --tags


Hotfixes

Hotfixes arise from the necessity to act immediately upon an undesired state of a live production version. May be branched off from the corresponding tag on the master branch that marks the production version.
Git flow hotfix start:
Like the other git flow commands, a hotfix is started with
1
$ git flow hotfix start VERSION [BASENAME]
The version argument hereby marks the new hotfix release name. Optionally you can specify a basename to start from.
Finish a hotfix:
By finishing a hotfix it gets merged back into develop and master. Additionally the master merge is tagged with the hotfix version
1
git flow hotfix finish VERSION

References

Thanks so much to @arslanbilal