Skip to content

Instantly share code, notes, and snippets.

@michael-ford
Forked from hofmannsven/README.md
Last active December 28, 2018 18:45
Show Gist options
  • Save michael-ford/76de42de9b0f84d3f4081e91c8ddb67c to your computer and use it in GitHub Desktop.
Save michael-ford/76de42de9b0f84d3f4081e91c8ddb67c to your computer and use it in GitHub Desktop.
My simply Git Cheatsheet

Using Git

Global Settings

Reminder

Press minus + shift + s and return to chop/fold long lines!

Show folder content: ls -la

Notes

Do not put (external) dependencies in version control!

Setup

See where Git is located: which git

Get the version of Git: git --version

Create an alias (shortcut) for git status: git config --global alias.st status

Help

Help: git help

General

Initialize Git: git init

Get everything ready to commit: git add .

Get custom file ready to commit: git add index.html

Commit changes: git commit -m "Message"

Add and commit in one step: git commit -am "Message"

Remove files from Git: git rm index.html

Update all changes: git add -u

Remove file but do not track anymore: git rm --cached index.html

Move or rename files: git mv index.html dir/index_new.html

Undo modifications (restore files from latest commited version): git checkout -- index.html

Restore file from a custom commit (in current branch): git checkout 6eb715d -- index.html

Reset

Go back to commit: git revert 073791e7dd71b90daa853b2c5acc2c925f02dbc6

Soft reset (move HEAD only; neither staging nor working dir is changed): git reset --soft 073791e7dd71b90daa853b2c5acc2c925f02dbc6

Undo latest commit: git reset --soft HEAD~

Mixed reset (move HEAD and change staging to match repo; does not affect working dir): git reset --mixed 073791e7dd71b90daa853b2c5acc2c925f02dbc6

Hard reset (move HEAD and change staging dir and working dir to match repo): git reset --hard 073791e7dd71b90daa853b2c5acc2c925f02dbc6

Add to last local commit git add <missing-file> git commit --amend --no-edit --no-edit prevents editing commit message

Update & Delete

Test-Delete untracked files: git clean -n

Delete untracked files (not staging): git clean -f

Unstage (undo adds): git reset HEAD index.html

Update most recent commit (also update the commit message): git commit --amend -m "New Message"

Branch

Show branches: git branch

Create branch: git branch branchname

Change to branch: git checkout branchname

Create and change to new branch: git checkout -b branchname

Rename branch: git branch -m branchname new_branchname or: git branch --move branchname new_branchname

Show all completely merged branches with current branch: git branch --merged

Delete merged branch (only possible if not HEAD): git branch -d branchname or: git branch --delete branchname

Delete not merged branch: git branch -D branch_to_delete

Merge

True merge (fast forward): git merge branchname

Merge to master (only if fast forward): git merge --ff-only branchname

Merge to master (force a new commit): git merge --no-ff branchname

Stop merge (in case of conflicts): git merge --abort

Stop merge (in case of conflicts): git reset --merge // prior to v1.7.4

Merge only one specific commit: git cherry-pick 073791e7

Rebase (make current spot (HEAD?) on branchname the same as master: git checkout branchname » git rebase master or: git merge master branchname (The rebase moves all of the commits in master onto the tip of branchname.)

Amend commit and then merge a branch onto ammended commit git add <missing-file> git commit --amend --no-edit git checkout foo # stash first if needed git merge master --ff-only OR git rebase foo --onto master # skip patches for conflicts

Squash multiple commits into one: git rebase -i HEAD~3 (source)

Stash

Put in stash: git stash save "Message"

Show stash: git stash list

Show stash stats: git stash show stash@{0}

Show stash changes: git stash show -p stash@{0}

Use custom stash item and drop it: git stash pop stash@{0}

Use custom stash item and do not drop it: git stash apply stash@{0}

Delete custom stash item: git stash drop stash@{0}

Delete complete stash: git stash clear

Stash interactively hunk-by-hunk git stash save --patch 'WIP message'

Testing partial commits You can use git stash push --keep-index when you want to make two or more commits out of the changes in the work tree, and you want to test each change before committing:

`

... hack hack hack ...

$ git add --patch foo # add just first part to the index $ git stash push --keep-index # save all other changes to the stash $ edit/build/test first part $ git commit -m 'First part' # commit fully tested change $ git stash pop # prepare to work on all other changes

... repeat above five steps until one commit remains ...

$ edit/build/test remaining parts $ git commit foo -m 'Remaining parts' `

Gitignore & Gitkeep

About: https://help.github.com/articles/ignoring-files

Useful templates: https://github.com/github/gitignore

Add or edit gitignore: nano .gitignore

Track empty dir: touch dir/.gitkeep

Log

Current commmit status (ahead / behind) of all local branches: git branch -v

Tree of branch / commits: git log --graph --full-history --all --pretty=format:"%h%x09%d%x20%s"

Tree of branch / commits but only local branches: git log --graph --branches --not --remotes='origin/*' --pretty=format:"%h%x09%d%x20%s"

Show commits: git log

Show oneline-summary of commits: git log --oneline

Show oneline-summary of commits with full SHA-1: git log --format=oneline

Show oneline-summary of the last three commits: git log --oneline -3

Show only custom commits: git log --author="Sven" git log --grep="Message" git log --until=2013-01-01 git log --since=2013-01-01

Show only custom data of commit: git log --format=short git log --format=full git log --format=fuller git log --format=email git log --format=raw

Show changes: git log -p

Show every commit since special commit for custom file only: git log 6eb715d.. index.html

Show changes of every commit since special commit for custom file only: git log -p 6eb715d.. index.html

Show stats and summary of commits: git log --stat --summary

Show history of commits as graph: git log --graph

Show history of commits as graph-summary: git log --oneline --graph --all --decorate

Compare

Compare modified files: git diff

Compare modified files and highlight changes only: git diff --color-words index.html

Compare modified files within the staging area: git diff --staged

Compare branches: git diff master..branchname

Compare branches like above: git diff --color-words master..branchname^

Compare commits: git diff 6eb715d git diff 6eb715d..HEAD git diff 6eb715d..537a09f

Compare commits of file: git diff 6eb715d index.html git diff 6eb715d..537a09f index.html

Compare without caring about spaces: git diff -b 6eb715d..HEAD or: git diff --ignore-space-change 6eb715d..HEAD

Compare without caring about all spaces: git diff -w 6eb715d..HEAD or: git diff --ignore-all-space 6eb715d..HEAD

Useful comparings: git diff --stat --summary 6eb715d..HEAD

Blame: git blame -L10,+1 index.html

Releases & Version Tags

Show all released versions: git tag

Show all released versions with comments: git tag -l -n1

Create release version: git tag v1.0.0

Create release version with comment: git tag -a v1.0.0 -m 'Message'

Checkout a specific release version: git checkout v1.0.0

Collaborate

Show remote: git remote

Show remote details: git remote -v

Add remote upstream from GitHub project: git remote add upstream https://github.com/user/project.git

Add remote upstream from existing empty project on server: git remote add upstream ssh://root@123.123.123.123/path/to/repository/.git

Fetch: git fetch upstream

Fetch a custom branch: git fetch upstream branchname:local_branchname

Merge fetched commits: git merge upstream/master

Remove origin: git remote rm origin

Show remote branches: git branch -r

Show all branches: git branch -a

Compare: git diff origin/master..master

Push (set default with -u): git push -u origin master

Push: git push origin master

Force-Push: `git push origin master --force

Pull: git pull

Pull specific branch: git pull origin branchname

Fetch a pull request on GitHub by its ID and create a new branch: git fetch upstream pull/ID/head:new-pr-branch

Clone to localhost: git clone https://github.com/user/project.git or: git clone ssh://user@domain.com/~/dir/.git

Clone to localhost folder: git clone https://github.com/user/project.git ~/dir/folder

Clone specific branch to localhost: git clone -b branchname https://github.com/user/project.git

Delete remote branch (push nothing): git push origin :branchname or: git push origin --delete branchname

Submodules

Clone repo containing submodule git clone --recursive <path to parent repo>

See commited changes in submodule git diff --submodule Make default diff git config --global diff.submodule log

Pull and checkout new commits git submodule update --remote --merge

Config status to show changes in submodule git config status.submodulesummary 1

Archive

Create a zip-archive: git archive --format zip --output filename.zip master

Export/write custom log to a file: git log --author=sven --all > log.txt

Troubleshooting

Ignore files that have already been committed to a Git repository: http://stackoverflow.com/a/1139797/1815847

Security

Hide Git on the web via .htaccess: RedirectMatch 404 /\.git (more info here: http://stackoverflow.com/a/17916515/1815847)

Git Annex

More info see: https://git-annex.branchable.com/walkthrough/

Get metadata info: git annex sync [remote-name] Omit [remote-name] to ensure syncing between all remotes (i.e. connects to all available)

Download file/dir to local: git annex get <path>

Download ALL files (via rsync): git sync --content

Remove / delete file from local: git annex drop <path> (checks it exists somewhere else first)

Modifying annexed file: git annex unlock <path> to replace the symlink with actual file git add + git commit to put the new version of the annexd file back where it belongs.

Pushing file to remote git annex copy <file_name> --to <remote-name>

Find which remotes have a copy of the file git annex whereis <file_path>

Large File Storage

Website: https://git-lfs.github.com/

Install: brew install git-lfs

Track *.psd files: git lfs track "*.psd" (init, add, commit and push as written above)

Using Git
===============
Global Settings
-----------
- Related Setup: https://gist.github.com/hofmannsven/6814278
- Related Pro Tips: https://ochronus.com/git-tips-from-the-trenches/
- Interactive Beginners Tutorial: http://try.github.io/
- Git Cheatsheet by GitHub: https://services.github.com/on-demand/downloads/github-git-cheat-sheet/
Reminder
-----------
Press `minus + shift + s` and `return` to chop/fold long lines!
Show folder content: `ls -la`
Notes
-----------
Do not put (external) dependencies in version control!
Setup
-----------
See where Git is located:
`which git`
Get the version of Git:
`git --version`
Create an alias (shortcut) for `git status`:
`git config --global alias.st status`
Help
-----------
Help:
`git help`
General
-----------
Initialize Git:
`git init`
Get everything ready to commit:
`git add .`
Get custom file ready to commit:
`git add index.html`
Commit changes:
`git commit -m "Message"`
Add and commit in one step:
`git commit -am "Message"`
Remove files from Git:
`git rm index.html`
Update all changes:
`git add -u`
Remove file but do not track anymore:
`git rm --cached index.html`
Move or rename files:
`git mv index.html dir/index_new.html`
Undo modifications (restore files from latest commited version):
`git checkout -- index.html`
Restore file from a custom commit (in current branch):
`git checkout 6eb715d -- index.html`
Reset
-----------
Go back to commit:
`git revert 073791e7dd71b90daa853b2c5acc2c925f02dbc6`
Soft reset (move HEAD only; neither staging nor working dir is changed):
`git reset --soft 073791e7dd71b90daa853b2c5acc2c925f02dbc6`
Undo latest commit: `git reset --soft HEAD~ `
Mixed reset (move HEAD and change staging to match repo; does not affect working dir):
`git reset --mixed 073791e7dd71b90daa853b2c5acc2c925f02dbc6`
Hard reset (move HEAD and change staging dir and working dir to match repo):
`git reset --hard 073791e7dd71b90daa853b2c5acc2c925f02dbc6`
Update & Delete
-----------
Test-Delete untracked files:
`git clean -n`
Delete untracked files (not staging):
`git clean -f`
Unstage (undo adds):
`git reset HEAD index.html`
Update most recent commit (also update the commit message):
`git commit --amend -m "New Message"`
Branch
-----------
Show branches:
`git branch`
Create branch:
`git branch branchname`
Change to branch:
`git checkout branchname`
Create and change to new branch:
`git checkout -b branchname`
Rename branch:
`git branch -m branchname new_branchname` or:
`git branch --move branchname new_branchname`
Show all completely merged branches with current branch:
`git branch --merged`
Delete merged branch (only possible if not HEAD):
`git branch -d branchname` or:
`git branch --delete branchname`
Delete not merged branch:
`git branch -D branch_to_delete`
Merge
-----------
True merge (fast forward):
`git merge branchname`
Merge to master (only if fast forward):
`git merge --ff-only branchname`
Merge to master (force a new commit):
`git merge --no-ff branchname`
Stop merge (in case of conflicts):
`git merge --abort`
Stop merge (in case of conflicts):
`git reset --merge` // prior to v1.7.4
Merge only one specific commit:
`git cherry-pick 073791e7`
Rebase:
`git checkout branchname` » `git rebase master`
or:
`git merge master branchname`
(The rebase moves all of the commits in `master` onto the tip of `branchname`.)
Squash multiple commits into one:
`git rebase -i HEAD~3` ([source](https://www.devroom.io/2011/07/05/git-squash-your-latests-commits-into-one/))
Stash
-----------
Put in stash:
`git stash save "Message"`
Show stash:
`git stash list`
Show stash stats:
`git stash show stash@{0}`
Show stash changes:
`git stash show -p stash@{0}`
Use custom stash item and drop it:
`git stash pop stash@{0}`
Use custom stash item and do not drop it:
`git stash apply stash@{0}`
Delete custom stash item:
`git stash drop stash@{0}`
Delete complete stash:
`git stash clear`
Gitignore & Gitkeep
-----------
About: https://help.github.com/articles/ignoring-files
Useful templates: https://github.com/github/gitignore
Add or edit gitignore:
`nano .gitignore`
Track empty dir:
`touch dir/.gitkeep`
Log
-----------
Show commits:
`git log`
Show oneline-summary of commits:
`git log --oneline`
Show oneline-summary of commits with full SHA-1:
`git log --format=oneline`
Show oneline-summary of the last three commits:
`git log --oneline -3`
Show only custom commits:
`git log --author="Sven"`
`git log --grep="Message"`
`git log --until=2013-01-01`
`git log --since=2013-01-01`
Show only custom data of commit:
`git log --format=short`
`git log --format=full`
`git log --format=fuller`
`git log --format=email`
`git log --format=raw`
Show changes:
`git log -p`
Show every commit since special commit for custom file only:
`git log 6eb715d.. index.html`
Show changes of every commit since special commit for custom file only:
`git log -p 6eb715d.. index.html`
Show stats and summary of commits:
`git log --stat --summary`
Show history of commits as graph:
`git log --graph`
Show history of commits as graph-summary:
`git log --oneline --graph --all --decorate`
Compare
-----------
Compare modified files:
`git diff`
Compare modified files and highlight changes only:
`git diff --color-words index.html`
Compare modified files within the staging area:
`git diff --staged`
Compare branches:
`git diff master..branchname`
Compare branches like above:
`git diff --color-words master..branchname^`
Compare commits:
`git diff 6eb715d`
`git diff 6eb715d..HEAD`
`git diff 6eb715d..537a09f`
Compare commits of file:
`git diff 6eb715d index.html`
`git diff 6eb715d..537a09f index.html`
Compare without caring about spaces:
`git diff -b 6eb715d..HEAD` or:
`git diff --ignore-space-change 6eb715d..HEAD`
Compare without caring about all spaces:
`git diff -w 6eb715d..HEAD` or:
`git diff --ignore-all-space 6eb715d..HEAD`
Useful comparings:
`git diff --stat --summary 6eb715d..HEAD`
Blame:
`git blame -L10,+1 index.html`
Releases & Version Tags
-----------
Show all released versions:
`git tag`
Show all released versions with comments:
`git tag -l -n1`
Create release version:
`git tag v1.0.0`
Create release version with comment:
`git tag -a v1.0.0 -m 'Message'`
Checkout a specific release version:
`git checkout v1.0.0`
Collaborate
-----------
Show remote:
`git remote`
Show remote details:
`git remote -v`
Add remote upstream from GitHub project:
`git remote add upstream https://github.com/user/project.git`
Add remote upstream from existing empty project on server:
`git remote add upstream ssh://root@123.123.123.123/path/to/repository/.git`
Fetch:
`git fetch upstream`
Fetch a custom branch:
`git fetch upstream branchname:local_branchname`
Merge fetched commits:
`git merge upstream/master`
Remove origin:
`git remote rm origin`
Show remote branches:
`git branch -r`
Show all branches:
`git branch -a`
Compare:
`git diff origin/master..master`
Push (set default with `-u`):
`git push -u origin master`
Push:
`git push origin master`
Force-Push:
`git push origin master --force
Pull:
`git pull`
Pull specific branch:
`git pull origin branchname`
Fetch a pull request on GitHub by its ID and create a new branch:
`git fetch upstream pull/ID/head:new-pr-branch`
Clone to localhost:
`git clone https://github.com/user/project.git` or:
`git clone ssh://user@domain.com/~/dir/.git`
Clone to localhost folder:
`git clone https://github.com/user/project.git ~/dir/folder`
Clone specific branch to localhost:
`git clone -b branchname https://github.com/user/project.git`
Delete remote branch (push nothing):
`git push origin :branchname` or:
`git push origin --delete branchname`
Archive
-----------
Create a zip-archive: `git archive --format zip --output filename.zip master`
Export/write custom log to a file: `git log --author=sven --all > log.txt`
Troubleshooting
-----------
Ignore files that have already been committed to a Git repository: http://stackoverflow.com/a/1139797/1815847
Security
-----------
Hide Git on the web via `.htaccess`: `RedirectMatch 404 /\.git`
(more info here: http://stackoverflow.com/a/17916515/1815847)
Git Annex
n----------
More info see: https://git-annex.branchable.com/walkthrough/
Get metadata info: `git annex sync [remote-name]`
Omit `[remote-name]` to ensure syncing between all remotes (i.e. connects to all available)
Download file/dir to local: `git annex get <path>`
Download ALL files (via rsync): `git sync --content`
Remove / delete file from local: `git annex drop <path>`
(checks it exists somewhere else first)
Modifying annexed file:
`git annex unlock <path>' to replace the symlink with actual file
git add + git commit to put the new version of the annexd file back where it belongs.
Large File Storage
-----------
Website: https://git-lfs.github.com/
Install: `brew install git-lfs`
Track `*.psd` files: `git lfs track "*.psd"` (init, add, commit and push as written above)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment