# GIT CHEAT SHEET


### Get help on the command line

> `$ git help <command>`

## CREATE

### Clone an existing repository

> `$ git clone [url]`

### Create a new local repository

> `$ git init`

## LOCAL CHANGES

### Changed files in your working directory

> `$ git status`

### Changes to tracked files

> `$ git diff`

### Add all current changes to the next commit (all changes, without deletions and without new files)

> `$ git add -A`
>
> `$ git add .`
>
> `$ git add u`

### Add some changes in \<file> to the next commit

> `$ git add -p <file>`

### Commit all local changes in tracked files and add commit message

> `$ git commit -a`
> 
> `$ git commit -am [message]`

### Commit previusly staged changes

> `git commit`

### Change the last commmit

> `$ git commit -amend`

## COMMIT HISTORY

### Show all commits, starting with newest

> `$ git log`

### Show changes over time for a specific file

> `$ git log -p <file>`

### Who changed what and when in \<file>

> `$ git blame <file>`

## BRANCHES & TAGS

### List all existing branches

> `$ git branch -av`

### Switch HEAD branch

> `$ git checkout <branch>`

### Create a new branch based on your current HEAD

> `$ git branch <new-branch>`
>
> `$ git checkout -b <new-branch>`

### Create a new tracking branch bases on a remote branch

> `$ git checkout -track <remote/branch>`

### Delete a local branch

> `$ git branch -d <branch>`

### Mark the current commit with a tag

> `$ git tag <tag-name>`

## UPDATE & PUBLISH

### List all existing branches

> `$ git remote -v`

### Show information about a remote

> `$ git remote show <remote>`

### Add new remote repository, named \<remote>

> `$ git remote add <shortname> <url>`

### Download all changes from \<remote>, but don't integrate into HEAD

> `$ git fetch <remote>`

### Download changes and directly merge/integrate into HEAD

> `$ git pull <remote> <branch>`

### Publish local changes on a remote

> `$ git push <remote> <branch>`

### Delete a branch on the remote

> `$ git branch -d <remote/branch>`

### Publish your tags

> `$ git push --tags`

## MERGE & REBASE

### Merge \<branch> into your current HEAD

> `$ git merge <branch>`

### Rebase your current HEAD onto \<branch> (Don't rebase publish commits)

> `$ git rebase <branch>`

### Abort a rebase

> `$ git rebase --abort`

### Use your configured merge tool to solve conflicts

> `$ git mergetool`

### Use your editor to manually solve conflicts and (after resolving) mark file as resolved

> `$ git add <resolved-file>`
>
> `$ git rm <resolved-file>`

## UNDO

### Discard all local changes in yout working directory

> `$ git reset --hard HEAD`
>
> `$ git reset`
>
> `$ git checkout .`
>
> `$ git clean -fdx`
>
> `$ git checkout -b develop~# develop`

### Discard local changes in a specific file

> `$ git checkout HEAD <file>`

### Revert a commit (by producing a new commit with contrary changes)

> `$ git revert <commit>`

### Reset your HEAD pointer to a previous commit and discard all changes since then, perserve all changes as unstaged changes and preserve uncommitted local changes

> `$ git reset --hard <commit>`
>
> `$ git reset <commit>`
>
> `$ git reset --keep <commit>`

## GIT FLOW

### Init git flow

> `$ git flow init`

### Start git flow feature

> `$ git flow feature start [feature-name]`

### Publish git flow feature

> `$ git flow feature publish [feature-name]`

### Finish git flow feature

> `$ git flow feature finish [feature-name]`

## Extra

### Delete .git folder

> `$ rm -rf .git`