(Minhas) Guidelines para contribuir para um repositório Git

#dev, #git, #me

Após trabalhar por 10 anos e desde o começo usando git, eu tenho muitas opniões. Sim, opniões. O que acho bom fazer ou não para um repositório de uma comunidade (uma empresa também é uma comunidade).

Proteja a branch master

Sempre proteja a branch master de git push diretamente, seja ele --force ou não. Todos os três maiores serviços de hospedagem git (Gitlab, Github, and Bitbucket) permitem que você faça isso.

master é instável SEMPRE

Se você quiser código estável crie uma branch production ou stable.

Você pode até apagar a branch production ou stable o quanto quiser e fazer cherry-pick de commits, vi isso acontecer uma empresa e funcionou muito bem, obrigado.

Sério, deixe os desenvolvedores fazerem o que quiserem com uma branch instable.

Ah, a propósito, não crie branches que são subbranches de uma funcionalidade maior, é mais fácil ver o código ficar velho.

PR them all

Certamente eu não tenho que explicar isso, mas acabei de ver gente não criando PR para enviar código.

Não faço ideia do porquê disso, posso apenas pensar sobre: talvez a pessoa ficou com medo de alguém ver o código dele(a).

Não me diga que alguém não quer enviar PR por estar com medo de enviar código ruim. Por que o que acontece é justamente o contrário.

De onde esse commit veio não é importante

Determinar um nome de branch não é importante, forçar todos a seguir o mesmo padrão, por exemplo 1234-something-logical-here, só vai fazer com quem não gosta daquele padrão mais frustado. Não forçe a barra.

Além do mais, e se alguém quiser usar um fork? Ou, e se o desenvolvedor tem o seu próprio jeito de nomear branches?

Se você realmente pensa que nome de branch é importante: executa git log aperta espaço 7 vezes, procure um commit que não seja merge branch ‘xxx’ into ‘yyy’ ou merge PR xxxx e me mostra de onde o primeiro commit na sua tela veio (tarefa ou branch) 😉.

Sério, o que é mais importante é a mensagem de commit.

Faça commits com a ID da tarefa

Commitar com a ID da tarefa é uma adição da anterior. Uma mensagem de commit deve ser complete por si mesma, porém muitas vezes uma tarefa não pode ser concluída num único commit.

git commit -m "Fix conflicts"? You must be kidding me if you are using rebase them all you don’t get conflicts, but if you are not, you should at least say what files were involved:

$ git commit -m "Fix conflicts in app/models/category and app/services/category_builder"

Ok, even if you add the name of your task, you should not write Add feature, write someone useful. For example, instead of writing Add merge feature, write something like:

$ git commit -m "Add the ability to merge category and subcategory." -m "[#1234]"

Just merge feature is too generic, maybe after this task, there is comming another merge feature with other models.

Don’t mess with someone else’s branch (NEVER)

Dude, it is my branch, I am messing around with that, writing git commit -m "temporary commit" and git push -f.

If you work with me and if you don’t tell me anything you are more likely to lose the work that you have pushed to my branch.

Always send the code to master

Even if the code is not production ready always send it to the master branch

I know only two companies that create a branch for the main feature, like merge-feature and other small branches and PRs to that branch.

For real: it does not work, code ready should be in the master branch.

Is it a code that is coming public in 3 months? Use something like:

unless Rails.env.production?
  # The super feature that I love here
end

Or

if ENV.fetch("ENABLE_MERGE_FEATURE", false)
  # The super feature that I love here
end

That is a lot of opinions, I like working this way, and you have many bonuses by doing this:

  1. Code review increases code quality and shares of experience;
  2. Protecting the master branch makes it safer for developers to know where they should start changing the code;
  3. Sending everything to master does not let your code get old or the “Ah, it is in that branch… how can we merge now? Let’s start again” feeling;