Hey all, it’s Christmas again. Just kidding… But the new git 1.8.4 is out!

This time is so packed with awesome that my selection skills have been put hard to the test.

It’s easy and painless to upgrade

It is customary for me to provide a few pointers for the upgrade, with caveats and reminders that package managers in some cases might delay the distribution; That is out of my hands. In any case here some painless instructions to
upgrade:

  • Type brew update && brew upgrade git if you use homebrew on OSX.
  • Use a magic apt trick if on Ubuntu based distributions (i leave other distributions as an exercise for the reader).
  • Simply run the new installer if on Windows (the Windows port sometimes lags a bit behind so please be patient if you can’t find it right away).

If you haven’t seen them yet check out my earlier notes on releases 1.8.2 and 1.8.3.

So what’s new in this release?

The things that caught my eye are:

  • submodule and rebase got some love.
  • Cool refinements for information finding commands: updates to diff, log and status.
  • And more sparse stuff, still awesome.

Read further for details and enjoy!

Submodule love

You can now invoke git submodule commands from subdirectories instead than having to be in the working tree of the superproject and most operations now work also on a submodule at a path whose name is not in ASCII.

git submodule update has two new features:

  • It can optionally clone the submodules shallowly.
  • It gained a configuration variable submodule.*.update which allows you to run a custom command when invoked (in alternative to the already present –rebase, –merge options).

Rebase coolness: auto-stash, start hook and more

  • git rebase -i now honors –strategy and -X options.
  • git rebase [-i] reflog messages have been reworded to be more informative.
  • using git rebase –autostash you can now save local changes in the stash before the performing the operation. Before this release rebase would just refuse to run.
  • git rebase can be told with :/look for this string syntax commits to replay the changes onto and where the work to be replayed begins.

Status, logging and diff-ing power

  • git status gains new configuration variables status.branch and status.short saving you from typing –branch and –short respectively (or complicating your aliases). You can now override the configuration with –no-branch and –no-short if needed.
  • git log has a new –author-date-order which is awesome, with it:

    The output is topologically sorted and commits in parallel histories are
    shown intermixed together based on the author timestamp.

  • git diff has a new mode that ignores changes which consists only of additions and removals of blank lines, similar to GNU diff’s -B.
  • git log -Lline,range:filename has been added. This may still have leaks and rough edges, though.

Sensible defaults for color.ui

The variable color.ui now defaults to auto now so there is no need for new users to set it in their .gitconfig anymore.

Other bits on UI, Workflows & Features

  • git name-rev now is even more useful as it can name an annotated tag object back to its tagname:
    
    
    1
    git name-rev $(git rev-parse v1.0.0) gives tags/v1.0.0, for example.
  • The contrib/ folder now contains an interesting new contacts script that runs git blame to find people that might be interested in a set of changes. Atlassian Stash has an add-on that does the same thing, embedded in the pull request UI.
  • git clean can now be used interactively.
  • git show -s has now a more explicit version of itself as git show –no-patch.
  • git check-mailmap is a new command that lets you map usernames and e-mail addresses through the mailmap mechanism, just like many built-in commands do.
  • git describe learned –first-parent option to limit its closest tagged commit search to the first-parent chain.
  • git fetch origin master unlike git fetch origin or git fetch did not update refs/remotes/origin/master, now it does. See full release notes for more details on why.

Subsystems and ports.

  • Cygwin port has been updated for more recent Cygwin 1.7.
  • Git-gui has been updated to its 0.18.0 version.

Conclusions

And that wraps it up for this release. Enjoy the goodies and let me know if there are worthy items I missed in the long list of updates.

As usual follow me @durdn and the awesome @AtlDevtools team for more git rocking.