Indo além de "pontos de salvamento para código".
Toda base de código tem um momento em que alguém deleta o arquivo errado, quebra uma funcionalidade que estava funcionando ou envia uma mudança que não deveria ter saído. Sem controle de versão, a recuperação significa torcer para que alguém tenha uma cópia recente no laptop. Com o Git, a recuperação é um comando.
git log mostra todos os estados em que sua base de código já esteve — quem mudou o quê, quando e por quê. git diff permite comparar quaisquer dois pontos no histórico para ver exatamente o que mudou. git checkout (ou git restore) permite recuperar um arquivo — ou um diretório inteiro — de qualquer commit anterior. Essas não são ferramentas de emergência que você aprende quando as coisas quebram. São ferramentas diárias que tornam você mais rápido: comparando a abordagem de ontem com a de hoje, confirmando o que mudou entre dois deploys, recuperando uma função que você deletou na semana passada.
As equipes que tratam o Git como "apenas salve meu código" estão deixando os recursos mais poderosos sem uso. Viagem no tempo não é uma metáfora — é uma capacidade literal. Cada commit é um snapshot que você pode revisitar, comparar ou restaurar. O único requisito é que você faça commits com frequência suficiente para ter snapshots úteis.
Dois engenheiros editando o mesmo arquivo ao mesmo tempo é o problema mais antigo no trabalho colaborativo de software. Antes do controle de versão, as equipes usavam bloqueios de arquivo ("Estou editando config.ts, não mexa"), janelas de edição agendadas ou simplesmente torciam pelo melhor. Todas as três abordagens colapsam em escala.
O Git resolve isso com branches. Um branch é uma cópia isolada da base de código onde você pode fazer mudanças sem afetar o trabalho de ninguém. Você escreve sua funcionalidade, seu colega escreve a dele, e nenhum de vocês vê o código inacabado do outro até que ambos estejam prontos. O merge é o ponto de integração — o momento deliberado onde dois fluxos de trabalho se combinam e quaisquer conflitos surgem.
Isso não é apenas sobre prevenir arquivos atropelados. Branches dão a você permissão para experimentar. Você pode tentar uma refatoração arriscada, decidir que está errada e deletar o branch — sem danos, sem necessidade de revert, sem ruído de commits no histórico compartilhado. O custo de um experimento fracassado cai para perto de zero, o que significa que os engenheiros tentam mais coisas. Equipes que usam branches bem entregam mais rápido porque exploram mais opções antes de se comprometer com uma.
O Git é um log de auditoria completo de quem mudou o quê, quando e — se os commits forem bem escritos — por quê. Cada linha de código na sua base de código tem um autor, um timestamp e uma mensagem de commit anexada a ela via git blame. Isso não é vigilância; é contexto.
Quando você encontra um pedaço de código confuso, git blame diz quem o escreveu e quando. A mensagem de commit associada diz por quê. O PR associado (se sua equipe os usa) fornece a discussão completa que levou àquela decisão. Essa é a diferença entre "Não faço ideia de por que isso está aqui" e "Ah, a Sarah adicionou isso em março para lidar com o caso extremo onde a API retorna null — aqui está o ticket."
A trilha de auditoria também torna cada mudança reversível. Um deploy ruim não é uma crise — está a um git revert de distância da recuperação. Um arquivo deletado não se foi — ele existe em cada commit antes da deleção. A combinação de atribuição e reversibilidade dá às equipes a confiança para se mover rápido. Você pode entregar diariamente porque reverter é barato, e você pode reverter precisamente porque sabe exatamente o que mudou.
O Git é uma máquina do tempo, não um backup
O ponto não é salvar seu código — o Dropbox faz isso. O ponto é navegar por cada estado em que seu código já esteve, e mesclar esses estados intencionalmente.