Git is a phenomenal source control system. Having used some of its predecessors, SVN, CVS and SourceSafe, I'm always impressed at how much better things have gotten. If you have not seen Linus Torvalds talk about why he created git you should take an hour and watch it.
I do think too many developers just gloss over Git. They learn the basic commands they need day to day but miss out on some of the robust features Git has.
So here is my list of my most used and helpful Git commands.
I checked my bash history and the list is exactly what you'd expect. These are the commands everyone knows and uses day to day:
git status #show the status of your working copy git checkout <branch_name> #switch to another branch git checkout -b <new_branch_name> #create a new branch git add . #add everything from your working copy to be committed git commit -m "<commit message>" #commit changes git pull #push your copy to the remote repository git push #pull any changes from the remote repository
Here is my list of commands I use much less often but are very useful in a pinch.
git merge --squash <branch_name>
You should be using a branching model during development. This how to merge one branch into another.
--squash is optional. Using it will squash all the commits into a single commit on the target branch.
Merging remote branch
git merge origin/<branch_name>
Not need to switch to and update a branch before merging it. Just
git pull and merge the remote URL.
git rebase -i HEAD~<number_of_commits>
Forgot a file in the last commit? Did you do a lot of commits to track your work but want to roll them into just one commit? Use rebase to squash them together!
Cherry picking a commit
git cherry-pick <commit_hash>
Want to bring over one commit from another branch into yours? Well, that's what cherry pick is for! It'll just bring over the selected commit to your branch.
Resetting your local copy
git reset --(hard/soft) (<commit_hash>/<branch_name>)
We've all completely fucked up our local copy at least once. It's always fixable with git. Resetting hard will drop your changes, while soft will keep them as staged files. You can also use remote URL's here to reset to the server's working copy.
Create a patch file
git diff > a_file.patch git diff --cached > a_file.patch # if staged
Working remotely and want to have someone look at some code for you? Send them a patch file.
Apply a patch file
git apply --stat a_file.patch
Apply a patch to your local copy.
This is my most used Git feature. I'd always surprised when I see people not using stashes. Stashes gives you a way to save local changes then restore them later.
This makes a few git tasks much easier. Need to switch tasks to work on something else? Stash your changes! Need to merge a branch into your local copy but you have active changes? Stash your changes! Tried an idea that didn't work out but what to revisit the code later? Stash your changes!
Saving a stash
git stash save "Optional Description"
git stash list
Apply a stash
git stash apply <stash_index>
There you have it, a few commands to add to your git toolkit.