Skip to content

Git tips

Greg Swindle edited this page Mar 29, 2018 · 1 revision

git logo

Collection of git-tips, want to add your tips? Checkout contributing.md link-external

English | 中文 | Русский | 한국어 | Tiếng Việt

Tools:

git-tip - A handy CLI to make optimum use of these tips. (Here in a Docker container link-external.)

Table of contents

info All these commands were tested on git version 2.7.4 (Apple Git-66).

  1. Everyday Git in twenty commands or so
  2. Show helpful guides that come with Git
  3. Search change by content
  4. Remove sensitive data from history, after a push
  5. Sync with remote, overwrite local changes
  6. List of all files till a commit
  7. Git reset first commit
  8. List all the conflicted files
  9. List of all files changed in a commit
  10. Unstaged changes since last commit
  11. Changes staged for commit
  12. Show both staged and unstaged changes
  13. List all branches that are already merged into master
  14. Quickly switch to the previous branch
  15. Remove branches that have already been merged with master
  16. List all branches and their upstreams, as well as last commit on branch
  17. Track upstream branch
  18. Delete local branch
  19. Delete remote branch
  20. Delete local tag
  21. Delete remote tag
  22. Undo local changes with the last content in head
  23. Revert: Undo a commit by creating a new commit
  24. Reset: Discard commits, advised for private branch
  25. Reword the previous commit message
  26. See commit history for just the current branch
  27. Amend author.
  28. Reset author, after author has been changed in the global config.
  29. Changing a remote's URL
  30. Get list of all remote references
  31. Get list of all local and remote branches
  32. Get only remote branches
  33. Stage parts of a changed file, instead of the entire file
  34. Get git bash completion
  35. What changed since two weeks?
  36. See all commits made since forking from master
  37. Pick commits across branches using cherry-pick
  38. Find out branches containing commit-hash
  39. Git Aliases
  40. Saving current state of tracked files without commiting
  41. Saving current state of unstaged changes to tracked files
  42. Saving current state including untracked files
  43. Saving current state with message
  44. Saving current state of all files (ignored, untracked, and tracked)
  45. Show list of all saved stashes
  46. Apply any stash without deleting from the stashed list
  47. Apply last stashed state and delete it from stashed list
  48. Delete all stored stashes
  49. Grab a single file from a stash
  50. Show all tracked files
  51. Show all untracked files
  52. Show all ignored files
  53. Create new working tree from a repository (git 2.5)
  54. Create new working tree from HEAD state
  55. Untrack files without deleting
  56. Before deleting untracked files/directory, do a dry run to get the list of these files/directories
  57. Forcefully remove untracked files
  58. Forcefully remove untracked directory
  59. Update all the submodules
  60. Show all commits in the current branch yet to be merged to master
  61. Rename a branch
  62. Rebases 'feature' to 'master' and merges it in to master
  63. Archive the master branch
  64. Modify previous commit without modifying the commit message
  65. Prunes references to remote branches that have been deleted in the remote.
  66. Retrieve the commit hash of the initial revision.
  67. Visualize the version tree.
  68. Deploying git tracked subfolder to gh-pages
  69. Adding a project to repo using subtree
  70. Get latest changes in your repo for a linked project using subtree
  71. Export a branch with history to a file.
  72. Import from a bundle
  73. Get the name of current branch.
  74. Ignore one file on commit (e.g. Changelog).
  75. Stash changes before rebasing
  76. Fetch pull request by ID to a local branch
  77. Show the most recent tag on the current branch.
  78. Show inline word diff.
  79. Show changes using common diff tools.
  80. Don’t consider changes for tracked file.
  81. Undo assume-unchanged.
  82. Clean the files from .gitignore.
  83. Restore deleted file.
  84. Restore file to a specific commit-hash
  85. Always rebase instead of merge on pull.
  86. List all the alias and configs.
  87. Make git case sensitive.
  88. Add custom editors.
  89. Auto correct typos.
  90. Check if the change was a part of a release.
  91. Dry run. (any command that supports dry-run flag should do.)
  92. Marks your commit as a fix of a previous commit.
  93. Squash fixup commits normal commits.
  94. Skip staging area during commit.
  95. Interactive staging.
  96. List ignored files.
  97. Status of ignored files.
  98. Commits in Branch1 that are not in Branch2
  99. List n last commits
  100. Reuse recorded resolution, record and reuse previous conflicts resolutions.
  101. Open all conflicted files in an editor.
  102. Count unpacked number of objects and their disk consumption.
  103. Prune all unreachable objects from the object database.
  104. Instantly browse your working repository in gitweb.
  105. View the GPG signatures in the commit log
  106. Remove entry in the global config.
  107. Checkout a new branch without any history
  108. Extract file from another branch.
  109. List only the root and merge commits.
  110. Change previous two commits with an interactive rebase.
  111. List all branch is WIP
  112. Find guilty with binary search
  113. Bypass pre-commit and commit-msg githooks
  114. List commits and changes to a specific file (even through renaming)
  115. Clone a single branch
  116. Create and switch new branch
  117. Ignore file mode changes on commits
  118. Turn off git colored terminal output
  119. Specific color settings
  120. Show all local branches ordered by recent commits
  121. Find lines matching the pattern (regex or string) in tracked files
  122. Clone a shallow copy of a repository
  123. Search Commit log across all branches for given text
  124. Get first commit in a branch (from master)
  125. Unstaging Staged file
  126. Force push to Remote Repository
  127. Adding Remote name
  128. Show the author, time and last revision made to each line of a given file
  129. Group commits by authors and title
  130. Forced push but still ensure you don't overwrite other's work
  131. Show how many lines does an author contribute
  132. Revert: Reverting an entire merge
  133. Number of commits in a branch
  134. Alias: git undo
  135. Add object notes
  136. Show all the git-notes
  137. Apply commit from another repository
  138. Specific fetch reference
  139. Find common ancestor of two branches
  140. List unpushed git commits
  141. Add everything, but whitespace changes
  142. Edit [local/global] git config
  143. blame on certain range
  144. Show a Git logical variable.
  145. Preformatted patch file.
  146. Get the repo name.
  147. logs between date range
  148. Exclude author from logs
  149. Generates a summary of pending changes
  150. List references in a remote repository
  151. Backup untracked files.
  152. List all git aliases
  153. Show git status short
  154. Checkout a commit prior to a day ago
  155. Push a new local branch to remote repository and track
  156. Change a branch base

🔝 Back to TOC

Everyday Git in twenty commands or so

git help everyday

🔝 Back to TOC

Show helpful guides that come with Git

git help -g

🔝 Back to TOC

Search change by content

git log -S'<a term in the source>'

🔝 Back to TOC

Remove sensitive data from history, after a push

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <path-to-your-file>' --prune-empty --tag-name-filter cat -- --all && git push origin --force --all

🔝 Back to TOC

Sync with remote, overwrite local changes

git fetch origin && git reset --hard origin/master && git clean -f -d

🔝 Back to TOC

List of all files till a commit

git ls-tree --name-only -r <commit-ish>

🔝 Back to TOC

Git reset first commit

git update-ref -d HEAD

🔝 Back to TOC

List all the conflicted files

git diff --name-only --diff-filter=U

🔝 Back to TOC

List of all files changed in a commit

git diff-tree --no-commit-id --name-only -r <commit-ish>

🔝 Back to TOC

Unstaged changes since last commit

git diff

🔝 Back to TOC

Changes staged for commit

git diff --cached

Alternatives:

git diff --staged

🔝 Back to TOC

Show both staged and unstaged changes

git diff HEAD

🔝 Back to TOC

List all branches that are already merged into master

git branch --merged master

🔝 Back to TOC

Quickly switch to the previous branch

git checkout -

Alternatives:

git checkout @{-1}

🔝 Back to TOC

Remove branches that have already been merged with master

git branch --merged master | grep -v '^\*' | xargs -n 1 git branch -d

Alternatives:

git branch --merged master | grep -v '^\*\|  master' | xargs -n 1 git branch -d # will not delete master if master is not checked out

🔝 Back to TOC

List all branches and their upstreams, as well as last commit on branch

git branch -vv

🔝 Back to TOC

Track upstream branch

git branch -u origin/mybranch

🔝 Back to TOC

Delete local branch

git branch -d <local_branchname>

🔝 Back to TOC

Delete remote branch

git push origin --delete <remote_branchname>

Alternatives:

git push origin :<remote_branchname>

🔝 Back to TOC

Delete local tag

git tag -d <tag-name>

🔝 Back to TOC

Delete remote tag

git push origin :refs/tags/<tag-name>

🔝 Back to TOC

Undo local changes with the last content in head

git checkout -- <file_name>

🔝 Back to TOC

Revert: Undo a commit by creating a new commit

git revert <commit-ish>

🔝 Back to TOC

Reset: Discard commits, advised for private branch

git reset <commit-ish>

🔝 Back to TOC

Reword the previous commit message

git commit -v --amend

🔝 Back to TOC

See commit history for just the current branch

git cherry -v master

🔝 Back to TOC

Amend author.

git commit --amend --author='Author Name <[email protected]>'

🔝 Back to TOC

Reset author, after author has been changed in the global config.

git commit --amend --reset-author --no-edit

🔝 Back to TOC

Changing a remote's URL

git remote set-url origin <URL>

🔝 Back to TOC

Get list of all remote references

git remote

Alternatives:

git remote show

🔝 Back to TOC

Get list of all local and remote branches

git branch -a

🔝 Back to TOC

Get only remote branches

git branch -r

🔝 Back to TOC

Stage parts of a changed file, instead of the entire file

git add -p

🔝 Back to TOC

Get git bash completion

curl http://git.io/vfhol > ~/.git-completion.bash && echo '[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash' >> ~/.bashrc

🔝 Back to TOC

What changed since two weeks?

git log --no-merges --raw --since='2 weeks ago'

Alternatives:

git whatchanged --since='2 weeks ago'

🔝 Back to TOC

See all commits made since forking from master

git log --no-merges --stat --reverse master..

🔝 Back to TOC

Pick commits across branches using cherry-pick

git checkout <branch-name> && git cherry-pick <commit-ish>

🔝 Back to TOC

Find out branches containing commit-hash

git branch -a --contains <commit-ish>

Alternatives:

git branch --contains <commit-ish>

🔝 Back to TOC

Git Aliases

git config --global alias.<handle> <command> 
git config --global alias.st status

🔝 Back to TOC

Saving current state of tracked files without commiting

git stash

Alternatives:

git stash save

🔝 Back to TOC

Saving current state of unstaged changes to tracked files

git stash -k

Alternatives:

git stash --keep-index
git stash save --keep-index

🔝 Back to TOC

Saving current state including untracked files

git stash -u

Alternatives:

git stash save -u
git stash save --include-untracked

🔝 Back to TOC

Saving current state with message

git stash save <message>

🔝 Back to TOC

Saving current state of all files (ignored, untracked, and tracked)

git stash -a

Alternatives:

git stash --all
git stash save --all

🔝 Back to TOC

Show list of all saved stashes

git stash list

🔝 Back to TOC

Apply any stash without deleting from the stashed list

git stash apply <stash@{n}>

🔝 Back to TOC

Apply last stashed state and delete it from stashed list

git stash pop

Alternatives:

git stash apply stash@{0} && git stash drop stash@{0}

🔝 Back to TOC

Delete all stored stashes

git stash clear

Alternatives:

git stash drop <stash@{n}>

🔝 Back to TOC

Grab a single file from a stash

git checkout <stash@{n}> -- <file_path>

Alternatives:

git checkout stash@{0} -- <file_path>

🔝 Back to TOC

Show all tracked files

git ls-files -t

🔝 Back to TOC

Show all untracked files

git ls-files --others

🔝 Back to TOC

Show all ignored files

git ls-files --others -i --exclude-standard

🔝 Back to TOC

Create new working tree from a repository (git 2.5)

git worktree add -b <branch-name> <path> <start-point>

🔝 Back to TOC

Create new working tree from HEAD state

git worktree add --detach <path> HEAD

🔝 Back to TOC

Untrack files without deleting

git rm --cached <file_path>

Alternatives:

git rm --cached -r <directory_path>

🔝 Back to TOC

Before deleting untracked files/directory, do a dry run to get the list of these files/directories

git clean -n

🔝 Back to TOC

Forcefully remove untracked files

git clean -f

🔝 Back to TOC

Forcefully remove untracked directory

git clean -f -d

🔝 Back to TOC

Update all the submodules

git submodule foreach git pull

Alternatives:

git submodule update --init --recursive
git submodule update --remote

🔝 Back to TOC

Show all commits in the current branch yet to be merged to master

git cherry -v master

Alternatives:

git cherry -v master <branch-to-be-merged>

🔝 Back to TOC

Rename a branch

git branch -m <new-branch-name>

Alternatives:

git branch -m [<old-branch-name>] <new-branch-name>

🔝 Back to TOC

Rebases 'feature' to 'master' and merges it in to master

git rebase master feature && git checkout master && git merge -

🔝 Back to TOC

Archive the master branch

git archive master --format=zip --output=master.zip

🔝 Back to TOC

Modify previous commit without modifying the commit message

git add --all && git commit --amend --no-edit

🔝 Back to TOC

Prunes references to remote branches that have been deleted in the remote.

git fetch -p

Alternatives:

git remote prune origin

🔝 Back to TOC

Retrieve the commit hash of the initial revision.

 git rev-list --reverse HEAD | head -1

Alternatives:

git rev-list --max-parents=0 HEAD
git log --pretty=oneline | tail -1 | cut -c 1-40
git log --pretty=oneline --reverse | head -1 | cut -c 1-40

🔝 Back to TOC

Visualize the version tree.

git log --pretty=oneline --graph --decorate --all

Alternatives:

gitk --all
git log --graph --pretty=format:'%C(auto) %h | %s | %an | %ar%d'

🔝 Back to TOC

Deploying git tracked subfolder to gh-pages

git subtree push --prefix subfolder_name origin gh-pages

🔝 Back to TOC

Adding a project to repo using subtree

git subtree add --prefix=<directory_name>/<project_name> --squash [email protected]:<username>/<project_name>.git master

🔝 Back to TOC

Get latest changes in your repo for a linked project using subtree

git subtree pull --prefix=<directory_name>/<project_name> --squash [email protected]:<username>/<project_name>.git master

🔝 Back to TOC

Export a branch with history to a file.

git bundle create <file> <branch-name>

🔝 Back to TOC

Import from a bundle

git clone repo.bundle <repo-dir> -b <branch-name>

🔝 Back to TOC

Get the name of current branch.

git rev-parse --abbrev-ref HEAD

🔝 Back to TOC

Ignore one file on commit (e.g. Changelog).

git update-index --assume-unchanged Changelog; git commit -a; git update-index --no-assume-unchanged Changelog

🔝 Back to TOC

Stash changes before rebasing

git rebase --autostash

🔝 Back to TOC

Fetch pull request by ID to a local branch

git fetch origin pull/<id>/head:<branch-name>

Alternatives:

git pull origin pull/<id>/head:<branch-name>

🔝 Back to TOC

Show the most recent tag on the current branch.

git describe --tags --abbrev=0

🔝 Back to TOC

Show inline word diff.

git diff --word-diff

🔝 Back to TOC

Show changes using common diff tools.

git difftool [-t <tool>] <commit1> <commit2> <path>

🔝 Back to TOC

Don’t consider changes for tracked file.

git update-index --assume-unchanged <file_name>

🔝 Back to TOC

Undo assume-unchanged.

git update-index --no-assume-unchanged <file_name>

🔝 Back to TOC

Clean the files from .gitignore.

git clean -X -f

🔝 Back to TOC

Restore deleted file.

git checkout <deleting_commit>^ -- <file_path>

🔝 Back to TOC

Restore file to a specific commit-hash

git checkout <commit-ish> -- <file_path>

🔝 Back to TOC

Always rebase instead of merge on pull.

git config --global pull.rebase true

Alternatives:

#git < 1.7.9
git config --global branch.autosetuprebase always

🔝 Back to TOC

List all the alias and configs.

git config --list

🔝 Back to TOC

Make git case sensitive.

git config --global core.ignorecase false

🔝 Back to TOC

Add custom editors.

git config --global core.editor '$EDITOR'

🔝 Back to TOC

Auto correct typos.

git config --global help.autocorrect 1

🔝 Back to TOC

Check if the change was a part of a release.

git name-rev --name-only <SHA-1>

🔝 Back to TOC

Dry run. (any command that supports dry-run flag should do.)

git clean -fd --dry-run

🔝 Back to TOC

Marks your commit as a fix of a previous commit.

git commit --fixup <SHA-1>

🔝 Back to TOC

Squash fixup commits normal commits.

git rebase -i --autosquash

🔝 Back to TOC

Skip staging area during commit.

git commit --only <file_path>

🔝 Back to TOC

Interactive staging.

git add -i

🔝 Back to TOC

List ignored files.

git check-ignore *

🔝 Back to TOC

Status of ignored files.

git status --ignored

🔝 Back to TOC

Commits in Branch1 that are not in Branch2

git log Branch1 ^Branch2

🔝 Back to TOC

List n last commits

git log -<n>

Alternatives:

git log -n <n>

🔝 Back to TOC

Reuse recorded resolution, record and reuse previous conflicts resolutions.

git config --global rerere.enabled 1

🔝 Back to TOC

Open all conflicted files in an editor.

git diff --name-only | uniq | xargs $EDITOR

🔝 Back to TOC

Count unpacked number of objects and their disk consumption.

git count-objects --human-readable

🔝 Back to TOC

Prune all unreachable objects from the object database.

git gc --prune=now --aggressive

🔝 Back to TOC

Instantly browse your working repository in gitweb.

git instaweb [--local] [--httpd=<httpd>] [--port=<port>] [--browser=<browser>]

🔝 Back to TOC

View the GPG signatures in the commit log

git log --show-signature

🔝 Back to TOC

Remove entry in the global config.

git config --global --unset <entry-name>

🔝 Back to TOC

Checkout a new branch without any history

git checkout --orphan <branch_name>

🔝 Back to TOC

Extract file from another branch.

git show <branch_name>:<file_name>

🔝 Back to TOC

List only the root and merge commits.

git log --first-parent

🔝 Back to TOC

Change previous two commits with an interactive rebase.

git rebase --interactive HEAD~2

🔝 Back to TOC

List all branch is WIP

git checkout master && git branch --no-merged

🔝 Back to TOC

Find guilty with binary search

git bisect start                    # Search start 
git bisect bad                      # Set point to bad commit 
git bisect good v2.6.13-rc2         # Set point to good commit|tag 
git bisect bad                      # Say current state is bad 
git bisect good                     # Say current state is good 
git bisect reset                    # Finish search 

🔝 Back to TOC

Bypass pre-commit and commit-msg githooks

git commit --no-verify

🔝 Back to TOC

List commits and changes to a specific file (even through renaming)

git log --follow -p -- <file_path>

🔝 Back to TOC

Clone a single branch

git clone -b <branch-name> --single-branch https://github.com/user/repo.git

🔝 Back to TOC

Create and switch new branch

git checkout -b <branch-name>

Alternatives:

git branch <branch-name> && git checkout <branch-name>

🔝 Back to TOC

Ignore file mode changes on commits

git config core.fileMode false

🔝 Back to TOC

Turn off git colored terminal output

git config --global color.ui false

🔝 Back to TOC

Specific color settings

git config --global <specific command e.g branch, diff> <true, false or always>

🔝 Back to TOC

Show all local branches ordered by recent commits

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

🔝 Back to TOC

Find lines matching the pattern (regex or string) in tracked files

git grep --heading --line-number 'foo bar'

🔝 Back to TOC

Clone a shallow copy of a repository

git clone https://github.com/user/repo.git --depth 1

🔝 Back to TOC

Search Commit log across all branches for given text

git log --all --grep='<given-text>'

🔝 Back to TOC

Get first commit in a branch (from master)

git log master..<branch-name> --oneline | tail -1

🔝 Back to TOC

Unstaging Staged file

git reset HEAD <file-name>

🔝 Back to TOC

Force push to Remote Repository

git push -f <remote-name> <branch-name>

🔝 Back to TOC

Adding Remote name

git remote add <remote-nickname> <remote-url>

🔝 Back to TOC

Show the author, time and last revision made to each line of a given file

git blame <file-name>

🔝 Back to TOC

Group commits by authors and title

git shortlog

🔝 Back to TOC

Forced push but still ensure you don't overwrite other's work

git push --force-with-lease <remote-name> <branch-name>

🔝 Back to TOC

Show how many lines does an author contribute

git log --author='_Your_Name_Here_' --pretty=tformat: --numstat | gawk '{ add += <!-- @doxie.inject start -->; subs += <!-- @doxie.inject end -->; loc += <!-- @doxie.inject start --> - <!-- @doxie.inject end --> } END { printf "added lines: %s removed lines: %s total lines: %s
", add, subs, loc }' -

Alternatives:

git log --author='_Your_Name_Here_' --pretty=tformat: --numstat | awk '{ add += <!-- @doxie.inject start -->; subs += <!-- @doxie.inject end -->; loc += <!-- @doxie.inject start --> - <!-- @doxie.inject end --> } END { printf "added lines: %s, removed lines: %s, total lines: %s
", add, subs, loc }' - # on Mac OSX

🔝 Back to TOC

Revert: Reverting an entire merge

git revert -m 1 <commit-ish>

🔝 Back to TOC

Number of commits in a branch

git rev-list --count <branch-name>

🔝 Back to TOC

Alias: git undo

git config --global alias.undo '!f() { git reset --hard $(git rev-parse --abbrev-ref HEAD)@{${1-1}}; }; f'

🔝 Back to TOC

Add object notes

git notes add -m 'Note on the previous commit....'

🔝 Back to TOC

Show all the git-notes

git log --show-notes='*'

🔝 Back to TOC

Apply commit from another repository

git --git-dir=<source-dir>/.git format-patch -k -1 --stdout <SHA1> | git am -3 -k

🔝 Back to TOC

Specific fetch reference

git fetch origin master:refs/remotes/origin/mymaster

🔝 Back to TOC

Find common ancestor of two branches

diff -u <(git rev-list --first-parent BranchA) <(git rev-list --first-parent BranchB) | sed -ne 's/^ //p' | head -1

🔝 Back to TOC

List unpushed git commits

git log --branches --not --remotes

Alternatives:

git log @{u}..
git cherry -v

🔝 Back to TOC

Add everything, but whitespace changes

git diff --ignore-all-space | git apply --cached

🔝 Back to TOC

Edit [local/global] git config

git config [--global] --edit

🔝 Back to TOC

blame on certain range

git blame -L <start>,<end>

🔝 Back to TOC

Show a Git logical variable.

git var -l | <variable>

🔝 Back to TOC

Preformatted patch file.

git format-patch -M upstream..topic

🔝 Back to TOC

Get the repo name.

git rev-parse --show-toplevel

🔝 Back to TOC

logs between date range

git log --since='FEB 1 2017' --until='FEB 14 2017'

🔝 Back to TOC

Exclude author from logs

git log --perl-regexp --author='^((?!excluded-author-regex).*)

🔝 Back to TOC

Generates a summary of pending changes

git request-pull v1.0 https://git.ko.xz/project master:for-linus

🔝 Back to TOC

List references in a remote repository

git ls-remote git://git.kernel.org/pub/scm/git/git.git

🔝 Back to TOC

Backup untracked files.

git ls-files --others -i --exclude-standard | xargs zip untracked.zip

🔝 Back to TOC

List all git aliases

git config -l | grep alias | sed 's/^alias\.//g'

Alternatives:

git config -l | grep alias | cut -d '.' -f 2

🔝 Back to TOC

Show git status short

git status --short --branch

🔝 Back to TOC

Checkout a commit prior to a day ago

git checkout master@{yesterday}

🔝 Back to TOC

Push a new local branch to remote repository and track

git push -u origin <branch_name>

🔝 Back to TOC

Change a branch base

git rebase --onto <new_base> <old_base>

Wiki home Wiki

Open government

Architecting Information for an Open-Source Citizenry

For designers and engineers

Git tips

Clone this wiki locally