O blog da segurança de dentro para fora Blog   /  

Git Branching e merge: Guia passo a passo

Git Branching e merge: Guia passo a passo

Nos artigos anteriores, você aprendeu a reverter um commit no Git (um tutorial do PowerShell Git) e a fazer merge no Git: tutorial de repositórios Git remotos e locais. Você também pode usar o Git para criar branches no seu projeto. Git branching permite que vários desenvolvedores trabalhem em um projeto modificando a base de código de trabalho.

Neste artigo, você aprenderá mais sobre Git branching, diferentes maneiras de criar branch e como fazer merge de branches em um repositório local ou remoto.

Para acompanhar este tutorial do Git e aprender a criar branches, você precisará de:

O que é Git branching?

definição de git branching

Git branching permite que os desenvolvedores se desviem da versão de produção do código para corrigir um bug ou adicionar um recurso. Os desenvolvedores criam branches para trabalhar com uma cópia do código sem modificar a versão existente. Você cria branches para isolar as alterações de código, que você testa antes de fazer merge com a branch main (continue lendo para saber mais sobre isso).

Não há nada de especial no branch main. É o primeiro branch criado ao inicializar um repositório Git usando o comando git init.

Ao criar um commit, o Git identifica o snapshot dos arquivos com um hash SHA-1 exclusivo. Quando você cria inicialmente um branch, o Git cria um novo ponteiro para o mesmo commit em que o branch main está ativo no momento. O diagrama a seguir mostra que ambos os branches têm o mesmo snapshot de código neste momento.

diagrama de branch 1

Conforme você cria commits no novo branch, o Git cria novos ponteiros para rastrear as alterações. Os últimos commits agora estão à frente dos commits do branch main. À medida que você continua fazendo commits, cada branch mantém o controle de sua própria versão dos arquivos.

diagrama de branch 2

O Git sabe em qual branch você fez checkout usando um ponteiro especial chamado HEAD. Ao criar um novo branch, o Git não muda imediatamente o ponteiro HEAD para o novo branch. Você verá HEAD no tutorial quando criar branches e visualizar o log do commit.

diagrama de branch HEAD

Essa função de branching é o que torna o Git realmente eficaz. Várias pessoas criam branches separados para trabalhar em seu próprio código e fazer merge de suas alterações no branch main. Os branches devem ser temporários e devem ser excluídos ao final do trabalho.

Estratégias de nomeação de branches

Você pode escolher o nome que quiser para os branches. No entanto, a organização ou o projeto pode ter padrões definidos para nomear os branches. Por exemplo, você pode nomear o branch com o nome da pessoa responsável por trabalhar no branch e uma descrição ou um item de trabalho:

  • username/description
  • username/workitem

Você pode nomear um branch para indicar sua função, como um recurso, correção de bug ou hotfix:

  • bugfix/description
  • feature/feature-name
  • hotfix/description

Outra estratégia de branching é ter branches dedicados a diferentes ciclos de desenvolvimento, como recurso ou hotfixes. À medida que os itens de trabalho surgem, você cria um branch para esse item a partir do respectivo branch. Sim, você pode criar um branch a partir de outro. Por exemplo, veja a Opção 4 abaixo.

Como criar um branch no Git

Chega de teoria, vamos criar branches! Estes exemplos usam o PowerShell 7 em um sistema Windows 10. No entanto, você pode usar qualquer terminal que ofereça suporte a comandos Git.

Opção 1: Criação de um branch

Para criar um branch, use o comando git branch seguido pelo nome do branch. Depois de criar o branch, use git branch de novo para ver os branches disponíveis.

Observe que criar um branch dessa maneira não muda automaticamente para o novo branch. O Git usa um asterisco e uma fonte de cor diferente para identificar qual branch está ativo. Esta designação representa o ponteiro HEAD que mostra qual branch está ativa.

git branch <branch name>

git branch

criar branch

Opção 2: Criação de um branch usando checkout

Se você quiser criar um branch e fazer o checkout ao mesmo tempo, use o comando git checkout. O parâmetro -b especifica o nome do branch. Observe que após a conclusão do comando, o Git moveu o HEAD para o novo branch.

git checkout -b <branch name>

git branch

criar checkout de branch

Opção 3: Criação de um branch a partir de um commit

Você pode criar um branch a partir de um commit anterior em um branch existente. Lembrete: um commit é apenas um snapshot temporal dos arquivos em um repositório. É possível criar um branch a partir de um commit se você quiser trabalhar em um snapshot específico dos arquivos.

Antes de criar o branch, você precisa do identificador SHA-1 do commit. Para encontrar o identificador, use o comando git log para visualizar os commits anteriores. Cada commit terá um hash SHA-1 completo como identificador. No entanto, apenas os primeiros caracteres são necessários para identificar o commit.

Em seguida, use o mesmo comando git branch da Opção 1, mas adicione o identificador do commit no final. Este exemplo usa 40b4d7 do segundo commit como identificador.

Observe que o ponteiro HEAD está no branch main, que é o ativo. Os outros branches jeff/feature1 e jeff/feature2 apontam para o mesmo commit de quando foram criados anteriormente. Ambos apontam para o mesmo snapshot, pois cada branch não teve mais commits realizados para cada um após a criação.

git log
git branch <branch name> <identifier>

criar commit de branch

Opção 4: Criação de um branch a partir de outro branch

Se você usa branches dedicados a hotfixes ou recursos, você cria branches a partir desses outros para trabalhar no item. Criar um branch a partir de outro não é diferente de criar a partir do branch main. Você só precisa especificar o nome do outro branch como ponto de partida. Este exemplo mostra a criação do branch feature4 a partir do branch de desenvolvimento.

git checkout -b feature4 develop

Opção 5: Download de um branch do repositório remoto

Assim como você tem uma cópia local de um repositório para trabalhar, outros desenvolvedores também têm. Eles terão branches nos quais estão trabalhando e poderão enviá-los para um repositório remoto.

Ao longo do caminho, talvez seja necessário trabalhar em outro branch que não esteja localmente no seu sistema. Você pode extrair ou baixar branches específicos de um repositório remoto para usar no seu sistema.

Em um repositório central hospedado no GitHub, os branches disponíveis são os mesmos do sistema local (main, feature1, feature2 e hotfix1). No entanto, outra desenvolvedora, chamada Maggie, tem um branch para hotfix2 que não está no sistema local. A Maggie precisa da sua ajuda para trabalhar em um hotfix, então você precisa baixar esse branch para o seu sistema.

branches remotos

Para recuperar o branch do repositório remoto, use git pull na origem e especifique o nome do branch. Se você verificar os branches locais disponíveis, o novo branch não aparecerá automaticamente. No entanto, você pode realizar o checkout e começar a trabalhar nesse novo branch.

git pull origin <branch name>
git branch
git checkout <branch name>
git branch

git pull de branch remoto

Fazer merge dos branches

Depois de concluir o trabalho no seu branch, é hora de fazer merge com o branch main. Fazer merge pega as alterações e as implementa no branch main. Dependendo do seu histórico de commits, o Git faz merge de duas maneiras: fast-forward e three-way. Vamos examinar ambas com base nos branches e no histórico de commits no diagrama a seguir.

diagrama de merge 1

Quando você faz merge do branch hotfix no main, o Git move o ponteiro do branch main para frente para commit nr7jk. O Git faz isso porque o branch hotfix compartilha um commit de ancestral direto com o branch main e está diretamente à frente do seu commit. Esse commit é um merge fast-forward.

fast-forward

Depois de fazer merge do branch hotfix, continue trabalhando na feature1. Conforme você continua fazendo commits no branch feature1, o histórico de commits diverge.

histórico de commit divergente

O Git não consegue mover o ponteiro para o último commit, como em um commit rápido. Para trazer o branch feature1 para o main, o Git faz um merge three-way. O Git tira um snapshot de três commits diferentes para criar um novo:

  • O commit comum que ambos os branches compartilham (a90hb)
  • Os últimos commits do branch (az84f)
  • O commit do branch com merge (nr7jk)

commit de merge three-way

Merge de branches em um repositório local

Para fazer merge de branches localmente, use git checkout para alternar para o branch no qual você quer que o merge aconteça. Esse branch é geralmente o main. Em seguida, use git merge e especifique o nome do outro branch para colocar nesse branch. Este exemplo faz merge do branch jeff/feature1 com o main. Observe que é um merge fast-forward.

git checkout main
git merge jeff/feature1

 

git merge ff

O trabalho continua nos branches main e em outros, então eles não compartilhem mais um histórico de commits. Agora, um desenvolvedor quer fazer merge do branch jeff/feature2 com o main. Desta vez, o Git executa um commit de merge three-way (ou recursivo).

git checkout main
git merge jeff/feature2

merge recursivo no Git

Merge de branches em um repositório remoto

Se você criar um branch no seu repositório local, o repositório remoto ignorará a existência desse branch. Antes de poder fazer push do código do branch para o repositório remoto, você deve definir o repositório remoto como o branch upstream usando o comando git push. Simultaneamente, esse comando define o branch upstream e envia o conteúdo do branch para o repositório remoto.

git push --set-upstream origin <branch name>

git push set upstream

Merge do main em um branch

Enquanto você trabalha no seu branch, outros desenvolvedores podem atualizar o branch main com o seu branch. Isso significa que seu branch não está mais atualizado em relação ao branch main e tem conteúdo em falta. Você pode fazer merge do branch main em seu branch executando checkout do seu branch e usando o mesmo comando git merge.

git checkout <branch name>
git merge main

merge de branch no Git

Perguntas frequentes sobre o Git

O que é criar um branch no Git?

Criar um branch é como tirar um snapshot do código existente para que você possa trabalhar nele independentemente do branch main.

Como criar um novo branch no Git?

Use o comando git branch e especifique o nome do branch, por exemplo, git branch feature1.

Como saber qual branch está ativo?

Use git branch para ver os branches disponíveis e qual está ativo. O Git geralmente designa o branch ativo com um asterisco e uma fonte de cor diferente.

Como alternar para trabalhar em outro branch?

Use git checkout e o nome do branch para torná-lo ativo.

Posso criar um branch dentro de outro branch?

Sim. Especifique o nome do branch para servir de base para o nova branch, por exemplo, git branch feature-bug feature1.

Meu branch só existe localmente. Como adicioná-lo ao meu repositório remoto do Git?

Use o comando git push para definir o branch upstream, por exemplo, git push –set-upstream origin <branch name>.

Como atualizar o branch main com as alterações do meu branch?

Mude para o branch main usando o comando git checkout e, em seguida, faça merge do branch usando o comando git merge junto com o nome do branch.

Como excluir um branch?

Para excluir um branch, use o comando git branch e o parâmetro -d, por exemplo, git branch -d feature1.

Conclusão

Git branching é um recurso poderoso que permite que as equipes trabalhem no código independentemente umas das outras. Saber como criar, nomear e fazer merge de branches é uma habilidade essencial para qualquer profissional de desenvolvimento, administração de sistemas ou engenharia DevOps.

We're Varonis.

We've been keeping the world's most valuable data out of enemy hands since 2005 with our market-leading data security platform.

How it works