20 Git Command-Line Tricks Every Developer Should Know
Git is an essential version control tool for developers. Although GUI tools can simplify some tasks, mastering the Git command line offers deeper control, flexibility, and speed. Here are 20 Git command-line tricks that every developer should know to streamline their workflow.
1. Set Global Configuration
Ensure your commits are tagged with the correct identity.
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
๐ก Tip: Use --local
instead of --global
to set project-specific configurations.
2. Undo the Last Commit (without losing changes)
If you made a mistake in the last commit, you can undo it.
git reset --soft HEAD~1
This leaves your changes staged, so you can amend the commit or fix the issue.
3. Amend the Last Commit
Forgot to include a change or want to update the commit message?
git add .
git commit --amend -m "Updated commit message"
This updates the previous commit without creating a new one.
4. Stash Uncommitted Changes
Need to quickly switch branches without committing?
git stash
๐ก Retrieve the stash later with:
git stash pop
5. View Commit History Graphically
Visualizing the commit history makes it easier to understand the project's state.
git log --graph --oneline --all
6. Change the Commit Author
Change the author of the last commit.
git commit --amend --author="New Author <newauthor@example.com>"
7. Check Differences in Staged Changes
Use git diff to compare files at different stages.
git diff --staged
This shows the changes that are staged but not yet committed.
8. Find a Bug with Bisect
Use git bisect to find the commit that introduced a bug.
git bisect start
git bisect bad # Current commit is bad
git bisect good <commit-hash> # A known good commit
Git will walk through the commit history to identify the problematic commit.
9. Rebase for a Clean Commit History
Rebasing rewrites your commit history for clarity.
git rebase -i HEAD~3
This lets you edit, squash, or reorder your last 3 commits.
10. Cherry-Pick Specific Commits
Want to bring a specific commit from another branch?
git cherry-pick <commit-hash>
11. List All Branches (Local and Remote)
See which branches are available.
git branch -a
12. Clean Untracked Files and Directories
Quickly remove unwanted files that are not tracked by Git.
git clean -fd
๐ก Use -n
for a dry run to preview what will be removed.
13. Track an Upstream Branch
Keep your local branch in sync with a remote branch.
git branch --set-upstream-to=origin/main
14. Squash Commits with Interactive Rebase
Combine multiple commits into one.
git rebase -i HEAD~n # Replace 'n' with the number of commits
15. View the File at a Specific Commit
Check a file's state at a particular commit.
git show <commit-hash>:path/to/file
16. Edit the .gitignore After Committing
If you forgot to ignore certain files, update .gitignore.
echo "node_modules/" >> .gitignore
git rm -r --cached node_modules/
git commit -m "Update .gitignore"
17. Revert a Pushed Commit
Undo changes from a specific commit without changing history.
git revert <commit-hash>
18. Fetch Only Metadata
Want to avoid fetching the whole repository?
git fetch --dry-run
This lets you see what would be fetched without actually downloading data.
19. Blame a Line of Code
Find out who wrote a specific line in a file.
git blame path/to/file
20. Reset a File to the Last Commit
Discard local changes to a specific file.
git checkout -- path/to/file
These 20 Git command-line tricks can make your development process smoother, whether you are working alone or with a team. While GUI tools offer convenience, mastering the Git command line provides more control over your workflows. Try out these commands and elevate your Git skills!
Happy coding! ๐
Follow me on github:
Top comments (18)
Thanks for sharing these useful tips!
Some additional useful ones:
git reset --hard [git hash]
is helpful if you want to get rid of unwanted changes.git config http.postBuffer 524288000
is useful if you want to upload larger files. By default the buffer size is 1MB.@qianl15 , You're welcome! Those are great tips too!
I would suggest that if you're committing files larger than 1MB, you should probably be using git lfs, or not using git at all.
One option, if you've got large files that you need, is to upload these files to something like S3, add the file to
.gitignore
, and add a script to download these files when needed (possibly to aMakefile
or something similar).Thanks for putting together such a great list!
One thing you could add is a message to stash:
git stash -m 'library updates'
. Unnecessary if you are able to quickly return to your stashed work, but useful for lingering partial work.Thanks @oculus42 ,
Using
git stash -m 'library updates'
is a great addition, especially when you have partial work that might sit for a while. Adding a message makes it easier to keep track of what's been stashed. Definitely a good practice!A number of these are flawed:
2) Can be shorter: For some time now, --soft is the default
3) Can be shorter: git add . is unnecessary
5) Add --decorate to see branches and tags in the case that log.decorate config is "no".
6) I can't think of a reason you'd reasonably need to change the commit author
9) This should have HEAD~n as in #14
14) This command doesn't do anything except start an interactive rebase. You need to then replace "pick" in the todo with "squash" to actually accomplish a squash. A more direct answer would be to "git reset HEAD~(n-1)" followed by "git add *" followed by "git commit --amend"
You should also just replace all ref shortcuts with "commit-ish" as in #10
Lastly, you missed my personal favorite: "git commit --fixup <commit-ish>" followed by "git rebase -i --autosquash <commit-ish>~1"
@christopher_eberle_691d0e ,
Thanks for the detailed feedback!
2) You're incorrect,
--mixed
is the default, so it can definitely be shortened.3) Good point!
git add .
is often unnecessary.5) Adding
--decorate
is a useful tip for seeing branches and tags when log.decorate isn't enabled.6) I can't agree with this because In some situations, like when I am working for someone else and need to commit under their name (as part of an agreement), changing the commit author can be necessary. It helps present the work as theirs, even though I'm the one doing the actual coding (and I am being paid for it).
Additionally, if I am juggling multiple projects where my own commits are required, having the ability to switch commit authors really comes in handy. So, while it might not be common, it definitely has its use cases!
9) Correct, using
HEAD~n
would be more consistent with #14.14) Youโre absolutely rightโsimply starting an interactive rebase isnโt enough. Your suggestion of
git reset HEAD~(n-1)
, followed bygit add *
, thengit commit --amend
, is a more direct and effective solution.Replacing all ref shortcuts with
commit-ish
is a great idea as well.And thanks for sharing your favorite:
git commit --fixup <commit-ish>
followed bygit rebase -i --autosquash <commit-ish>~1
. That's definitely a handy one!2) --soft is not default. The default is "--mixed" when using
git reset HEAD
Yes correct @dhavalgojiya !!
must-save thread. bookmark added. thank you
You're Welcome @uciharis !
I saved these commands in my documents for both personal and official use. Then, I got the idea to share them as a blog.
This thread is must-save thread. Thanks for sharing.
thanks @john12
This is one of the best git article, with so much knowledge in it. Nice to keep it as pin or bookmark. Thanks to the @jagroop2001
Thank you so much! @anubhavbhatt Iโm really glad you found the article useful.
@jagroop2001 ,I really appreciate the insights youโve shared and will definitely keep an eye out for more!
thanks @hraifi
Thank you for sharing this!
One question regarding the bisect command, could you explain it more because this command seems interesting and very helpful.
Keep inspiring others! Good work