mokacoding

unit and acceptance testing, automation, productivity

Git-iquette

I'd like to suggest the introduction of a Git-iquette in every project, an etiquette in the version control usage.

I've recently started a greenfield project with a new client, with a team bigger than what I'm used to. As a team we discussed a coding styleguide, as set of rules and conventions to apply to both the style we use to code, the architectural choices, and the preferred patterns.

This is a very valuable thing to have, specially for a team. If everybody writes with the same style, it's gonna be easier for a reader of the code to understand different parts of the system, and to start working on a piece that hasn't been written by them.

I consider this an application of the "principle of least surprise", the code I'm gonna read is written in the style I'm expecting, and the components in the system follow the same set of rules.

For these reasons having a set of rules on how to check-in code and how to manage the repository is incredibly valuable too.

In his article "Every line of code is always documented" Mislav Marohnić shows how by using git blame and git show he understood the reasons behind a cryptic line of code, and how important it was for the behaviour of the software.

The repository is the history of the codebase. Some TV shows have a "previously on ...", that's the same when we read the git log after a pull, we get up to date with the latest developments of the project.

What we don't want is a summary of the changes happened while we were away written like this:

Doesn't work!

End of day commit

Checking this in because it's time for a beer

Equally bad is getting a single gianormous commit that adds a bug fix, three feature, and removes a bunch of unused files.

So here's some starting points to use when writing a project's Git-iquette.

How to write a Git-iquette

Short commits

Commits should be small and atomic.

Title and description

The commit message should have a short, less than 50 characters, title, that describes what the has been done in the commit.

If needed, a more detailed description can be written after the title, leaving an empty line between the two.

More tips on how to write a good commit message here.

Commit title style

Given for granted that we all agree on the fact commits should be small and atomic, we need some rules on how to write the commit message.

First of all, which verb to use? When reading a book it'd be confusing if the author kept changing the verbs tense, and the same stands for our git log. Choose a style:

Add awesome feature

Adds awesome feature

Added awesome feature

They're all legit and reasonable, the important thing is to be consistent. My preference is to use imperative verbs, because it's the same thing git does in it's generated commit messages.

Merge vs Rebase

Merge vs rebase is an open discussion in the community, and both options have their pros and cons. Again the important thing is to be consistent, and to provide rules on when it's acceptable to merge instead of reabsing, or vice versa.

Special workflows

On top of merge vs rebase there are other workflows that can be adopted to manage the version control in an effective way. For example git-flow makes it simpler to work on features, while the GitHub flow is very good for teams that focus on code reviews.

Evaluate if the team will benefit from using a particular workflow, and make it clear in the Git-iquette.

Hooks

Finally there could be useful git hooks to add. Everything that can be automated should be automated!

Wrapping it all up

What's listed above is just a suggestion on what to take into consideration when writing a Git-iquette, a version control styleguide. The choices proposed are based on what works for me, and they might not work for you. The important takeaway is to have a clear set of guidelines, and to always be consistent.

If you have suggestions or want to share a Git-iquette that works for you leave a comment below, or tweet me @mokagio.

Happy version control check-ins

Want more of these posts?

Subscribe to receive new posts in your inbox.