Conteúdo: Introdução | As Sete Regras | Dicas
- Introdução: Porque as boas mensagens de commit são importantes
- As sete regras de uma grande mensagem de commit de Git
- Separate subject from body with a blank line
- Limite a linha de assunto a 50 caracteres
- Capitalizar a linha de assunto
- Não termine a linha de assunto com um ponto
- Utilizar o humor imperativo na linha de assunto
- Brulhe o corpo com 72 caracteres
- Utilizar o corpo para explicar o quê e por quê vs. how
- Dicas
- Aprenda a amar a linha de comando. Deixe o IDE para trás.
- Ler Pro Git
Introdução: Porque as boas mensagens de commit são importantes
Se você navegar pelo log de qualquer repositório Git aleatório, você provavelmente descobrirá que suas mensagens de commit são mais ou menos uma bagunça. Por exemplo, dê uma olhada nestas gemas dos meus primeiros dias de submissão para Spring:
$ git log --oneline -5 --author cbeams --before "Fri Mar 26 2009"e5f4b49 Re-adding ConfigurationPostProcessorTests after its brief removal in r814. @Ignore-ing the testCglibClassesAreLoadedJustInTimeForEnhancement() method as it turns out this was one of the culprits in the recent build breakage. The classloader hacking causes subtle downstream effects, breaking unrelated tests. The test method is still useful, but should only be run on a manual basis to ensure CGLIB is not prematurely classloaded, and should not be run as part of the automated build.2db0f12 fixed two build-breaking issues: + reverted ClassMetadataReadingVisitor to revision 794 + eliminated ConfigurationPostProcessorTests until further investigation determines why it causes downstream tests to fail (such as the seemingly unrelated ClassPathXmlApplicationContextTests)147709f Tweaks to package-info.java files22b25e0 Consolidated Util and MutableAnnotationUtils classes into existing AsmUtils7f96f57 polishing
Yikes. Compara isso com estes commits mais recentes do mesmo repositório:
$ git log --oneline -5 --author pwebb --before "Sat Aug 30 2014"5ba3db6 Fix failing CompositePropertySourceTests84564a0 Rework @PropertySource early parsing logice142fd1 Add tests for ImportSelector meta-data887815f Update docbook dependency and generate epubac8326d Polish mockito usage
Que preferes ler?
A primeira varia em comprimento e forma; a segunda é concisa e consistente.
A primeira é o que acontece por defeito; a segunda nunca acontece por acidente.
Embora muitos logs de repositórios se pareçam com os primeiros, existem excepções. O kernel do Linux e o próprio Git são grandes exemplos. Veja o Spring Boot, ou qualquer repositório gerenciado por Tim Pope.
Os contribuidores desses repositórios sabem que uma mensagem de commit do Git bem elaborada é a melhor maneira de comunicar o contexto sobre uma mudança aos colegas desenvolvedores (e de fato aos seus futuros “eus”). Um diff lhe dirá o que mudou, mas somente a mensagem de commit pode lhe dizer apropriadamente o porquê. Peter Hutterer faz bem este ponto:
Restabelecer novamente o contexto de um pedaço de código é um desperdício. Não podemos evitá-lo completamente, por isso os nossos esforços devem ir no sentido de o reduzir o mais possível. Mensagens de commit podem fazer exatamente isso e como resultado, uma mensagem de commit mostra se um desenvolvedor é um bom colaborador.
Se você não deu muita atenção ao que faz uma grande mensagem de commit do Git, pode ser que você não tenha gasto muito tempo usando git log
e ferramentas relacionadas. Há um ciclo vicioso aqui: como o histórico de commit é não-estruturado e inconsistente, não se gasta muito tempo usando ou cuidando dele. E porque não é usado ou cuidado, ele permanece não-estruturado e inconsistente.
Mas um bem cuidado com o log é uma coisa bonita e útil. git blame
, revert
, rebase
, log
, shortlog
e outros sub-mandos ganham vida. Rever os compromissos dos outros e puxar pedidos torna-se algo que vale a pena fazer, e de repente pode ser feito de forma independente. Entender porque algo aconteceu há meses ou anos se torna não apenas possível, mas eficiente.
O sucesso de um projeto a longo prazo repousa (entre outras coisas) na sua capacidade de manutenção, e um mantenedor tem poucas ferramentas mais poderosas do que o log do seu projeto. Vale a pena dedicar algum tempo para aprender a cuidar de um de forma adequada. O que pode ser um incômodo no início logo se torna hábito, e eventualmente uma fonte de orgulho e produtividade para todos os envolvidos.
Neste post, estou me dirigindo apenas ao elemento mais básico para manter um histórico de comprometimento saudável: como escrever uma mensagem de comprometimento individual. Existem outras práticas importantes, como a de “commit squashing”, que eu não estou abordando aqui. Talvez eu faça isso num post posterior.
As principais linguagens de programação têm convenções bem estabelecidas sobre o que constitui estilo idiomático, ou seja, nomear, formatar e assim por diante. Há variações nestas convenções, claro, mas a maioria dos desenvolvedores concorda que escolher uma e aderir a ela é muito melhor do que o caos que acontece quando cada um faz a sua própria coisa.
A abordagem da equipe ao seu registro de commit não deve ser diferente. A fim de criar um histórico de revisões útil, as equipes devem primeiro concordar em uma convenção de mensagens de commit que defina pelo menos as três coisas seguintes:
Style. Sintaxe de Markup, margens de wrap, gramática, capitalização, pontuação. Soletrar estas coisas, remover a adivinhação, e tornar tudo tão simples quanto possível. O resultado final será um log notavelmente consistente que não é apenas um prazer de ler, mas que de facto é lido regularmente.
Conteúdo. Que tipo de informação deve conter o corpo da mensagem de compromisso (se houver)? O que não deve conter?
Metadata. Como deve ser referenciada a emissão de IDs de rastreamento, números de pedido, etc.?
Felizmente, existem convenções bem estabelecidas sobre o que faz uma mensagem de commit Git idiomática. De fato, muitas delas são assumidas na forma como certos comandos Git funcionam. Não há nada que você precise reinventar. Apenas siga as sete regras abaixo e você está a caminho de fazer commit como um pro.
As sete regras de uma grande mensagem de commit de Git
Calme-se em mente: Isto já foi tudo dito antes.
- Separar assunto do corpo com uma linha em branco
- Limite a linha do assunto a 50 caracteres
- Capitalizar a linha do assunto
- Não termine a linha do assunto com um ponto
- Utilize o humor imperativo na linha do assunto
- Embrulhe o corpo com 72 caracteres
- Utilize o corpo para explicar o quê e porquê vs. how
Por exemplo:
Summarize changes in around 50 characters or lessMore detailed explanatory text, if necessary. Wrap it to about 72characters or so. In some contexts, the first line is treated as thesubject of the commit and the rest of the text as the body. Theblank line separating the summary from the body is critical (unlessyou omit the body entirely); various tools like `log`, `shortlog`and `rebase` can get confused if you run the two together.Explain the problem that this commit is solving. Focus on why youare making this change as opposed to how (the code explains that).Are there side effects or other unintuitive consequences of thischange? Here's the place to explain them.Further paragraphs come after blank lines. - Bullet points are okay, too - Typically a hyphen or asterisk is used for the bullet, preceded by a single space, with blank lines in between, but conventions vary hereIf you use an issue tracker, put references to them at the bottom,like this:Resolves: #123See also: #456, #789
Separate subject from body with a blank line
From the git commit
manpage:
Embora não seja necessário, é uma boa idéia começar a mensagem de commit com uma única linha curta (menos de 50 caracteres) resumindo a mudança, seguida por uma linha em branco e depois uma descrição mais completa. O texto até à primeira linha em branco de uma mensagem de submissão é tratado como o título da submissão, e esse título é usado em todo o Git. Por exemplo, Git-format-patch(1) transforma uma submissão em email, e usa o título na linha Assunto e o resto da submissão no corpo.
Primeiro, nem todas as submissões requerem tanto um assunto como um corpo. Às vezes uma única linha está bem, especialmente quando a mudança é tão simples que não é necessário mais nenhum contexto. Por exemplo:
Fix typo in introduction to user guide
Nada mais precisa ser dita; se o leitor se pergunta qual foi a digitação, ela pode simplesmente dar uma olhada na própria mudança, ou seja, usar git show
ou git diff
ou git log -p
.
Se você está submetendo algo assim na linha de comando, é fácil usar a opção -m
para git commit
:
$ git commit -m"Fix typo in introduction to user guide"
No entanto, quando uma submissão merece um pouco de explicação e contexto, você precisa escrever um corpo. Por exemplo:
Derezz the master control programMCP turned out to be evil and had become intent on world domination.This commit throws Tron's disc into MCP (causing its deresolution)and turns it back into a chess game.
Comprometer mensagens com corpos não são tão fáceis de escrever com a opção -m
. É melhor escrever a mensagem em um editor de texto apropriado. Se você ainda não tem um editor configurado para uso com Git na linha de comando, leia esta seção do Pro Git.
Em qualquer caso, a separação de assunto do corpo compensa ao navegar no log. Aqui está a entrada de log completa:
$ git logcommit 42e769bdf4894310333942ffc5a15151222a87beAuthor: Kevin Flynn <[email protected]>Date: Fri Jan 01 00:00:00 1982 -0200 Derezz the master control program MCP turned out to be evil and had become intent on world domination. This commit throws Tron's disc into MCP (causing its deresolution) and turns it back into a chess game.
E agora git log --oneline
, que imprime apenas a linha de assunto:
$ git log --oneline42e769 Derezz the master control program
Or, git shortlog
, que agrupa commits por usuário, mostrando novamente apenas a linha de assunto para concisão:
$ git shortlogKevin Flynn (1): Derezz the master control programAlan Bradley (1): Introduce security program "Tron"Ed Dillinger (3): Rename chess program to "MCP" Modify chess program Upgrade chess programWalter Gibbs (1): Introduce protoype chess program
Existem vários outros contextos no Git onde a distinção entre linha de assunto e corpo é feita – mas nenhum deles funciona corretamente sem a linha em branco no meio.
Limite a linha de assunto a 50 caracteres
50 caracteres não é um limite difícil, apenas uma regra de ouro. Manter linhas de assunto com este comprimento garante que elas sejam legíveis, e força o autor a pensar por um momento sobre a maneira mais concisa de explicar o que está acontecendo.
Tip: Se você está tendo dificuldades para resumir, você pode estar cometendo muitas mudanças ao mesmo tempo. Procure por commits atômicos (um tópico para um post separado).
GitHub’s UI está totalmente ciente destas convenções. Ele irá avisá-lo se você ultrapassar o limite de 50 caracteres:
E irá truncar qualquer linha de assunto com mais de 72 caracteres com uma elipse: