Cover do episódio 35: Git em time real na faculdade — e por que foi diferente de tudo que aprendi vendo tutorial
#03514 de agosto, 20173 min leituraUniversidade e MercadoS2 · 2017

Git em time real na faculdade — e por que foi diferente de tudo que aprendi vendo tutorial

Aprendi git em tutorial. Sabia add, commit, push. Quando entrei em um projeto com outras pessoas na faculdade, descobri que não sabia nada.

GitTrabalho em TimeFundamentosUniversidade

Primeira vez que quebrei o repositório do time foi por causa de um git push --force.

Eu não sabia o que --force fazia de verdade. Sabia que "forçava o push". O que não sabia era que "forçar" significa reescrever o histórico remoto com o que você tem local — deletando os commits dos outros no processo.

Dois colegas perderam trabalho. Foi um silêncio muito desconfortável no laboratório.


Aprendi git em tutorial online. O tutorial me ensinou add, commit, push, pull, branch, merge. Funcionava quando era só eu. O repositório era meu, eu sabia o que tinha nele, não tinha conflito, não tinha histórico que importava preservar.

Entrei no projeto de pesquisa na faculdade e descobri que git em time não é uma extensão de git individual. É uma prática diferente com as mesmas ferramentas.

A diferença principal: em git individual, o repositório é buffer. Em git em time, o repositório é comunicação. Cada commit é uma mensagem para alguém. O histórico é a memória compartilhada do que aconteceu e por quê.


O que aprendi que nenhum tutorial ensina:

Commit message não é descrição do que você fez. É contexto para quem vai ler depois. "Fix bug" não ajuda ninguém. "Fix null pointer in auth middleware when token missing from header" ajuda o próximo dev — que pode ser você daqui 6 meses sem lembrar de nada.

Branch não é só para isolar código. É para isolar intenção. Uma branch por feature, por experimento, por tentativa. Quando você mistura duas coisas numa branch, o merge fica confuso e o histórico perde sentido.

Conflito de merge não é um erro. É dois trabalhos paralelos que precisam ser reconciliados. Resolver conflito é tomar uma decisão — não é desfazer o trabalho de alguém. Quando você entende isso, conflito deixa de ser estressante.

Rebase vs merge tem consequência. Rebase reescreve histórico local. Se você fez rebase de uma branch que alguém mais está usando, você criou divergência. Essa foi a versão mais leve do meu erro com --force.


Depois do incidente com o push forçado, um professor sentou comigo e passou 20 minutos explicando como o time usava git. Não era aula formal. Era "vê como a gente faz aqui".

Esse padrão se repetiu em todos os times que passei depois. O que aprendi sobre git de verdade não foi em documentação. Foi olhando o fluxo de pessoas que já tinham destruído o repositório antes de mim e aprendido o que não fazer.


Se você está aprendendo git agora: os tutoriais ensinam os comandos. O que você precisa praticar são as conversas em torno dos comandos. Por que esse commit? Por que essa branch? Por que agora e não depois?

Git é uma ferramenta de coordenação. O código é o que fica gravado. A coordenação é o que faz o código evoluir sem destruir o que já existe.

Essa semana: abre o git log do último projeto que você trabalhou. Você consegue entender o que aconteceu só pelas mensagens de commit?