Este treinamento pressupõe que você já tem o Git instalado em sua máquina e uma conta ativa no GitHub.
Este repositório contém anotações úteis sobre comandos Git, links de referência, conceitos importantes e soluções para erros comuns.
Entender a diferença entre Git e GitHub é fundamental para quem começa a trabalhar com controle de versão.
O Git é um sistema de controle de versão distribuído (VCS). Ele permite que você e sua equipe rastreiem alterações no código-fonte durante o desenvolvimento de software. Pense nele como uma ferramenta que tira "snapshots" do seu código em momentos específicos, permitindo que você retorne a versões anteriores, veja o histórico de alterações, e colabore com outras pessoas de forma organizada. Ele funciona localmente na sua máquina.
O GitHub é uma plataforma de hospedagem de repositórios Git baseada na web. Em outras palavras, é um serviço online que armazena seus projetos Git na nuvem. Além de hospedar o código, o GitHub oferece diversas funcionalidades sociais e colaborativas, como gerenciamento de issues, pull requests, wikis e muito mais, facilitando a colaboração em projetos de software. Existem outras plataformas semelhantes, como GitLab e Bitbucket.
| Característica | Git | GitHub |
|---|---|---|
| Natureza | Software de controle de versão (local) | Plataforma de hospedagem e colaboração (online) |
| Onde roda? | Na sua máquina local | No navegador web, na nuvem |
| Função | Rastreia e gerencia alterações no código | Hospeda repositórios, facilita colaboração, gerencia projetos |
| Dependência | O GitHub depende do Git para funcionar | O Git não depende do GitHub para funcionar |
Para trabalhar eficientemente com Git e GitHub, é importante entender alguns conceitos-chave:
Um repositório é um diretório (pasta) onde o Git armazena todas as informações do seu projeto, incluindo todas as versões dos seus arquivos e o histórico de alterações. Pode ser local (na sua máquina) ou remoto (no GitHub).
Uma branch (ramo) é uma linha independente de desenvolvimento. Quando você cria uma branch, você está criando uma cópia do seu código em um ponto específico no tempo, permitindo que você trabalhe em novas funcionalidades ou correções de bugs sem afetar a linha principal do projeto. É uma prática comum para isolar o desenvolvimento de diferentes funcionalidades.
Por padrão, quando você inicia um repositório Git, a branch principal é chamada de master. No entanto, o GitHub mudou sua branch padrão de master para main em outubro de 2020. Essa mudança foi para promover a inclusão e evitar termos com conotações de escravidão. Novos repositórios criados no GitHub agora usam main como branch padrão.
Um commit é um "snapshot" das alterações no seu código em um determinado momento. Cada commit registra as mudanças feitas, quem as fez e uma mensagem descritiva. É a unidade básica de trabalho no Git. Existem padrões para a mensagem colocada no commit, e embora não seja obrigatório segui-los, é altamente recomendado para organizar o controle sobre o que é adicionado ao projeto.
No GitHub, uma Issue é uma forma de rastrear tarefas, bugs, melhorias ou perguntas relacionadas ao projeto. Elas funcionam como itens de uma lista de tarefas, permitindo que a equipe discuta e gerencie o trabalho.
Um Pull Request é uma proposta de integração de alterações de uma branch para outra (geralmente da sua branch de funcionalidade para a branch main). Ele permite que outros colaboradores revisem seu código, discutam as mudanças e sugiram melhorias antes que o código seja mesclado ao projeto principal.
No GitHub, uma Organização é uma conta compartilhada por várias pessoas, geralmente usada por empresas ou grandes projetos de código aberto. Ela permite que equipes gerenciem repositórios, membros e permissões de forma centralizada.
Antes de começar a usar o Git, é importante configurá-lo com suas informações. O comando git config permite definir opções de configuração para o Git.
git config --listLista todas as configurações do Git.
As flags --local e --global determinam o escopo da sua configuração:
--local: As configurações são aplicadas apenas ao repositório atual. Se você estiver dentro de um repositório Git, essas configurações terão precedência sobre as configurações globais.--global: As configurações são aplicadas a todos os repositórios Git no seu sistema. Estas são as configurações padrão para qualquer novo repositório que você criar.
Se nenhuma flag for especificada, o Git assume --local se você estiver em um repositório, ou --global se não estiver em um repositório.
É fundamental configurar seu nome de usuário e e-mail, pois essas informações serão associadas aos seus commits.
-
git config --global user.name "Seu Nome"Define o nome de usuário que será exibido nos seus commits. -
git config --global user.email seu.email@exemplo.comDefine o e-mail que será associado aos seus commits. -
git config --global init.defaultBranch mainDefine a branch padrão paramainao inicializar novos repositórios localmente, alinhando com a prática atual do GitHub. Se você não configurar isso, o padrão ainda pode sermasterdependendo da sua versão do Git.
Você pode consultar uma configuração específica sem listar todas elas. Por exemplo:
git config user.nameEste comando retornará apenas o valor configurado para user.name.
Criar um repositório no GitHub é o primeiro passo para hospedar seu projeto online.
-
Entre no GitHub: Faça login na sua conta do GitHub.
-
Novo Repositório: No canto superior direito, clique no sinal de
+(mais) e selecione "New repository" (Novo repositório). -
Nome do Repositório: Digite um nome para o seu repositório (ex:
meu-primeiro-projeto). Escolha um nome claro e conciso. -
Descrição (Opcional): Adicione uma breve descrição do seu projeto.
-
Público ou Privado:
- Público: O repositório será visível para qualquer pessoa na internet. É ótimo para projetos de código aberto.
- Privado: O repositório só será visível para você e para as pessoas com quem você compartilhar explicitamente. Ideal para projetos pessoais ou confidenciais.
-
Inicializar com um
README.md(Opcional, mas recomendado): Marcar esta opção cria um arquivoREADME.mdautomaticamente no seu repositório. OREADME.mdé um arquivo de linguagem Markdown, um sistema de marcação simples que permite formatar texto de forma fácil, usando símbolos para títulos, listas, negrito, itálico e muito mais. No contexto de um repositório, oREADME.mdé um arquivo especial: ele é exibido automaticamente na página principal do seu repositório no GitHub, servindo como a principal documentação do projeto. É o primeiro lugar onde as pessoas que visitam seu repositório procuram informações sobre o que o projeto faz, como instalá-lo, como usá-lo e como contribuir. Por isso, é altamente recomendado iniciar com umREADME.mdpara fornecer um contexto claro e imediato ao seu projeto. -
Adicionar
.gitignore(Opcional): Você pode escolher um template de.gitignorepara a linguagem ou framework que está usando. O.gitignoreé um arquivo essencial que instrui o Git a ignorar certos arquivos e pastas, impedindo que eles sejam rastreados pelo controle de versão. Isso é crucial para manter seu repositório limpo e focado apenas no código-fonte relevante. Por exemplo, arquivos de cache, diretórios de dependências de pacotes (node_modules/,venv/), arquivos de configuração sensíveis ou arquivos gerados automaticamente pela sua IDE são exemplos comuns de itens que devem ser listados no.gitignore. Ao ignorar esses arquivos, você evita adicionar ruído ao histórico do seu projeto e previne problemas de compatibilidade entre diferentes ambientes de desenvolvimento.
-
Escolher uma Licença (Opcional): Adicionar uma licença ao seu projeto define como outras pessoas podem usá-lo. Para projetos de código aberto, licenças como MIT ou Apache 2.0 são comuns.
-
Criar Repositório: Clique em "Create repository" (Criar repositório).
Pronto! Seu repositório agora está no GitHub. O próximo passo seria cloná-lo ou conectar seu projeto local a ele.
git initCria um novo repositório Git vazio dentro da pasta atual. Isso inicializa o rastreamento de versões para o seu projeto.
IMPORTANTE: Caso ocorra qualquer tipo de erro ou alguma configuração incorreta gere problemas, é possível redefinir o Git no diretório local. Para isso, basta excluir a pasta oculta .git, que é criada automaticamente após a execução do comando git init.
Essa pasta não é exibida por padrão, sendo necessário habilitar a visualização de arquivos ocultos no sistema para localizá-la. A exclusão pode ser feita manualmente, como qualquer outro arquivo ou pasta.
Após a remoção, o repositório Git será completamente desvinculado do diretório. Para iniciar uma nova configuração, recomenda-se fechar o terminal (por exemplo, o Git Bash), reabri-lo e executar novamente o comando git init, seguindo então com os passos de configuração desde o início.
git statusMostra o estado atual do seu repositório: quais arquivos foram modificados, quais estão na área de staging (preparados para o próximo commit) e quais são novos ou não estão sendo rastreados. É um comando essencial para acompanhar seu trabalho.
git remote add origin <link do repositório no GitHub>Associa o seu repositório local a um repositório remoto no GitHub. O termo origin é um apelido padrão usado para se referir ao repositório remoto principal. Embora você possa usar outro nome no lugar de origin, é uma convenção comum e recomendada. Se você tiver múltiplos repositórios remotos (por exemplo, um para produção e outro para desenvolvimento), poderá dar nomes diferentes a eles.
IMPORTANTE: Verifique se o link utilizado no comando é exatamente o mesmo do repositório desejado. Caso haja qualquer diferença, corrija o link para que corresponda integralmente ao endereço correto do repositório.
IMPORTANTE: Na maioria dos sistemas operacionais, recomenda-se colar o link no terminal Git Bash utilizando o mouse, e não o teclado. No caso do sistema Windows, caso prefira colar utilizando o teclado, utilize a combinação de teclas Shift + Insert.
- Documentação oficial GitHub - Gerenciando repositórios remotos
- Documentação oficial GitHub - Criar e deletar branchs
IMPORTANTE: Antes de enviar qualquer alteração para o GitHub, sempre puxe as alterações mais recentes do repositório remoto para o seu repositório local. Isso evita conflitos e garante que você esteja trabalhando com a versão mais atualizada do código.
git pull origin <branch>Puxa as alterações do repositório remoto (origin) para a branch especificada no seu repositório local. Por exemplo, git pull origin main puxará as alterações da branch main remota.
Se você tentar enviar alterações sem antes puxar, pode encontrar erros como:
-
![rejected] master -> master (fetch first)Este erro indica que suas alterações foram rejeitadas porque o repositório remoto tem alterações que você não possui localmente. A solução é puxar as alterações remotas primeiro (git pull origin <branch>) e então tentar enviar novamente.- Solução no StackOverflow
- Este erro pode ocorrer se você tiver feito alterações diretamente no GitHub (ex: editado um arquivo, criado uma branch) e não as puxou para o seu ambiente local antes de tentar um
git push.
-
fatal: refusing to merge unrelated historiesEste erro geralmente acontece quando você tenta mesclar dois históricos de repositório que não têm um commit inicial comum. Isso pode ocorrer se você inicializou um repositório localmente comgit inite depois tentou associá-lo a um repositório GitHub que já tinha commits. Para resolver, você pode forçar a fusão (com cuidado, pois pode sobrescrever o histórico) ou puxar com a opção--allow-unrelated-histories:git pull origin <branch> --allow-unrelated-histories
git add .Adiciona todos os arquivos modificados ou novos para a área de staging. A área de staging (ou index) é um local intermediário onde você prepara as mudanças que farão parte do próximo commit.
Se você quiser adicionar apenas arquivos específicos, pode usar:
git add nome-do-arquivo.txt
git add pasta/outro-arquivo.jsVocê também pode usar curingas para adicionar arquivos com um determinado padrão:
git add *.html
git add docs/O primeiro comando adicionaria todos os arquivos .html na pasta atual, e o segundo adicionaria todos os arquivos na pasta docs/.
git commit -m "mensagem do commit"Salva as alterações que estão na área de staging no seu repositório local. A mensagem do commit é crucial, pois deve descrever de forma clara e concisa o que foi alterado naquele commit. Boas mensagens de commit facilitam o entendimento do histórico do projeto.
git push origin <branch>Envia as alterações do seu repositório local para o repositório remoto (origin) na branch especificada. Por exemplo, git push origin main enviará suas alterações para a branch main no GitHub.
O controle de branches é uma das funcionalidades mais importantes do Git, permitindo o desenvolvimento paralelo e organizado.
git branchLista todas as branches locais no seu repositório. A branch atual será destacada.
git branch -aLista todas as branches locais e remotas.
git branch <nome da nova branch>Cria uma nova branch localmente, mas não muda para ela.
git checkout <nome da branch existente>Muda para uma branch existente. Você precisa salvar ou fazer commit de suas alterações antes de trocar de branch, ou usar git stash para guardá-las temporariamente.
git checkout -b <nome da nova branch>Este é um atalho muito comum e útil. Ele cria uma nova branch e, imediatamente, muda para ela. É equivalente a executar git branch <nome da nova branch> seguido por git checkout <nome da nova branch>.
git clone <link do repositório no GitHub>Cria uma cópia completa de um repositório Git remoto (localizado no GitHub, por exemplo) para o seu computador local. Ao clonar, ele automaticamente:
- Cria uma pasta com o nome do repositório.
- Baixa todo o histórico do projeto.
- Configura a conexão remota (
origin) para o repositório original. - Cria uma branch local (
mainoumaster) rastreando a branch remota correspondente.
-
Histórico Completo: Você terá acesso a todas as versões do projeto.
-
Colaboração: É o ponto de partida ideal para colaborar em projetos existentes.
-
Cuidado com Acesso: Certifique-se de ter permissões adequadas (se for um repositório privado) para clonar.
-
Evite Clonar e Pushar sem Entender: Se você não pretende contribuir com o projeto original, mas apenas ter uma cópia para estudo ou modificação pessoal, considere fazer um Fork (explicado abaixo) ao invés de um clone direto de um repositório que você não possui permissão de escrita.
Um Fork no GitHub é uma cópia pessoal de um repositório de outra pessoa ou organização. Ele permite que você faça alterações em um projeto sem afetar o repositório original. É uma forma comum de contribuir para projetos de código aberto.
O Fork é feito diretamente na interface do GitHub:
- Navegue até o repositório que você deseja "forkar".
- No canto superior direito da página do repositório, clique no botão "Fork".
- O GitHub criará uma cópia do repositório em sua própria conta.
- Repositório Público: O repositório "forkado" será público por padrão (se o original for público). Você pode alterá-lo para privado se o GitHub permitir para sua conta e o tipo de repositório.
- Sua Cópia: O fork é sua cópia pessoal do projeto. Você tem controle total sobre ele.
- Colaboração com o Projeto Original: Se você fizer alterações no seu fork e quiser que elas sejam incorporadas ao projeto original, você precisará abrir um Pull Request (Requisição de Pull) do seu fork para o repositório original.
Após fazer o fork no GitHub, você precisará cloná-lo para sua máquina local:
git clone <link do seu repositório forked no GitHub>Agora, você pode fazer suas alterações, commitar e enviar para o seu fork no GitHub:
git add .
git commit -m "Minhas alterações"
git push origin mainPara manter seu fork atualizado com o repositório original (upstream), você precisará adicioná-lo como um novo remote e puxar as alterações:
git remote add upstream <link do repositório original>
git pull upstream mainEste erro geralmente ocorre devido a uma sintaxe incorreta ao tentar configurar a branch padrão inicial. A mensagem init.defaultBranch = sugere que o valor da branch padrão não foi especificado corretamente.
- Solução: Certifique-se de que você está definindo a branch padrão com um nome válido, como
mainoumaster, sem espaços em branco ou caracteres inválidos no final da atribuição. Por exemplo:git config --global init.defaultBranch main
- Solução no StackOverflow
- Causa: Suas alterações locais não podem ser enviadas porque o repositório remoto tem alterações que você não possui. Isso significa que alguém enviou algo para a branch remota enquanto você estava trabalhando.
- Solução: Primeiro, puxe as alterações remotas para sua branch local usando
git pull origin <branch>. Resolva quaisquer conflitos de mesclagem que possam surgir e, em seguida, tente fazer ogit pushnovamente.
- Causa: Ocorre quando você tenta mesclar ou puxar de um repositório que tem um histórico de commits completamente diferente do seu repositório local. Isso pode acontecer, por exemplo, se você criou um repositório no GitHub com um README.md e depois inicializou um repositório localmente e tentou conectá-los.
- Solução: Se você tem certeza de que deseja mesclar os históricos, use a flag
--allow-unrelated-historiesao puxar:Cuidado: Use esta opção apenas se você realmente deseja combinar os dois históricos.git pull origin <branch> --allow-unrelated-histories
- Causa: Este erro indica que uma operação de mesclagem (merge) anterior não foi concluída corretamente. Isso pode acontecer se houver conflitos de mesclagem que não foram resolvidos ou se a mesclagem foi interrompida.
- Solução:
- Verifique o status para identificar os arquivos com conflito:
git status. - Resolva os conflitos nos arquivos (remova as marcações
<<<<<<<,=======,>>>>>>>). - Adicione os arquivos resolvidos à área de staging:
git add <arquivos-resolvidos>. - Conclua a mesclagem com um commit:
git commit. Se você não quiser concluir a mesclagem e desfazer tudo, pode usargit merge --abort.
- Verifique o status para identificar os arquivos com conflito:
Se você está tendo problemas para fazer um commit ou push, verifique os seguintes pontos:
-
Arquivos na área de staging: Você adicionou os arquivos à área de staging com
git add .ougit add <arquivo>? -
Mensagem de commit: Você incluiu uma mensagem de commit com a flag
-m? -
Branch correta: Você está na branch correta para o commit/push?
-
Puxar antes de enviar: Você puxou as últimas alterações do repositório remoto antes de tentar enviar (
git pull origin <branch>)? -
Credenciais Git: Suas credenciais Git estão configuradas corretamente (nome de usuário e e-mail)? Você pode verificar com
git config --list.
O GitHub Pages é um serviço de hospedagem de sites estáticos gratuito diretamente do seu repositório GitHub. É uma ótima maneira de hospedar portfólios, blogs, documentações de projetos e até mesmo pequenos sites pessoais ou de negócios.
O GitHub Pages funciona publicando o conteúdo de uma branch específica (geralmente main ou gh-pages) do seu repositório. Quando você ativa o GitHub Pages para um repositório, o GitHub serve seu conteúdo como um site.
- Repositório GitHub: Você precisa ter um repositório no GitHub.
- Conteúdo HTML, CSS, JS: Seu site precisa ser composto por arquivos estáticos (HTML, CSS, JavaScript, imagens, etc.).
- Branch de Publicação: Você designa uma branch específica (ex:
main,gh-pagesou uma pastadocs/dentro damain) para ser a fonte dos arquivos do seu site.
- Repositórios Públicos: Você pode publicar sites do GitHub Pages a partir de repositórios públicos gratuitamente. O URL do site será no formato
username.github.io/repository-nameouorgname.github.io/repository-name. - Repositórios Privados: Para publicar sites do GitHub Pages a partir de repositórios privados, você geralmente precisa de uma conta GitHub Pro, Team ou Enterprise. O acesso ao site pode ser restrito se o repositório for privado.
Significa que seu conteúdo web estático está acessível publicamente (ou de forma restrita, se for um repositório privado com conta Pro/Team) através de uma URL fornecida pelo GitHub. Não há necessidade de configurar um servidor web separado ou pagar por hospedagem para sites simples.
- Vá para o seu repositório no GitHub.
- Clique em "Settings" (Configurações).
- No menu lateral esquerdo, clique em "Pages".
- Em "Source" (Fonte), escolha a branch que contém o seu site (geralmente
main) e a pasta (se for o caso, como/docs). - Clique em "Save" (Salvar).
O GitHub levará alguns minutos para construir e publicar seu site. Uma mensagem indicará o URL da sua página quando estiver pronta.
O arquivo .gitattributes é uma ferramenta do Git que permite configurar atributos específicos para caminhos ou tipos de arquivo dentro do seu repositório. Ele gerencia como o Git lida com certos arquivos, especialmente em cenários mais complexos de desenvolvimento ou colaboração.
Em sua essência, o .gitattributes é um arquivo de texto simples que você coloca na raiz do seu repositório (ou em subdiretórios, se quiser aplicar atributos localmente). Ele define regras para diferentes arquivos com base em seus nomes, extensões ou caminhos, controlando como o Git os trata em operações como diff, merge, checkout, e muitas outras.
Seu principal propósito é garantir consistência no comportamento do Git, melhorar a experiência do desenvolvedor e otimizar a forma como o repositório é gerenciado, especialmente em equipes ou projetos com diversos tipos de arquivo.
O .gitattributes pode ser usado para:
- Normalização de quebras de linha: Garante que todos os colaboradores usem o mesmo tipo de quebra de linha (
LFouCRLF), evitando problemas de compatibilidade entre sistemas operacionais. - Identificação de arquivos binários: Ajuda o Git a reconhecer arquivos binários, o que melhora a visualização de diferenças (
diff) e a manipulação de mesclagens para esses arquivos. - Controle de fusão (merge) de arquivos específicos: Permite definir estratégias de fusão personalizadas para determinados tipos de arquivo.
- Geração automática de arquivos: Pode ser usado para "limpar" ou "smudgar" arquivos durante
checkoutecommit, útil para gerar versões otimizadas ou formatadas. - Exibição de diffs específicos: Permite que o Git use ferramentas de diff externas ou regras personalizadas para tipos de arquivo complexos (como imagens, documentos de texto com formatação, etc.).
Dentro do .gitattributes, você define regras no formato padrão atributo1 atributo2.... O padrão pode ser um nome de arquivo, uma extensão (*.txt), um caminho (src/data/**), etc.
Alguns dos atributos mais comuns e suas configurações:
text: Define como o Git deve lidar com quebras de linha em arquivos de texto.*.txt text: Trata todos os arquivos.txtcomo texto, normalizando as quebras de linha.*.sh text eol=lf: Garante que scripts shell sempre usem quebras de linhaLF(Unix-style).*.bat text eol=crlf: Garante que arquivos batch sempre usem quebras de linhaCRLF(Windows-style).*.png binary: Informa ao Git que arquivos.pngsão binários, desabilitando a tentativa de diffs de texto neles.
merge: Define estratégias de fusão específicas.*.xml merge=union: Usa a estratégia "union" para mesclar arquivos XML, que tenta incluir todas as linhas de ambas as versões.
diff: Permite configurar como o Git gera as diferenças (diffs).*.docx diff=word: Indica que arquivos.docxdevem ser comparados usando uma ferramenta de diff externa específica para documentos Word.
linguist: Usado para informar ao GitHub (especificamente ao Linguist, que detecta linguagens) como tratar certos arquivos para estatísticas de linguagem.*.vue linguist-language=JavaScript: Diz ao Linguist para tratar arquivos Vue como JavaScript para as estatísticas de linguagem do repositório.
export-ignore: Impede que arquivos ou diretórios sejam incluídos em arquivos.zipgerados pelo GitHub (por exemplo, ao baixar o repositório)./build/ export-ignore: Exclui a pastabuildde exports.
filter: Configura filtros de "limpeza" (clean) e "smudge" (smudge) que executam um programa em um arquivo quando ele é adicionado ao index ou quando é feito umcheckout.*.js filter=js-formatter: Pode ser usado para formatar automaticamente arquivos JavaScript ao fazer commit (clean) ou reverter a formatação ao fazer checkout (smudge). Isso é mais avançado e geralmente envolve configurar o filtro no.git/configtambém.
O .gitattributes é especialmente indicado em cenários como:
- Projetos multi-plataforma: Para garantir que desenvolvedores em Windows, macOS e Linux não enfrentem problemas com quebras de linha.
- Projetos com diversos tipos de arquivo: Ao lidar com arquivos binários, documentos, ou formatos específicos que se beneficiam de tratamento especial no Git.
- Padronização de código: Para impor formatação automática ou outras transformações via filtros.
- Melhora da legibilidade do histórico: Ao configurar diffs inteligentes para arquivos não-texto.
- Otimização do tamanho do repositório: Usando filtros para "limpar" arquivos antes de serem armazenados.
- Consistência: Garante que todos na equipe sigam as mesmas regras de Git para o tratamento de arquivos.
- Menos conflitos: Ajuda a prevenir conflitos de mesclagem relacionados a quebras de linha ou formatos de arquivo.
- Histórico mais limpo: Evita commits desnecessários de mudanças insignificantes (como alteração de quebra de linha).
- Melhor experiência de desenvolvimento: Simplifica o trabalho com diferentes tipos de arquivos e automações.
- Centralização: As regras são versionadas junto com o código, facilitando a colaboração e a integração contínua.
- Documentação Oficial do Git -
gitattributes - Para que serve o arquivo .gitattributes?
- Overrides - Using gitattributes
Quando você trabalha com Git, especialmente em projetos que incluem muitos arquivos grandes, como imagens de alta resolução, vídeos, modelos 3D ou grandes conjuntos de dados, o repositório pode inchar rapidamente, tornando as operações Git lentas e o armazenamento ineficiente. É aqui que o Git LFS (Large File Storage) entra em cena.
O Git LFS é uma extensão de código aberto para o Git que foi projetada para lidar com arquivos grandes de forma eficiente. Em vez de armazenar o conteúdo desses arquivos diretamente no repositório Git (o que acontece com arquivos de texto e código), o Git LFS os substitui por ponteiros de texto leves. O conteúdo real dos arquivos é armazenado em um servidor remoto separado (geralmente fornecido pela sua plataforma Git, como GitHub, GitLab ou Bitbucket).
Quando você clona um repositório ou faz checkout de uma branch, o Git LFS baixa automaticamente apenas as versões dos arquivos grandes que você precisa, em vez de todo o histórico de todas as versões. Isso resulta em:
- Clones mais rápidos: O tamanho inicial do repositório é significativamente reduzido.
- Operações Git mais leves:
fetch,pullepushse tornam mais eficientes. - Melhor desempenho geral: O Git não precisa lidar com grandes objetos binários em seu histórico principal.
A chave para o funcionamento do Git LFS está no arquivo .gitattributes. É nesse arquivo que você informa ao Git quais tipos de arquivos devem ser gerenciados pelo LFS.
Primeiro, você precisa instalar o Git LFS e configurá-lo uma vez por sistema:
git lfs installEm seguida, para que o Git LFS comece a rastrear arquivos específicos, você adiciona uma linha ao seu arquivo .gitattributes que associa a extensão ou o caminho do arquivo ao atributo filter=lfs, diff=lfs, merge=lfs e dontdiff:
# Exemplo de configuração no .gitattributes
*.psd filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text
/assets/large_image.png filter=lfs diff=lfs merge=lfs -text
Explicação dos Atributos:
filter=lfs: Este é o atributo principal que instrui o Git a usar o filtro LFS para "limpar" (antes do commit, substituindo o arquivo real pelo ponteiro) e "smudge" (no checkout, baixando o arquivo real do servidor LFS).diff=lfs: Informa ao Git para usar a ferramenta de diff do LFS para esses arquivos. Em vez de tentar mostrar um diff de texto para um binário (o que geralmente é inútil), ele pode indicar apenas que o arquivo foi alterado.merge=lfs: Ajuda o Git a lidar com mesclagens de arquivos LFS.-text: É importante adicionar-textpara arquivos binários, pois isso evita que o Git tente normalizar quebras de linha ou trate o arquivo como texto.
Depois de configurar o .gitattributes, você pode adicionar e commitar esses arquivos normalmente. O Git LFS fará a "mágica" por trás dos panos.
O Git LFS é altamente recomendado para projetos que:
- Contêm muitos arquivos binários grandes que mudam frequentemente.
- Têm uma longa história de versões de arquivos grandes.
- Envolvem equipes grandes onde o desempenho do Git é crítico.
- Estão atingindo os limites de tamanho de repositório impostos por plataformas como o GitHub (que possuem limites de tamanho para arquivos individuais e para o repositório total).
- Otimização de desempenho: Reduz significativamente o tempo de clone, fetch e checkout, melhorando a experiência do desenvolvedor.
- Gerenciamento eficiente de armazenamento: Mantém o repositório Git principal leve, movendo o armazenamento de grandes arquivos para fora.
- Compatibilidade: Funciona de forma transparente com o fluxo de trabalho Git existente.
- Controle de versão para todos os arquivos: Permite que você continue versionando arquivos grandes com o Git, mesmo que eles não sejam ideais para o armazenamento direto no Git.