Skip to content

Latest commit

 

History

History
257 lines (173 loc) · 15 KB

README.md

File metadata and controls

257 lines (173 loc) · 15 KB

Taller Onboarding: Git workflow

Esse é o onboarding do workflow de git aqui na Taller e decidimos deixar isso aberto para comunidade também porque são coisas que podem ajudar outras pessoas ou times :)

Índice

  1. Introdução
  2. Padrão do nome das branches
  3. Workflow
    1. Atualizando a branch main
    2. Criar uma nova branch
  4. Em desenvolvimento
    1. Passos após você terminar o desenvolvimento da sua história
  5. Enviando seu código para Stage
    1. Primeira forma: rebase e Merge
    2. Segunda forma: reset hard e rebase
  6. Enviando seu código para a Main
    1. Primeira forma: rebase e Merge
    2. Segunda forma: reset hard e rebase
Seu primeiro passo é fazer as seguintes configurações:

1. Aqui todos nós usamos o Tig! Ele ajuda muito na visualização dos commits, branches, pegar hashs e mais um monte de coisas bacanas que vão te auxiliar no dia a dia. Confira a doc dele aqui e já configure no teu pc antes de iniciar sua primeira história do onboarding técnico.
Dúvida sobre a frequência de uso do tig

2. Configure seu email da taller no seu github, caso você for usar seu perfil pessoal. Tem um tutorial bacana nesse link.

3. Configure a autenticação de dois fatores na sua conta, a gente preza por segurança. Tem um tutorial bacana nesse link

4. Configure a conexão com o github por ssh, uma vez ativa a autenticação por dois fatores você não conseguirá realizar clone dos repositórios por https. Tem um tutorial bacana para gerar a chave ssh nesse link e um outro tutorial supimpa para vincular a sua chave ssh com sua conta do github nesse link

Tudo configurado e organizado? Bora entender nosso fluxo e nossos padrões!

Em cada passo descrito nesse onboarding, o mais importante é você entender o que está fazendo e o motivo de fazer ele. Se algo não estiver claro, crie uma issue, abra um PR e nos ajude a melhorar o onboarding para as pessoas que entrarão depois de você.

Padrão do nome das branches

Tanto o nome das branches quanto as mensagens de commit deverão ser em inglês. Nossas branches sempre iniciarão com os tipos de histórias descritos abaixo.

Tipo Descrição
fs História que adiciona uma nova feature ao projeto
hotfix História para resolver bugs no projeto
chore História que adiciona melhorias em configurações do projeto ou do ambiente

Para ficar melhor de entender como nomear nossas branches, bora criar três histórias fictícias:

Primeira história: Uma feature, no qual a sigla do projeto no Jira é AT, o número da história é 1052 e o título é "Permitir que os usuários possam deslogar do app"

Segunda história: Um hotfix, no qual a sigla do projeto no Jira é PD, o número da história é 2043 e o título é "Corrigir mensagem de e-mail já existente"

Terceira história: Uma chore, no qual a sigla do projeto no Jira é EF(histórias de eficiência para nosso time a sigla do projeto é EF), o número da história é 105 e o título é "Atualizar os scripts de deploy do boilerplate de drupal"

Quais são os nomes de branch desejáveis para essas histórias?

Tipo Sigla do projeto número Dois traços Descrição curta
fs AT 1052 -- user-logout
hotfix PD 2043 -- email-error-message
chore EF 105 -- update-deploy-scripts

Para criar uma branch, com a branch main atualizada com o origin do projeto, use o seguinte comando trocando as variáveis dentro de placeholders(${placeholder}):

git checkout -b fs/${sigla do projeto}-${número da história}--${descrição-curta}

Padrão das mensagens de commit

Nós presamos por um changelog fácil de ler e entender o que aconteceu no passado, então hoje adotamos algumas regrinhas que nos ajuda a manter isso, e nas nossas pesquisas encontramos o padrão de Semantic Commit Messages proposto pelo Karma e também vimos esse artigo que inspirou muito nossos padrões e também é uma das nossas bases hoje.

Então todas as mensagens de commit devem seguir o seguinte padrão:

categoria: Verbo e descrição no presente.

Os tipos são: feat, fix, docs, style, refactor, test e chore. Já os verbos mais usados hoje são: update, add, remove, improve, mas você não precisa se limitar a isso. Uma dica é você baixar um dos nossos projetos ativos, e usar o tig para ler uma parte do histórico dos commits e ver os padrões "na prática".

Exemplo e explicação é tudo nessa vida, né? Aqui embaixo você terá mais detalhes sobre ao se refere cada categoria de commit citado anteriormente.

Tipo Descrição Exemplo:
feat: Implementação de alguma novidade: Uma feature, funcionalidade, tela, opção de ação, etc. feat: add node cachetag to ensure content invalidation
fix: Implementação em que a única finalidade é corrigir algum comportamento errôneo do sistema. fix: improve url object verification
docs: Alterações ou incrementos na documentação do projeto. docs: add instructions to force new drupal installation
style: Para alterar identação, vírgulas(retirar ou colocar), etc. Um exemplo é se você está adicionando o prettier ao projeto. Pense nele como estilo de código e não como CSS. style: convert tabs to spaces
refactor: Refatoração/melhoria de código sem alterar funcionalidade. refactor: extract data provider method
test: Refatoração ou adição de testes. Apenas testes. test: update test to add scenario for columnist article
chore: Alterações em arquivos de configuração do projeto ou do ambiente. Logs, pacotes, dependências e etc. chore: add scripts to deploy on vercel


Caso você queira já deixar configurado na sua máquina, existe a git-semantic-commits que já faz a magia da mensagem do commit pra ti. Essa lib é escolha sua usar ou não, o importante é você seguir os nossos padrões.

Workflow

Atualizando a branch main

A fonte da verdade é a branch main. Todas as branchs devem ser criadas a partir da main e deverão ser mergeadas na main através de um pull request.

Quando você estiver desenvolvendo, certifique-se que sua branch main local esteja atualizada com o origin executando:

git remote update
git reset --hard origin/main

git remote update: esse comando pega todas as atualizações do origin(desde a branch que você está até as outras branchs do projeto), mas não fara o merge das alterações em sua branch local.

git reset --hard origin/main: esse comando reseta tua branch local com a origin. Ou seja, tua branch local ficará idêntica ao origin.

Se voce estiver se perguntando "o que é essa porra de origin que tanto falam aqui?", o origin é um termo default que o git usa para se referir ao repositório(remote) de onde você clonou o projeto(seja ele github, gitlab ou bitbucket). Você pode mudar esse nome default, mas não há necessidade. Você pode acessar a documentação oficial para ter mais detalhes.

Criar uma nova branch

Atualize sua branch main conforme explicamos no ítem acima e execute o comando git checkout -b + o nome da branch(com o padrão explicado na sessão Padrão do nome das branches)

git checkout -b ${tipo da branch}/${sigla da história-número da história}--${descrição da issue ou história}

Em desenvolvimento

⚠️ INFORMAÇÃO IMPORTANTE: a branch que você estiver trabalhando deve SEMPRE estar atualizada com a main, para isso usamos o rebase. É sempre bom você ir fazendo rebase durante durante o desenvolvimento, porque se você deixar pra hora de entregar, existe a possibilidade de você passar muito tempo resolvendo conflito.

Para fazer rebase da main, execute:

git remote update
git rebase origin/main

Fique atento porque você não vai conseguir fazer rebase se não tiver commitado ou usado um git stash no que você estava trabalhando.

Terminou sua história?

Abra um pull request para a main e solicite o code review de duas pessoas do time.


⚠️ AVISO: Nunca faça push de commits diretamente na branch main. Seu código só vai pra main depois do pull request, code review e homologação.

imagem com a frase: proibido push de commits diretamente na branch main na frente das crianças, sujeito a paulada

é meme(zoeira), ninguém vai te bater ou dar pauladas.

Terminou sua história, code review feito, alterações ok é hora de enviar sua história para stage.

Enviando seu código para Stage

Nessa etapa temos duas formas de fazer a mesma coisa:

Primeira forma: rebase e Merge Crie uma branch auxiliar para poder fazer rebase com stage nela. Você sairá da sua branch atual:

git checkout -b fs/my-branch--STG

git remote update
git rebase origin/stage

*** resolve conflitos ***

git checkout stage
git reset --hard origin/stage
git merge fs/my-branch--STG

Segunda forma: reset hard e rebase

Você pode simplesmente fazer um hard reset em stage com sua branch e depois fazer rebase com o origin stage para não perder nenhum commit que já estava lá.

git reset --hard fs/my-branch
git rebase origin/stage

Muito importante!

Antes do push, você sempre vai se fazer as seguintes perguntas: meu merge foi fast-forward? olhando no tig, alterei algo criando 'bifurcações'?

~ 😢 😢 😩 😢 😢 ~ ~ 😊 😊 😍 😊 😊 ~
tig feio tig daora
git push origin stage

Enviando seu código para a Main

História homologada, tudo certo e é hora de mandar pra main! Como falamos lá em cima, a ideia é que tua branch esteja sempre atualizada com o origin/main e também temos duas formas de fazer a mesma coisa

Vá para a sua branch, caso você não esteja nela.

1 - Faz o rebase de main pra ficar tudo atualizado

git remote update
git rebase origin/main

se ela já estiver atualizada, você pode ir direto para o proximo passo, caso ela não esteja atualizada, faça o push com os commits atualizados

*** resolve conflitos ***
git push origin fs/my-branch

Primeira forma: rebase e Merge

2 - Vai pra main e atualiza main com a origin

git checkout main
git remote update
git reset --hard origin/main

3 - Adicione seus commits na main com o merge da sua branch:

git merge my-branch

⚠️ Atenção: verifique se seu merge foi fast-forward, olha no tig se tá tudo certo(que não tem um merge commit) antes de seguir. Se e quando estiver tudo certo, faça o push.

git push origin main

Segunda forma: reset hard e rebase

Assim como para enviar para stage, você pode fazer um hard reset em stage com sua branch e depois fazer rebase com o origin stage para não perder nenhum commit que já estava lá.

git checkout main
git remote update

esse primeio passo é para termos certeza que você tem todos commits do origin localmente.

git reset --hard fs/my-branch
git rebase origin/main
git push origin main

Importante: não fique com o código só em sua máquina

É uma grande fragilidade quando ficamos com o código somente em nossas máquinas sendo que temos todos os recursos na nuvem para que o mesmo seja compartilhado. Se não deu tempo de organizar seus commits, é perfeitamente normal mandar um commit tendo "WIP" como mensagem, e os git hooks podem ser contornados com a flag --no-verify. No outro dia, basta resetar esse commit e seguir o trabalho normalmente (será necesário fazer um push force depois disso). Só faça isso no seu branch, nunca em branches de integração.