Pular para o conteúdo
Categoria: Glossário do Programador13 min de leitura

O que é Git? Controle de versão para iniciantes

Por Schematize Blog ·

Aprenda o que é Git, como commits, branches e merges funcionam, como desfazer erros com segurança e por que esse sistema de controle de versão é a ferramenta que todo desenvolvedor usa.

Se você já salvou arquivos como projeto_final.zip, projeto_final_v2.zip e projeto_final_AGORA_VAI.zip, sabe como o controle de versão manual vira um caos. O Git existe justamente para resolver isso de forma elegante. Neste artigo você vai entender o que ele é, como pensa, quais comandos formam o seu dia a dia e como sair de enrascadas comuns sem pânico.

O que é controle de versão

Controle de versão é a prática de registrar mudanças em arquivos ao longo do tempo, de modo que você possa recuperar qualquer versão anterior quando quiser. Em vez de cópias soltas, você tem um histórico organizado: quem mudou o quê, quando e por quê.

O Git é um sistema de controle de versão distribuído. "Distribuído" significa que cada pessoa tem uma cópia completa do histórico do projeto na própria máquina — não dependemos de um servidor central para trabalhar. Criado por Linus Torvalds em 2005 para o desenvolvimento do Linux, o Git virou o padrão da indústria (Chacon & Straub, 2014).

Distribuído versus centralizado

Antes do Git, ferramentas como Subversion (SVN) eram centralizadas: existia um servidor único que guardava o histórico, e você precisava estar conectado a ele para commitar ou ver versões antigas. No modelo distribuído do Git, cada clone é um repositório completo, com todo o histórico. Você pode commitar, criar branches, navegar pelo histórico e desfazer mudanças totalmente offline, sincronizando com os outros só quando quiser. Isso torna o Git mais rápido e mais resiliente — se o servidor central cair, qualquer cópia local tem o projeto inteiro.

Por que o Git é tão importante

O Git resolve problemas que aparecem em qualquer projeto de software, sozinho ou em equipe:

    Esse histórico confiável é também a base de práticas modernas de automação, como veremos ao falar de integração contínua.

    Instalando e configurando

    Antes de versionar qualquer coisa, configure sua identidade. Esses dados aparecem em cada commit que você fizer:

    git config --global user.name "Seu Nome"
    git config --global user.email "voce@exemplo.com"
    git config --global init.defaultBranch main

    A última linha define que novos repositórios começam com o branch principal chamado main, hoje o nome convencional. Sem identidade configurada, o Git recusa ou marca seus commits de forma genérica — vale fazer isso uma vez por máquina.

    Os três estados do Git

    Para entender o Git, é essencial conhecer as três "áreas" por onde seus arquivos passam:

      O fluxo básico é mover mudanças do diretório de trabalho para a staging area e, de lá, gravá-las no repositório:

      git add arquivo.txt      # leva a mudança para a staging area
      git commit -m "mensagem" # grava no repositório

      A staging area é o que confunde quem vem de outras ferramentas, mas ela é poderosa: permite montar um commit com cuidado, escolhendo exatamente quais mudanças entram. Você pode editar dez arquivos e commitar só três, deixando os outros para um commit separado e mais coeso. Para inspecionar o que está em cada estado, dois comandos são indispensáveis:

      git status          # mostra o que está modificado e o que está em staging
      git diff            # mostra as mudanças ainda não preparadas
      git diff --staged   # mostra o que já está na staging area

      Commit: a unidade fundamental

      O commit é um instantâneo do seu projeto em um dado momento. Cada commit guarda o estado dos arquivos, um identificador único (hash), o autor e uma mensagem descritiva. Esse hash é calculado a partir do conteúdo, o que torna o histórico praticamente à prova de adulteração: mudar um commit antigo mudaria todos os hashes seguintes.

      Boas mensagens de commit fazem diferença enorme no longo prazo. Compare:

      # Ruim
      git commit -m "ajustes"
      
      # Bom
      git commit -m "Corrige cálculo de frete para CEPs do Nordeste"

      A dica de ouro é: o commit deve ser pequeno e coeso, resolvendo uma coisa só. Assim fica fácil entender o histórico e reverter algo específico sem afetar o resto. Uma convenção comum é escrever a primeira linha no imperativo e com menos de ~50 caracteres ("Adiciona validação de CPF"), deixando detalhes para o corpo da mensagem se necessário.

      Branches: trabalhando em paralelo

      Um branch (ramo) é uma linha independente de desenvolvimento. Imagine o histórico como uma árvore: o tronco principal costuma se chamar main, e dele saem galhos para novas funcionalidades ou correções.

      git branch nova-funcionalidade   # cria um branch
      git checkout nova-funcionalidade # muda para ele
      # ou, em um comando só:
      git switch -c nova-funcionalidade

      Branches são baratos e rápidos no Git, o que incentiva um fluxo saudável: você cria um branch para cada tarefa, trabalha isolado e só junta ao principal quando estiver pronto. Isso evita que código incompleto quebre o que já funciona. Tecnicamente, um branch é apenas um ponteiro leve para um commit — por isso criá-lo é instantâneo, ao contrário de copiar pastas inteiras.

      Merge: juntando o trabalho

      Quando uma funcionalidade está pronta, você faz o merge: integra as mudanças do seu branch de volta ao principal.

      git switch main
      git merge nova-funcionalidade

      Na maioria das vezes o Git resolve a junção sozinho. Mas, se duas pessoas alteraram a mesma linha do mesmo arquivo, surge um conflito de merge. O Git pausa e pede que você decida qual versão manter. Apesar de assustar iniciantes, resolver conflitos é parte normal do trabalho em equipe — basta ler as marcações que o Git insere no arquivo e escolher o resultado correto:

      <<<<<<< HEAD
      preco = preco * 0.9   # sua versão (no branch atual)
      =======
      preco = preco * 0.85  # versão que está vindo do merge
      >>>>>>> nova-funcionalidade

      Você edita o trecho para o resultado desejado, remove as marcações <<<, === e >>>, e finaliza com git add no arquivo e git commit. A regra de ouro: leia com calma e entenda por que as duas versões existem antes de escolher.

      Merge ou rebase?

      Há duas formas de integrar branches. O merge cria um commit de junção que preserva o histórico real de como o trabalho aconteceu. O rebase reescreve seus commits como se tivessem sido feitos a partir do estado mais recente do main, produzindo um histórico linear e mais limpo. A diferença prática:

        Para quem está começando, fique com merge até se sentir confortável.

        Trabalhando com repositórios remotos

        Até aqui falamos do Git local. Mas a colaboração acontece através de repositórios remotos, hospedados em plataformas como GitHub, GitLab ou Bitbucket. Os comandos principais são:

          Esse modelo distribuído permite que cada dev trabalhe offline e sincronize quando quiser. É também o coração do fluxo de revisão de código, em que você abre um pull request para que colegas avaliem suas mudanças antes do merge. Para fazer isso bem, vale conferir Code review eficiente: como revisar código sem brigar com o time.

          Vale entender a diferença entre pull e fetch: git pull é, na prática, um git fetch seguido de um git merge. Se você quer só ver o que mudou antes de integrar, use fetch; se quer trazer e mesclar de uma vez, use pull.

          Desfazendo erros sem pânico

          Uma das maiores fontes de medo para iniciantes é "estraguei tudo, e agora?". O Git tem rede de segurança para quase tudo:

          git restore arquivo.txt         # descarta mudanças não commitadas de um arquivo
          git restore --staged arquivo.txt # tira o arquivo da staging area
          git commit --amend               # corrige a mensagem ou conteúdo do último commit
          git revert <hash>                # cria um novo commit que desfaz outro (seguro)
          git reset --hard <hash>          # volta o branch para um commit (cuidado: destrói mudanças)

          A diferença crucial é entre revert e reset. O git revert é seguro para histórico compartilhado: ele não apaga nada, apenas adiciona um commit que reverte o efeito de outro. Já o git reset --hard reescreve o histórico e descarta trabalho — use só localmente e com certeza do que está fazendo. E mesmo quando você "perde" um commit, ele costuma continuar acessível por um tempo via git reflog, que registra para onde o HEAD apontou recentemente. Lembrar do reflog já salvou muito trabalho que parecia perdido.

          Fluxos de trabalho comuns em equipe

          Comandos isolados não dizem como um time deve organizar o trabalho. Para isso existem fluxos (workflows) que convencionam como branches nascem e morrem. Os mais usados:

            Não existe fluxo "certo" universal; existe o fluxo adequado ao tamanho do time e à cadência de entrega. O conselho prático para iniciantes: comece com feature branches curtos e pull requests, e só adote algo mais complexo se a dor justificar.

            Git no ecossistema de desenvolvimento moderno

            O Git não vive isolado: ele é a engrenagem central de quase todo o ferramental moderno. Quando você dá push, é comum que um robô entre em ação para testar e publicar sua aplicação automaticamente — esse é o mundo do O que é CI/CD? Integração e entrega contínua, onde cada commit pode disparar um pipeline.

            Muitas vezes esse pipeline empacota a aplicação em containers, um assunto explicado em O que é Docker? Containers explicados de forma simples, garantindo que o software rode igual em qualquer ambiente. A automação confiável de testes e deploy a partir do controle de versão é exatamente o que práticas de entrega contínua defendem (Humble & Farley, 2010).

            Se o seu projeto expõe ou consome serviços, é provável que ele converse com uma O que é uma API? Definição clara para iniciantes — e o código dessa integração também viverá no Git, versionado como tudo o mais.

            Cuidado com o que entra no repositório

            Um erro comum de iniciantes é commitar coisas que não deveriam ir para o histórico, como senhas, tokens e chaves de acesso. Uma vez no Git, esses segredos ficam gravados no histórico mesmo que você os apague depois — porque o histórico guarda todas as versões, inclusive a que continha o segredo.

            Para evitar dores de cabeça:

              Um .gitignore típico de um projeto Node.js, por exemplo:

              node_modules/
              .env
              .env.local
              dist/
              *.log
              .DS_Store

              Esse cuidado é tão importante que merece um guia próprio: veja Gestão de segredos e chaves de API sem vazar dados.

              Comandos essenciais para começar

              Para fechar, um resumo dos comandos que cobrem 90% do uso diário:

              git init                 # cria um repositório novo
              git status               # mostra o que mudou
              git add .                # prepara todas as mudanças
              git commit -m "mensagem" # grava o snapshot
              git log --oneline        # exibe o histórico de forma compacta
              git branch               # lista os branches
              git switch nome          # troca de branch
              git merge nome           # junta um branch
              git pull / git push      # sincroniza com o remoto

              Com esses comandos você já consegue versionar projetos de verdade e colaborar com outras pessoas. Um hábito útil é rodar git status o tempo todo: ele é a sua bússola, mostrando em que estado você está e sugerindo o próximo comando.

              Perguntas frequentes

              Git e GitHub são a mesma coisa? Não. Git é a ferramenta de controle de versão, que roda na sua máquina. GitHub (assim como GitLab e Bitbucket) é uma plataforma que hospeda repositórios Git na nuvem e adiciona recursos de colaboração, como pull requests e revisão de código. Você pode usar Git sem nunca tocar no GitHub.

              Preciso de internet para usar o Git? Para o trabalho local — commits, branches, histórico, desfazer mudanças — não. Você só precisa de conexão para clone, push, pull e fetch, que falam com o remoto.

              Qual a diferença entre git pull e git fetch? fetch baixa as novidades do remoto sem alterar seus arquivos. pull faz o fetch e já mescla as mudanças no seu branch atual. Use fetch quando quiser inspecionar antes de integrar.

              O que é o HEAD? É um ponteiro que indica onde você está no histórico — normalmente, o último commit do branch atual. Muitos comandos usam o HEAD como referência (por exemplo, HEAD~1 é "o commit anterior ao atual").

              Commitei na branch errada, e agora? Calma: isso tem conserto. Você pode mover o commit para a branch certa com comandos como git switch para o branch correto seguido de git cherry-pick <hash>, e depois remover o commit do lugar errado. Quase nada no Git é irreversível.

              Conclusão

              O Git transforma o caos de cópias manuais em um histórico organizado e seguro. Entendendo os três estados, o ciclo de commits, o poder dos branches, a integração com remotos e as ferramentas para desfazer erros, você domina a ferramenta que sustenta praticamente todo o desenvolvimento de software moderno. Comece criando um repositório simples, faça commits pequenos e descritivos, use git status como bússola, e logo o fluxo se tornará natural. A partir daí, Git se torna a base sobre a qual você constrói colaboração, automação e entrega contínua.

              Referências

                Leituras relacionadas

                Nenhum comentário ainda

                Seja o primeiro a comentar.

                Deixe seu comentário

                Entre com sua conta Canverly para comentar. Você pode usar a mesma conta em qualquer site da rede.

                Entrar com Canverly