15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
31.10.2024
1 +1

Trabalhando com Branches no Git: O Guia Completo para Desenvolvedores

O branching do Git é uma das funcionalidades mais poderosas no desenvolvimento de software moderno. Permite-lhe desenvolver novas funcionalidades, corrigir bugs e executar experiências em isolamento completo — sem nunca tocar na sua base de código de produção estável. Quer seja um desenvolvedor individual ou parte de uma equipa distribuída, dominar os ramos do Git é essencial para manter fluxos de trabalho limpos e profissionais.

Este guia abrangente leva-o através de tudo o que precisa de saber sobre branching do Git: desde compreender os conceitos principais até criar, alternar, fazer merge e gerir ramos como um desenvolvedor sénior. Se está a executar os seus projetos num ambiente de VPS Hosting com acesso root completo, estes fluxos de trabalho integram-se perfeitamente no seu pipeline de desenvolvimento diário.

O que é um Ramo do Git?

Um ramo no Git é essencialmente um apontador leve e móvel para um commit específico no histórico do seu projeto. Quando inicializa um repositório, o Git cria um ramo padrão — normalmente chamado main ou master — que representa a sua linha principal de desenvolvimento.

Quando cria um novo ramo, está a criar uma linha de desenvolvimento independente que diverge do estado atual da base de código. As alterações feitas nesse ramo não afetam nenhum outro ramo até que as faça merge explicitamente. Este isolamento é o que torna o branching tão valioso: o seu ramo main mantém-se limpo e implementável enquanto o trabalho em progresso vive com segurança noutro local.

Pense nos ramos como universos paralelos para o seu código. Cada um pode evoluir independentemente, e controla exatamente quando e como voltam a juntar-se.

Por que o Branching do Git é Importante para o Seu Ambiente de Hosting

Se está a implementar aplicações num servidor — quer seja um plano de VPS Hosting ou um ambiente de Servidores Dedicados — o branching do Git torna-se ainda mais crítico. Eis porquê:

  • Estabilidade: O seu ramo de produção (main) permanece implementável em todos os momentos.
  • Colaboração em equipa: Múltiplos desenvolvedores podem trabalhar em funcionalidades separadas simultaneamente sem interferirem nas mudanças uns dos outros.
  • Experimentação segura: Pode testar alterações arriscadas num ramo isolado e simplesmente eliminá-lo se algo correr mal.
  • Integração CI/CD: Estratégias de branching como GitFlow ou desenvolvimento baseado em trunk combinam perfeitamente com pipelines de implementação automatizados em execução no seu servidor.
  • Capacidade de reversão: Se um merge introduzir um bug, pode reverter de forma limpa sem perder outro trabalho.

Alojar os seus repositórios Git num servidor com armazenamento NVMe SSD e acesso root completo significa operações de clone, fetch e push mais rápidas — especialmente importante ao trabalhar com repositórios grandes ou múltiplos contribuidores.

Passo 1: Verificar Ramos Existentes

Antes de criar algo novo, é boa prática rever que ramos já existem no seu repositório. Use o seguinte comando:

git branch

Isto lista todos os ramos locais. O ramo atualmente ativo é destacado com um asterisco (*).

Para também ver ramos remotos, use:

git branch -a

Para ver apenas ramos remotos:

git branch -r

Compreender a sua paisagem de ramos existente previne conflitos de nomenclatura e ajuda-o a manter-se orientado em projetos complexos.

Passo 2: Criar um Novo Ramo

Existem várias formas de criar um novo ramo no Git, dependendo do seu fluxo de trabalho.

Criar um ramo sem alternar para ele:

git branch branch_name

Substitua branch_name por um nome significativo que reflita o propósito do ramo. Por exemplo:

git branch feature/user-authentication

Criar um ramo e alternar para ele imediatamente (método clássico):

git checkout -b branch_name

Exemplo:

git checkout -b feature/user-authentication

Criar e alternar usando o comando moderno switch (Git 2.23+):

git switch -c branch_name

Exemplo:

git switch -c bugfix/login-redirect

O comando git switch foi introduzido para tornar as operações de ramo mais intuitivas e menos ambíguas do que o comando sobrecarregado git checkout. Ambas as abordagens funcionam, mas git switch é a prática moderna recomendada.

Passo 3: Alternar Entre Ramos

Para se mover entre ramos existentes, tem duas opções:

Método clássico:

git checkout branch_name

Método moderno (recomendado):

git switch branch_name

Exemplo — alternar de volta para o ramo principal:

git switch main

Importante: Antes de alternar ramos, certifique-se de que o seu diretório de trabalho está limpo. Ou faça commit das suas alterações ou guarde-as usando git stash, caso contrário o Git pode recusar a alternância ou levar alterações não confirmadas para o novo contexto de ramo.

git stash          # Save uncommitted changes temporarily
git switch main    # Switch branch
git stash pop      # Restore your stashed changes later

Passo 4: Fazer Alterações num Ramo

Uma vez no ramo correto, o seu fluxo de trabalho de desenvolvimento procede normalmente. Eis o ciclo padrão:

1. Editar ou criar ficheiros

Faça as suas alterações usando o seu editor ou IDE preferido.

2. Preparar as suas alterações

git add filename

Ou prepare todos os ficheiros modificados de uma vez:

git add .

3. Fazer commit das suas alterações

git commit -m "Add user authentication module"

Escreva mensagens de commit claras e descritivas. Uma boa mensagem de commit explica o que mudou e porquê — não apenas como. Isto torna-se inestimável ao rever o histórico meses depois ou ao integrar novos membros da equipa.

4. Fazer push do seu ramo para um repositório remoto

Se está a colaborar com uma equipa ou a fazer backup para um servidor remoto:

git push origin branch_name

Exemplo:

git push origin feature/user-authentication

Se é a primeira vez que faz push deste ramo, pode precisar de definir o upstream:

git push --set-upstream origin feature/user-authentication

Passo 5: Fazer Merge de Ramos

Uma vez que a sua funcionalidade ou correção está completa e testada, é hora de fazer merge de volta para o seu ramo de destino — normalmente main ou develop.

Processo de merge passo a passo:

1. Alternar para o ramo de destino:

git switch main

2. Fazer pull das alterações mais recentes do remoto (importante em ambientes de equipa):

git pull origin main

3. Fazer merge do seu ramo de funcionalidade:

git merge feature/user-authentication

Se o merge é limpo (sem conflitos), o Git criará automaticamente um commit de merge ou executará um merge fast-forward dependendo do histórico do ramo.

Fast-forward vs. commit de merge

  • Merge fast-forward: Ocorre quando o ramo de destino não divergiu do ramo de funcionalidade. O Git simplesmente move o apontador para a frente. Nenhum commit de merge é criado.
  • Merge de três vias: Ocorre quando ambos os ramos divergiram. O Git cria um novo commit de merge que liga ambos os históricos.

Para sempre criar um commit de merge (útil para preservar o histórico de ramos nos registos do projeto):

git merge --no-ff feature/user-authentication

Passo 6: Resolver Conflitos de Merge

Conflitos de merge ocorrem quando as mesmas linhas num ficheiro foram modificadas de forma diferente em dois ramos. O Git não consegue determinar automaticamente qual versão manter, portanto pede-lhe para resolver o conflito manualmente.

Identificar conflitos

Quando ocorre um conflito, o Git produzirá algo como:

CONFLICT (content): Merge conflict in src/auth.js
Automatic merge failed; fix conflicts and then commit the result.

Como um conflito se parece num ficheiro

<<<<<<< HEAD
const loginUrl = '/api/v2/login';
=======
const loginUrl = '/api/v1/login';
>>>>>>> feature/user-authentication
  • Tudo entre <<<<<<< HEAD e ======= é a versão do seu ramo atual.
  • Tudo entre ======= e >>>>>>> feature/user-authentication é a versão recebida.

Resolver o conflito

  1. Abra o ficheiro conflituoso no seu editor.
  2. Decida qual versão manter — ou escreva uma nova versão que combine ambas.
  3. Remova todos os marcadores de conflito (<<<<<<<, =======, >>>>>>>).
  4. Guarde o ficheiro.

Completar o merge após resolução

git add src/auth.js
git commit -m "Resolve merge conflict in auth module"

Usar uma ferramenta de merge

Para conflitos complexos, uma ferramenta de merge visual pode ser inestimável:

git mergetool

As ferramentas populares incluem o editor diff integrado do VS Code, vimdiff, meld e kdiff3.

Passo 7: Eliminar Ramos

Uma vez que um ramo foi feito merge e já não é necessário, elimine-o para manter o seu repositório limpo e navegável.

Eliminar um ramo local (seguro — funciona apenas se já foi feito merge):

git branch -d branch_name

Exemplo:

git branch -d feature/user-authentication

Forçar eliminação de um ramo (mesmo que não tenha sido feito merge):

git branch -D branch_name

Use -D com cuidado — elimina permanentemente qualquer trabalho não feito merge nesse ramo.

Eliminar um ramo remoto:

git push origin --delete branch_name

Exemplo:

git push origin --delete feature/user-authentication

Podar regularmente ramos obsoletos mantém o seu repositório organizado e previne confusão em ambientes de equipa.

Passo 8: Ver Histórico e Estrutura de Ramos

Para obter uma visão geral visual do seu histórico completo de ramos e commits, use:

git log --oneline --graph --decorate --all

Isto produz um gráfico compacto em arte ASCII mostrando:

  • Todos os commits em todos os ramos
  • Onde cada apontador de ramo está atualmente
  • Pontos de merge e divergências
  • Tags e posição de HEAD

Exemplo de saída:

* a3f9c12 (HEAD -> main, origin/main) Merge branch 'feature/user-authentication'
|
| * 7b2e441 Add password hashing utility
| * 3d1a908 Create login endpoint
|/
* 9c4f017 Initial project setup

Para uma vista mais detalhada de um ramo específico:

git log branch_name --oneline

Para comparar dois ramos e ver que commits existem num mas não no outro:

git log main..feature/user-authentication --oneline

Passo 9: Técnicas Avançadas de Branching

Fazer rebase em vez de merge

O rebase é uma alternativa ao merge que reescreve o histórico de commits para produzir uma linha de tempo mais limpa e linear:

git rebase main

Isto reproduz os seus commits de ramo de funcionalidade no topo do main mais recente, eliminando o commit de merge. O resultado é um histórico mais limpo — mas nunca faça rebase de ramos que foram feitos push para um remoto partilhado, pois reescreve o histórico e causa problemas para colaboradores.

Cherry-picking de commits específicos

Se apenas precisa de um commit específico de outro ramo em vez de fazer merge do ramo inteiro:

git cherry-pick commit_hash

Isto é útil para aplicar uma correção crítica de bug de um ramo de desenvolvimento diretamente para produção sem fazer merge de funcionalidades inacabadas.

Rastreamento de ramos remotos

Para configurar um ramo local que rastreie um ramo remoto:

git checkout --track origin/branch_name

Ou com a sintaxe moderna:

git switch --track origin/branch_name

Estratégias de Branching do Git para Ambientes de Produção

Se está a gerir uma aplicação em direto num Servidores Dedicados ou ambiente VPS, adotar uma estratégia de branching formal melhora dramaticamente a fiabilidade da implementação.

GitFlow

Um fluxo de trabalho estruturado com ramos dedicados para funcionalidades, lançamentos e correções de emergência:

  • main — código pronto para produção apenas
  • develop — ramo de integração para funcionalidades concluídas
  • feature/* — ramos de funcionalidades individuais
  • release/* — ramos de preparação de lançamento
  • hotfix/* — correções de emergência de produção

Desenvolvimento Baseado em Trunk

Uma abordagem mais simples e de alta velocidade onde todos os desenvolvedores fazem commit para main (o “trunk”) frequentemente, usando ramos de funcionalidade de curta duração ou sinalizadores de funcionalidade para gerir trabalho incompleto. Favorecido por equipas com pipelines CI/CD robustos.

GitHub Flow

Uma variante leve: ramificar de main, abrir um pull request, rever, fazer merge. Simples e eficaz para equipas menores ou projetos com implementação contínua.

Melhores Práticas para Gestão de Ramos do Git

Seguindo estas convenções manterá os seus repositórios limpos, a sua equipa alinhada e as suas implementações previsíveis:

1. Use nomes de ramo descritivos e estruturados

Adote uma convenção de nomenclatura consistente que comunique o propósito à primeira vista:

TipoExemplo
Funcionalidadefeature/user-authentication
Correção de bugbugfix/login-redirect-loop
Correção de emergênciahotfix/payment-gateway-crash
Lançamentorelease/v2.4.0
Experiênciaexperiment/graphql-migration

2. Mantenha ramos de curta duração

Quanto mais tempo um ramo vive sem fazer merge, maior a divergência de main e maior o risco de conflitos de merge dolorosos. Procure fazer merge de ramos de funcionalidade dentro de dias, não semanas.

3. Faça commit cedo e frequentemente

Commits pequenos e frequentes são mais fáceis de rever, reverter e compreender. Evite commits massivos “catch-all” que agrupem dezenas de alterações não relacionadas.

4. Sempre faça pull antes de fazer merge

Antes de fazer merge de um ramo de funcionalidade, faça pull das alterações mais recentes de main para minimizar conflitos:

git pull origin main

5. Escreva mensagens de commit significativas

Siga o formato de commits convencionais para consistência:

feat: add OAuth2 login support
fix: resolve null pointer in user profile loader
docs: update API authentication guide
refactor: simplify database connection pooling

6. Proteja o seu ramo principal

Em plataformas Git alojadas (GitHub, GitLab, Gitea), configure regras de proteção de ramo para exigir revisões de pull request antes de fazer merge em main. Isto previne pushes diretos acidentais para produção.

7. Automatize com CI/CD

Integre o seu fluxo de trabalho Git com um pipeline CI/CD que execute automaticamente testes em cada push de ramo. Apenas ramos que passem todos os testes devem ser elegíveis para merge. Isto combina perfeitamente com um ambiente de servidor adequadamente configurado — se está a alojar o seu próprio servidor Git ou executor CI, um plano de VPS Hosting com acesso root dá-lhe controlo completo sobre a configuração do seu pipeline.

Configurar um Repositório Git Privado no Seu Servidor

Se preferir auto-alojar os seus repositórios Git em vez de confiar em plataformas de terceiros, pode configurar um repositório Git bare diretamente no seu servidor.

Inicializar um repositório bare no servidor:

mkdir -p /srv/git/myproject.git
cd /srv/git/myproject.git
git init --bare

Cloná-lo da sua máquina local:

git clone user@yourserver.com:/srv/git/myproject.git

Fazer push de ramos para ele tal como qualquer remoto:

git push origin feature/new-dashboard

Auto-alojar os seus repositórios Git dá-lhe privacidade completa, sem limites de armazenamento impostos por plataformas de terceiros, e controlo total sobre permissões de acesso. Combine isto com Certificados SSL para encriptar o tráfego entre os seus desenvolvedores e o servidor, e considere configurar autenticação de chave SSH para acesso seguro e sem palavra-passe.

Para equipas que precisam de uma interface de alojamento Git completa, ferramentas como Gitea ou GitLab CE podem ser instaladas no seu VPS em menos de uma hora, dando-lhe pull requests, rastreamento de problemas e pipelines CI/CD — tudo auto-alojado em infraestrutura que controla.

Referência Rápida: Comandos Essenciais de Ramo do Git

TarefaComando
Listar ramos locaisgit branch
Listar todos os ramos (incluindo remoto)git branch -a
Criar um novo ramogit branch branch_name
Criar e alternar para novo ramogit switch -c branch_name
Alternar para ramo existentegit switch branch_name
Fazer merge de um ramo para o atualgit merge branch_name
Fazer merge com commit de merge explícitogit merge --no-ff branch_name
Fazer rebase noutro ramogit rebase main
Eliminar ramo local feito mergegit branch -d branch_name
Forçar eliminação de ramo localgit branch -D branch_name
Eliminar ramo remotogit push origin --delete branch_name
15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar