Ignorando arquivos e boas práticas


Você clona um projeto chamado weather-app, roda npm install e confere o status do seu novo repositório.
$ git status
Untracked files:
(use "git add <file>..." to include in what will be committed)
node_modules/
dist/
.envTrês pastas e arquivos aparecem como não rastreados, e nenhum deles deveria estar em um commit. node_modules/ são milhares de arquivos que o npm install regenera a partir do package.json em segundos. dist/ é o resultado do build, que é reconstruído a partir do seu código-fonte a cada vez. E .env guarda uma chave de API. Nada disso deveria entrar no histórico do seu projeto, e digitar git add . sem pensar é exatamente como isso acaba acontecendo de qualquer jeito.
Dizendo ao Git o que ignorar
Um arquivo .gitignore lista padrões de arquivos e pastas que o Git nunca deve rastrear. Você o cria uma única vez na raiz do seu projeto, o mesmo lugar onde você rodou git init quando configurou o repositório em Seu primeiro repositório, e a partir daí, git status e git add . simplesmente ignoram tudo que corresponder aos padrões.
# .gitignore
node_modules/
dist/
.envCada linha é um padrão: um nome de pasta simples como dist/ ignora essa pasta inteira, em qualquer lugar em que ela apareça no projeto. Faça commit do próprio arquivo .gitignore. Ele é pequeno, é útil para todo mundo que clona o projeto, e merece estar no histórico assim como o seu código-fonte.
$ git status
On branch main
nothing to commit, working tree cleanCom os padrões configurados, o git status fica quieto. E é exatamente esse o objetivo: as pastas e arquivos que você nunca quer commitar deixam de aparecer como ruído, então o que aparece é o que realmente importa.
.gitignore lista o que o Git nunca deve rastrear: node_modules/, dist/ e .env são os suspeitos de sempre em praticamente qualquer projeto. Faça commit do próprio arquivo .gitignore para que todo mundo que clonar o projeto tenha o mesmo status limpo. Uma vez eu perdi uma tarde inteira porque adicionei por acidente milhares de arquivos de dependência antes de aprender isso. Nunca faça commit de segredos
Uma chave de API, uma senha de banco de dados ou um certificado de assinatura nunca deveriam aparecer em um commit. Isso vale tanto para um repositório privado quanto para um público, e vale desde o primeiro commit em diante. Coloque os segredos em um arquivo como .env, adicione esse arquivo ao .gitignore desde o primeiro dia, e carregue os valores no seu app a partir dali, em vez de escrevê-los diretamente nos seus arquivos de código.
# .env
WEATHER_API_KEY=sk_live_9f8e7d6c5b4a# .gitignore
.envSiga essa regra automaticamente, sempre, sem exceções. Uma chave presente em um commit fica acessível para qualquer pessoa com acesso ao repositório, e, em um repositório público, para absolutamente qualquer pessoa.
.env e adicione o .env ao seu .gitignore antes mesmo de rodar o primeiro git add. Essa é a única regra deste capítulo inteiro que vale tratar como absoluta. Adicionando um arquivo ao .gitignore depois que ele já está rastreado
Essa é a pegadinha que apanha quase todo mundo pelo menos uma vez. Você comita um arquivo por acidente, percebe o erro, adiciona ele ao .gitignore (a linha com echo abaixo acrescenta o caminho a esse arquivo) e espera que o Git se esqueça dele. Mas não é isso que acontece.
$ git add config/settings.json
$ git commit -m "Add app settings"
# later, you realize this was a mistake
$ echo "config/settings.json" >> .gitignore
$ git status
On branch main
nothing to commit, working tree cleanO git status mostra uma árvore limpa, mas config/settings.json continua rastreado e continua aparecendo em todo git log futuro e em todo clone. As regras de ignore só valem para arquivos que o Git ainda não conhece. Uma vez que um arquivo foi adicionado e commitado, ele passa a fazer parte do seu histórico, e o .gitignore não tem nenhuma influência sobre arquivos que já estão nesse histórico.
Para realmente parar de rastrear esse arquivo daqui para frente, diga ao Git para deixar de acompanhá-lo, mantendo o arquivo no seu disco:
$ git rm --cached config/settings.json
$ git commit -m "Stop tracking config/settings.json"git rm --cached <arquivo> remove o arquivo do rastreamento do Git sem excluí-lo do seu diretório de trabalho. Faça commit dessa remoção, e a partir daí seu padrão no .gitignore passa a fazer o trabalho que você queria desde o início.
.gitignore depois que o Git já o rastreia não muda nada para esse arquivo. As regras de ignore só valem para arquivos que o Git ainda nunca adicionou. Para parar de rastrear um arquivo que entrou por acidente, rode git rm --cached <arquivo> e faça commit dessa mudança. Boas práticas: commits pequenos e um repositório limpo
Um .gitignore bem cuidado é só metade do caminho para manter um repositório agradável de se trabalhar. A outra metade é como você organiza os seus commits. Faça de cada commit uma mudança focada: uma correção de bug, uma pequena funcionalidade, um único refactor. Se uma tarde de trabalho toca em várias coisas sem relação entre si, divida em vários commits em vez de jogar tudo em um só no fim do dia.
$ git add src/weather-widget.js
$ git commit -m "Fix temperature rounding in weather widget"Commits pequenos são mais fáceis de revisar, mais fáceis de desfazer se algo quebrar, e mais fáceis de entender seis meses depois, quando você está tentando lembrar por que uma linha de código existe. O ciclo de commits explica o que faz uma mensagem de commit ser útil; esse hábito é sobre manter a própria mudança pequena o suficiente para que escrever uma boa mensagem seja até possível.
.gitignore cobrindo as pastas e os segredos que nunca deveriam ser rastreados. Esses dois hábitos juntos são a maior parte do que torna um repositório agradável de se trabalhar. Hábitos pequenos, formados desde o início, poupam bastante limpeza mais tarde. 
