Useful git commands for everyday use!
Issue #239
Original post https://medium.com/flawless-app-stories/useful-git-commands-for-everyday-use-e1a4de64037d
Do you know that questions about git get the most views on StackOverflow? Iβve searched a lot on Google how to execute certain actions with git, and this actually slowed me down a lot. There are some actions that we tend to use a lot, so itβs good to learn them. Here are my favorites, learning from friends and internet, hope you find them useful.
Before we begin, you should run git βversion to check your current git version, mine is 2.12.2 as in macOS High Sierra. Here is the official git documentation, you can read details about git commands, parameters and new releases of git.
Useful commands
Diff
1 | git diff feature/my_branch develop > file.diff |
π Status
Check the status of working directory and staging area:
git statusShow changes between HEAD and working directory:
git diffShow the list of commits in one line format:
git log --onelineShow commits that make add or remove a certain string:
git log -S 'LoginViewController'Search commits that contain a log message:
git log β all β grep=βday of weekβπ Tag
List all tags:
git tagTag a commit:
git tag -a 1.4 -m "my version 1.4"Delete remote tags:
git push --delete origin tagname
git push origin :tagnamePush tag to remote:
git push origin tagnameRename tag:
git tag new old
git tag -d old
git push origin :refs/tags/old
git push --tagsMove tag from one commit to another commit:
git push origin :refs/tags/<tagname>
git tag -fa tagname
git push origin master --tagsπ Remote
List all remote:
git remoteRename remote:
git remote rename old newRemove stale remote tracking branches:
git remote prune originπ Branch
List all branches:
git branchCreate the branch on your local machine and switch in this branch:
git checkout -b branch_nameCreate branch from commit:
git branch branch_name sha1_of_commitPush the branch to remote:
git push origin branch_nameRename other branch:
git branch -m old newRename current branch:
git branch -m newRename remote branch:
git branch -m old new # Rename branch locally
git push origin :old # Delete the old branch
git push --set-upstream origin new # Push the new branch, set local branch to track the new remoteDelete a branch:
git branch -D the_local_branch
git push origin :the_remote_branchDelete all local branches but master
git branch | grep -v "master" | xargs git branch -Dπ Commit
Undo last commit:
git reset --hard HEAD~1Squash last n commits into one commit:
git rebase -i HEAD~5
git reset --soft HEAD~5
git add .
git commit -m "Update"
git push -f origin masterMove last commits into new branch:
git branch newbranch
git reset --hard HEAD~3 # Go back 3 commits. You *will* lose uncommitted work.*1
git checkout newbranchMake changes to older commit
1 | git rebase -i HEAD^^^ |
π Cherry Pick
Add some commits to the top of the current branch:
git cherry-pick hash_commit_A hash_commit_Bπ Reflog
Show reflog:
git reflogGet commit:
git reset --hard 0254ea7
git cherry-pick 12944d8π Revert
Revert the previous commit:
git revert HEAD
git commitRevert the changes from previous 3 commits without making commit:
git revert --no-commit HEAD~3..π Amend
Amend previous commit:
git commit --amend
git commit --amend --no-edit
git commit --amend -m "New commit message"Changing git commit message after push:
git commit --amend -m "New commit message"
git push --force <repository> <branch>π Checkout
Checkout a tag:
git checkout tagname
git checkout -b newbranchname tagnameCheckout a branch:
git checkout destination_branchUse -m if there is merge conflict:
git checkout -m master // from feature branch to masterCheckout a commit:
git checkout commit_hash
git checkout -b newbranchname HEAD~4
git checkout -b newbranchname commit_hash
git checkout commit_hash fileCheckout a file:
git checkout c5f567 -- Relative/Path/To/Fileπ Stash
Save a change to stash:
git stash save "stash name"
git stashList all stashes:
git stash listApply a stash:
git stash pop
git stash apply
git stash apply stash@{2}π Rebase
Rebase the current branch onto master:
git rebase master // rebase the current branch onto masterContinue rebase:
git rebase --continueAbort rebase:
git rebase --abortπ .gitignore
Un-track files that have just been declared in .gitignore:
git rm -r --cached .
git add .
git commit -am "Remove ignored files"π Index
Remove untracked files:
git cleanRemove file from index:
git reset fileReset the index to match the most recent commit:
git resetReset the index and the working directory to match the most recent commit:
git reset --hardπ Misc
Get their changes during git rebase:
git checkout --ours foo/bar.java
git add foo/bar.javaGet their changes during git merge:
git pull -X theirs
git checkout --theirs path/to/the/conflicted_file.php
git checkout --theirs .
git add .
git checkout branchA
git merge -X theirs branchBMerge commits from master into feature branch:
git checkout feature1
git merge --no-ff masterFind bug in commit history in a binary search tree style:
git bisect start
git bisect good
git bisect badGit alias
If there are commands that you use a lot, then consider using git alias. This is how to make alias for git status, then you can just type git st:
git config β global alias.st statusAlias configurations are stored in .gitconfig file, you can learn some cool aliases from thoughtbot and mathiasbynens.
Delete all local branches except master
1 | git config --global alias.dlb '!git branch | grep -v "master" | xargs git branch -D' |
Prune upstream branches
1 | git config --global alias.pu 'remote prune upstream' |
GUI clients
Doing things in command line is cool and faster. However for viewing branches and commits, I find using a GUI client more visualizing and comfortable. You can see a list of all GUI clients here, I myself use SourceTree.

Check before you commit
We usually have some experiment code that we donβt want they to step into our commit. I usually mark my experiment with //
Starting with 2.9, Git has improvement on its commit hook which makes it globally using hooksPath.
Firstly we nee to create a file called pre-commit, and place it into, for example, /Users/khoa/hooks:
1 |
|
In your project, run git config core.hooksPath /Users/khoa/hooks.
Whenever you commit a file with that pattern, it wonβt let you commit. For how to make this work in SourceTree, check:
SourceTree and pre commit hook
Pre-commit file works perfectly in terminal, but SourceTree seems to ignore it. I use both terminal and SourceTree, asβ¦medium.com
Where to go from here
This is just scratching the surface of what git can do, if you want to learn more, here are some links to get started.
- Atlassian Git Tutorial: overview of how to set up a repository (repo) under Git version control
- git-cheat-sheet: Git cheat sheet saves you from learning all the commands by heart.
- Learn Enough Git to Be Dangerous
- Git Workflows for Pros: A Good Git Guide
- Git from the inside out: The essay focuses on the graph structure that underpins Git
- git-game: terminal game to test git skills
- Introduction to Git β talk by Scott Chacon
- Git Tutorial β Git Fu With The Command Line
- Git Immersion: The surest path to mastering Git is to immerse oneself in its utilities and operations, to experience it first-hand
- git-flight-rules Flight rules for git
- gitflow Git extensions to provide high-level repository operations for Vincent Driessenβs branching model
- diff-so-fancy Good-lookinβ diffs with diff-highlight and more
- github-cheat-sheet A list of cool features of Git and GitHub
- git tips Most commonly used git tips and tricks
- Little Things I Like to Do with Git