Git e Github: Trabalhando Com Branches

Esta publicação faz parte de uma série que aborda as ferramentas Git e Github de uma forma aprofundada, porém voltada para iniciantes.

Se você está iniciando seus estudos ou possui menos de 1 ano de experiência nessas ferramentas ou em ferramentas similares como Bitbucket, Gitlab, Git no Google Cloud, Git AWS com CodeCommit e outras, esta série será ótima para você. Aproveite!

Para acessar as outras publicações da série, acesse:

Introdução

Este é a terceira publicação da Série: Git e Github para iniciantes e você vai aprender aqui o que são e como trabalhar com Branches Git e boas práticas para facilitar o seu trabalho.

Para se beneficiar por completo desta postagem, você precisa ter o Git instalado em seu computador. Utilize os links abaixo se precisar de ajuda com isso.

Como instalar o Git no computador. E retorne aqui para continuarmos.

Índice desta publicação

O que são Branches?

Branches são ramificações ou novas versões do seu projeto que, com Git contém todo histórico do branch origem e, terá a partir do momento da sua criação, o seu próprio histórico sendo criado em paralelo ao restante do projeto até que, em algum momento seja fundido (merge) ao branch principal.

Demonstração visual do histórico de um repositório qualquer

Você pode pensar em um Branch como uma working directory totalmente nova que permitirá editar arquivos, adicionar em stage e realizar commits de forma independente sem misturar as versões modificadas em outros branches.

Em projetos pequenos pode ser comum utilizar um ou dois branches como main e develop, sendo que as versões finais normalmente se fundem ao main após passar por testes.

Em projetos maiores ou que dependam da contribuição de mais de uma pessoa, é natural utilizar fluxos de trabalho mais complexos como GitFlow e outros, como veremos mais adiante.

Em tais fluxos é comum a utilização de diversos branches paralelos que nem sempre se fundem ao principal main na conclusão da funcionalidade.

Trabalhando com Branches GIT

O comando git branch seguido de parâmetros vai permitir funções como: criar, listar e excluir um branch. Mas você vai perceber que não é possível alternar entre branches ou juntar outros branches em um só com este comando, pois existem outros comandos específicos para isso: git checkout e git merge.

Listando, criando e alternando entre branches

Vamos continuar utilizando o projeto iniciado nas etapas anteriores e nosso primeiro comando será para listar os branches existentes. Execute git branch:

λ git branch
* main

Por enquanto temos apenas um branch chamado main. Este é o branch padrão, ele é criado pelo git quando um projeto é clonado ou inicializado com git init.

Em versões mais antigas o branch padrão se chamava master e muitos projetos ainda possuem este padrão e não há nenhum problema ou incompatibilidade.

Para incrementar esse comando adicione a flag -r para listar apenas os branches remotos e -a para listar os branches locais e remotos.

Vamos criar um novo branch chamado “novo-branch”, utilizando o comando git branch <name> e depois execute git branch para listar todos:

λ git branch novo-branch
λ git branch
* main
  novo-branch

Perceba que o branch corrente está com um “*” (asterisco), mas você pode executar git branch --show-current para se certificar sobre o branch atual.

Para trocar de branch apenas execute git checkout novo-branch e execute git branch novamente.

λ git checkout novo-branch
λ git branch
  main
* novo-branch

Existe um atalho para criar e alternar branches através do comando checkout utilizando a flag -b. Internamente este comando cria um branch e alterna para o branch criado. Opcionalmente, execute:

λ git checkout -b novo-branch

Vamos fazer algumas alterações nos arquivos do repositório para entendermos como é a dinâmica das alterações nos branches.

Nesse momento o meu repositório possui dois arquivos: index.html e sobre.html e quando executo git status recebo a informação de que a minha working directory está limpa, veja:

λ git status
On branch novo-branch
nothing to commit, working tree clean

Execute echo "arquivo modificado" > sobre.html para modificar o arquivo sobre.html e faça um commit com git commit -am "alteração no arquivo sobre.html".

C:\Users\Master\meu-site(novo-branch)
λ echo "arquivo modificado" > sobre.html

C:\Users\Master\meu-site(novo-branch)
λ git commit -am "alteração no arquivo sobre.html"
[novo-branch a3445a5] alteração no arquivo sobre.html
 1 file changed, 1 insertion(+), 1 deletion(-)

Precisamos ver as mudanças neste arquivo em cada branch, então execute cat sobre.html para imprimir o conteúdo do arquivo no terminal:

C:\Users\Master\meu-site(novo-branch)
λ cat sobre.html
"arquivo modificado"

Mude para o branch main executando git checkout main e novamente cat sobre.html.

λ git checkout main
Switched to branch 'main'

C:\Users\Master\meu-site(main -> origin)
λ cat sobre.html
"<h1>Sobre este site</h1>"

Veja que estamos visualizando o mesmo arquivo, porém em versões (branches) diferentes. O comando git checkout <branch> permite alternar entre branches locais.

Fique alerta nos momentos de troca de branches para não alternar com pendências de commit, pois os arquivos modificados e em staged não impedem a alternância de branches e você pode acabar fazendo commits em branches errados se não prestar atenção nisso.

Se quiser refrescar a memória sobre os estados de um arquivo em um repositório GIT. Dá uma olhada na segunda publicação desta série, aqui.

Utilize sempre git status antes de alternar branches.

Boas práticas para nomes de branches

Existe uma flexibilidade bastante grande em relação a nomeação de branches no GIT, porém mesmo que você utilize alguma ferramenta gráfica vez ou outra para commits e pushes, é importante seguir algumas regras básicas para nomear os branches.

Quando um branch é criado, ele existe fisicamente dentro da pasta .git do seu projeto, dentro de refs/heads. Se você criar um branch utilizando caracteres especiais como: $, @, ^, ~, espaços e outros, poderá ter problemas em algum momento, por isso evite estes caracteres.

Você pode utilizar “/” nos nomes dos branches como por exemplo: feature/155/adiciona-botao-pagina. Esse tipo de abordagem ajuda no entendimento da equipe sobre o que está sendo implementado apenas lendo o nome do branch. 

No exemplo anterior o nome do branch mostra que estou criando uma nova funcionalidade, o código dela é 155 (caso utilize ferramentas como JIRA para gerenciar suas tarefas), finalizando com uma descrição breve sobre o que será implementado nesse branch.

C:\Users\Master\meu-site (master)
λ git checkout -b feature/155/adiciona-botao-pagina
Switched to a new branch 'feature/155/adiciona-botao-pagina'

Para projetos menores minha sugestão é que utilize um nome que identifique sua funcionalidade ou bug: feature-nova-pagina-produto. Para correção de bugs: bugfix-muda-comportamento-botao.

Excluindo branches

Eventualmente será necessário excluir branches da sua base, seja porque atualizou seu repositório remoto ou apenas para descartar algo que não será utilizado mais.

É importante ressaltar que ao realizar uma exclusão, você perderá tudo que foi criado com aquele branch, então sempre faça um merge antes de excluir e tenha muito cuidado ao utilizar a flag -D maiúscula.

Para excluir um branch que já foi mesclado (merge) em seu main ou em um branch remoto (quando um upstream for setado), adicione a flag -d da seguinte forma:

λ git branch -d novo-branch
Deleted branch novo-branch (was a3445a5).

Caso o branch não tenha sido mesclado, o GIT vai fornecer a informação abaixo e não vai permitir a exclusão.

Se você quiser forçar a exclusão, adicione a mesma flag com letra maiúscula dessa vez. Abaixo veja o erro gerado pelo GIT, seguido do comando para forçar a exclusão:

C:\Users\Master\meu-site(outro)
λ git branch -d novo-branch
error: The branch 'novo-branch' is not fully merged.
If you are sure you want to delete it, run 'git branch -D novo-branch'.

C:\Users\Master\meu-site(main -> origin)
λ git branch -D novo-branch
Deleted branch novo-branch (was a3445a5).

Você vai receber um erro se tentar excluir um branch corrente. Caso queira excluir o branch “novo-branch”, precisa estar em outro branch, caso contrário receberá o seguinte erro:

C:\Users\Master\meu-site(outro-branch)
λ git branch -d outro-branch
error: Cannot delete branch outro-branch checked out at 'C:/Users/Master/meu-site'
Renomeando branches

Pode acontecer com você também. Ao longo da sua vida você poderá sentir a necessidade de alterar o nome de um branch ou alguém da sua equipe lhe sugere um nome que traduz melhor a funcionalidade ou talvez você apenas queira ajustar a algum padrão.

Para alterar o nome de um branch utilizamos git branch -m <nome antigo> <nome novo>, veja:

C:\Users\Master\meu-site(outro-branch)
λ git branch -m outro-branch funcionalidade1

Nada do seu repositório será perdido, não se preocupe.

Conclusão

Na próxima publicação vamos falar sobre mesclagem e resolução de conflitos e vamos finalizar esta série com chave de ouro.

Para receber as notificações de novas publicações dessa série e de outras, siga o meu perfil no Instagram.

Um comentário

Os comentários estão fechados.