New Things I Learned About git…

thatconference

Rick HerrmannOne of the sessions I attended at That Conference was the “Understanding Git Part-2” talk  by Keith Dahlby.  I have worked with git and github a lot over the last 5 years, but I learned quite a bit from this talk.  In this post, I will highlight some of the most useful takeaways.

Config Settings

git has numerous configuration settings which fall into three categories: Global, User, and Repository.  You can view your git settings with:

git config -l

I have always edited configuration settings on the command line one at a time but I learned that

git config -e --global

will open up a text editor with the config settings. This is much easier than viewing them from the command line or editing one at a time.
Other useful default settings I was unaware of are:

merge.keepBackup = false
diff.renames = copies
pull.rebase = true

merge.keepBackup should be false otherwise you get useless .orig files when there are merge conflicts. diff.renames should be set to “copies” which tells git explicitly to track renamed files.
pull.rebase should be set to true to avoid getting merge commits when you do a pull and it is not a fast-forward update.

Shortcuts

I have a few aliases setup for the simple commands that I use most commonly (status, branch, commit, and checkout) but Dahlby showed how to create aliases that combine more than one command.  For example, when you have new files the standard

git commit -am "message..."

does not work because the -a (for Add) will not stage the new files. A useful alias that will include new files as well as changes would look like:

git alias.call "!git add -A && git commit"

(Note the use of “!” when combing multiple git commands).  So now if you have new files you can commit everything in one command with:

git call -m "message"

“call” stands for commit-all but you can use another alias name if that make sense for you.

Another useful alias he suggests is:

git config alias.new = log master.. --reverse

So “git new” would should show all commits on the current branch that are not in master starting with the first added commit.

History Inspection

Other than listing commits with

git log
git log --oneline

searching through history is not something I have used much.  But there are actually some pretty powerful search capabilities for finding commits.  For example:

git log --since 8/20/2016
//only shows commits on or after 8/20/2016

git log --until 7-31-2016
//limits commits to on or before 7/31/2016

git log --author rwherrmann@gmail.com
//limits commits to a specific user

git log --committer rwherrmann@gmail.com
//the committer may be different than the author

git log --branches
//includes commits in all branches

git log --grep="cool report"
//finds all commits with the test "cool report" in the commit message

Each of these switches is useful on it’s own, but they become very powerful when they are combined. For example:

git log --branches --author rwherrmann@gmail.com --until 5/31/2016
//shows all commits by me in all branches prior to 6/1/2016

git log --grep="cool report" --branches --since 7/1/2016
//shows all commits with the text "cool report" in all branches since 7/1/2016

There are also options for searching within the code itself instead of just the commit message.

git log -S "controller" -p
//displays all commits where the change diff included the word "controller" 
and displays the changed code.

 

In my next post I will look at some interesting ways to manipulate history in git.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s