Como utilizar branches dentro do Git com o comando git branch
- #Git
Introdução
Traduzido do inglês, "branch" significa ramo, ou seja, é um conceito dentro dos sistemas de controle de versão que permite aos desenvolvedores implementar tarefas sem interferir diretamente na aplicação que já está em produção (disponível para os usuários finais). Para entender melhor esse conceito, imagine que você está desenvolvendo uma aplicação web para um e-commerce que já está em produção e que você foi encarregado de desenvolver a funcionalidade de adicionar um produto a um carrinho. A primeira coisa que você deve fazer é encontrar uma maneira de isolar a implementação dessa funcionalidade de modo que ela não interfira no produto final que já está em produção, para que ela possa ser integrada apenas quando estiver testada e concluída. Neste contexto, surge a oportunidade de empregar o conceito de branch. Ao longo deste artigo, iremos investigar como o Git gerencia esse conceito.
O que é uma branch?
Antes de compreendermos efetivamente o que é um branch, vamos relembrar como o Git armazena os commits que criamos. Quando adicionamos arquivos para serem rastreados pelo Git com o comando git add, cada arquivo é armazenado em uma estrutura denominada blobs, que, de forma resumida, é uma captura instantânea do arquivo em um determinado momento [1]. Cada blob é identificado por um código hash SHA-1. Ao realizarmos um commit em todos os arquivos que estão na área de preparação (prontos para serem commitados), o Git faz uma varredura por todos os diretórios do projeto e, para cada um deles, cria uma estrutura denominada tree, que contém informações sobre os blobs que pertencem ao diretório específico [1]. A cada tree também é associado um código SHA-1. O commit nada mais é do que uma estrutura que possui um código SHA-1, informações do usuário que fez o commit, uma referência para o commit anterior e referências para diferentes objetos tree. A Figura 1 apresenta um exemplo de como um commit é armazenado.
Figura 1 - Um commit e seu tree [1].
Agora que entendemos como os commits são estruturados, vamos compreender o que realmente é uma branch. Uma branch nada mais é do que um ponteiro (seta) que aponta para um commit específico. Quando criamos um projeto com o comando git init, automaticamente o Git cria uma branch denominada master/main, que na maioria dos projetos é utilizada como o ramo principal. Ou seja, é nela que está armazenado todo o código responsável pelo funcionamento da aplicação em produção. O Git possui um ponteiro especial denominado HEAD; esse ponteiro aponta para a branch que está sendo utilizada em um determinado momento. A Figura 2 apresenta um esquema referente ao histórico de commits de uma branch.
Figura 2 - Histórico de uma branch [1].
Como criar uma branch?
A sintaxe do comando para criar uma branch é o seguinte git branch <branchname>, no qual <branchname> representa o nome da branch a ser criada.
Para exemplificar vamos criar uma branch denominada feat/adicionar-produto-carrinho:
git branch feat/adicionar-produto-carrinho
Em resumo, esse comando vai criar um nova branch denominada "adicionar-produto-carrinho", que passará a apontar para o commit atual. Em outras palavras, será o commit referenciado pela branch que, por sua vez, é apontada pelo HEAD. Vamos considerar, como exemplo prático, que a branch corrente é a "main" e que ela é a única presente em nosso repositório local no momento.
Para verificar quais branches estão disponíveis em seu repositório local, utilize o seguinte comando:
git branch
O resultado será o seguinte:
feat/adicionar-produto-carrinho
* main
Se você quiser descobrir para qual commit sua nova branch aponta, use o comando:
git log --oneline --decorate
O resultado será algo parecido com isso (pode variar de projeto para projeto):
0a48ef7 (HEAD -> main, feat/adicionar-produto-carrinho)
Observe no código acima que a branch corrente é a main, tendo em vista que o HEAD aponta para ela. Perceba também que as branches main e feat/adicionar-produto-carrinho apontam para o commit que possui o SHA-1 igual a 0a48ef7.
Como mudar de uma branch para outra?
Mudar de uma branch para outra significa deslocar o ponteiro HEAD para a branch de destino, como vimos na seção anterior, mesmo criando uma nova branch com o comando git branch o HEAD ainda aponta para a main. Para move-lo podemos utilizar o seguinte comando:
git switch feat/adicionar-produto-carrinho
O comando anterior permitirá que o Git desloque o ponteiro HEAD da branch main para a branch feat/adicionar-produto-carrinho. O seguinte aviso será exibido após executar o comando:
Switched to branch 'feat/adicionar-produto-carrinho'
Agora podemos trabalhar sobre essa branch sem interferir no funcionamento da branch principal. Para exemplo prático vamos criar um commit na branch feat/adicionar-produto-carrinho e depois mudar para a branch main novamente.
# crie seu arquivo
echo "criando a funcionalidade de adicionar produto ao carrinho" >> adicioanr-produto-carri
nho.txt
git add .
git commit -m "adicionar feature de adiconar produto ao carrinho"
git switch main
Nesse momento a branch que criamos está a frente da branch main, se você executar o comando git log --oneline --decorate apenas o histórico da branch main será exibido, isso por que o Git leva em consideração apenas o histórico anterior a branch corrente.
Perceba que o arquivo que você criou na branch feat/adicionar-produto-carrinho não existe na branch main, isso acontece pois o Git desfaz todas as alterações feitas quando realizamos a troca de branch. Vamos fazer um novo commit na main:
# crie seu arquivo
echo "novo commit na main" >> novo-commit.txt
git add .
git commit -m "main - novo commit"
Use o seguinte comando para ver o histórico de commits de todas as branches e para qual commit cada uma aponta:
git log --oneline --decorate --graph --all
O resultado será algo parecido com isso:
* 0047fa8 (HEAD -> main) main - novo commit
| * 546f632 (feat/adicionar-produto-carrinho) adicionar feature de adiconar produto ao carrinho
|/
* 0a48ef7 first commit
Agora as branches apontam para commits diferentes, se quisermos uni-las precisamos utilizar o conceito de Merge, que pode ser abordado em um artigo futuro.
Se você deseja criar e já trocar para uma branch pode utilizar o comando:
git switch -c new-branch
Como renomear uma branch?
O comando utilizado para renomear um branch é o seguinte:
git branch (-m | -M) [<nome_antigo>] <novo_nome>
A opção -m informa ao Git que o usuário deseja modificar o nome do branch de <nome_antigo> para <novo_nome>, enquanto a opção -M força a renomeação do branch mesmo se existirem modificações não mescladas.
Como deletar uma branch local?
O comando utilizado para excluir um branch é o seguinte:
git branch (-d | -D) [-r] <nome_branch>
A opção -d indica ao Git que o usuário deseja deletar o branch com o nome <nome_branch>, enquanto a opção -D força a exclusão do branch, mesmo que haja modificações não mescladas.
Conclusão
O conceito de branch desempenha um papel crucial no desenvolvimento de software, pois possibilita a criação de funcionalidades sem interferir no funcionamento da aplicação em execução. O Git, como sistema de controle de versão, oferece a capacidade de criar branches, que são, essencialmente, ponteiros direcionados para commits específicos dentro do projeto.
Referências
[1] Git Branching - Branches in a Nutshell, disponível em: https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell
[2] Git Branches de forma fácil e com exemplo - Curso de Git e GitHub, disponível em: https://www.youtube.com/live/xAOBQtSVI_k?feature=shared
[3] Git Documentation, disponível em: https://git-scm.com/docs/git-branch