Chapters ▾ 2nd Edition

3.3 Ramificação (Branching) no Git - Gerenciamento de Branches

Gerenciamento de Branches

Agora que você criou, mesclou (merged) e excluiu alguns branches, vamos dar uma olhada em algumas ferramentas de gerenciamento de branches que serão úteis quando você começar a usar branches o tempo todo.

O comando git branch faz mais do que apenas criar e excluir branches. Se você executá-lo sem argumentos, obterá uma listagem simples de seus branches atuais:

$ git branch
  iss53
* master
  testing

Observe o caractere * que antecede o branch master: ele indica o branch em que você fez checkout no momento (ou seja, o branch para o qual o HEAD aponta). Isso significa que, se você fizer um commit neste ponto, o branch master será movido para frente com o seu novo trabalho. Para ver o último commit em cada branch, você pode executar git branch -v:

$ git branch -v
  iss53   93b412c Fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 Add scott to the author list in the readme

As opções úteis --merged e --no-merged podem filtrar esta lista para branches que você tem ou ainda não mesclou no branch em que você está atualmente. Para ver quais branches já estão mesclados (merged) no branch em que você está, você pode executar git branch --merged:

$ git branch --merged
  iss53
* master

Como você já mesclou o iss53 anteriormente, você o vê na sua lista. Branches nesta lista sem o * na frente geralmente podem ser excluídos sem problemas com o git branch -d; você já incorporou o trabalho deles a outro branch, então não perderá nada.

Para ver todos os branches que contêm trabalho que você ainda não mesclou, você pode executar git branch --no-merged:

$ git branch --no-merged
  testing

Isso mostra o seu outro branch. Como ele contém trabalho que ainda não foi mesclado, tentar excluí-lo com git branch -d falhará:

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

Se você realmente deseja excluir o branch e perder esse trabalho, você pode forçar a exclusão com -D, como a mensagem de ajuda (helpful message) aponta.

Tip

As opções descritas acima, --merged e --no-merged, se não receberem um nome de commit ou de branch como argumento, mostrarão a você o que está, respectivamente, mesclado (merged) ou não mesclado (not merged) no seu branch atual.

Você sempre pode fornecer um argumento adicional para perguntar sobre o estado de mesclagem (merge state) em relação a algum outro branch sem fazer checkout desse outro branch primeiro, como em: o que não está mesclado no branch master?

$ git checkout testing
$ git branch --no-merged master
  topicA
  featureB

Alterando o nome de um branch

Caution

Não renomeie branches que ainda estão em uso por outros colaboradores. Não renomeie um branch como master/main/mainline sem ter lido a seção Alterando o nome do branch master.

Suponha que você tenha um branch chamado bad-branch-name e queira alterá-lo para corrected-branch-name, mantendo todo o histórico. Você também deseja alterar o nome do branch no remoto (GitHub, GitLab, outro servidor). Como você faz isso?

Renomeie o branch localmente com o comando git branch --move:

$ git branch --move bad-branch-name corrected-branch-name

Isso substitui o seu bad-branch-name por corrected-branch-name, mas essa alteração é apenas local por enquanto. Para permitir que outras pessoas vejam o branch corrigido no remoto, faça o push dele:

$ git push --set-upstream origin corrected-branch-name

Agora daremos uma breve olhada onde estamos agora:

$ git branch --all
* corrected-branch-name
  main
  remotes/origin/bad-branch-name
  remotes/origin/corrected-branch-name
  remotes/origin/main

Observe que você está no branch corrected-branch-name e ele está disponível no remoto. No entanto, o branch com o nome ruim também ainda está presente lá, mas você pode excluí-lo executando o seguinte comando:

$ git push origin --delete bad-branch-name

Agora, o nome do branch ruim foi totalmente substituído pelo nome do branch corrigido.

Alterando o nome do branch master

Warning

Alterar o nome de um branch como master/main/mainline/default quebrará as integrações, os serviços, os utilitários auxiliares e os scripts de compilação/lançamento (build/release) que o seu repositório usa. Antes de fazer isso, certifique-se de consultar os seus colaboradores. Além disso, certifique-se de fazer uma pesquisa minuciosa no seu repositório e atualizar quaisquer referências ao nome antigo do branch no seu código e scripts.

Renomeie o seu branch master local para main com o seguinte comando:

$ git branch --move master main

Não há mais branch master local, pois ele foi renomeado para branch main.

Para permitir que outras pessoas vejam o novo branch main, você precisa fazer o push dele para o remoto. Isso torna o branch renomeado disponível no remoto.

$ git push --set-upstream origin main

Agora acabamos com o seguinte estado:

$ git branch --all
* main
  remotes/origin/HEAD -> origin/master
  remotes/origin/main
  remotes/origin/master

O seu branch master local se foi, pois foi substituído pelo branch main. O branch main está presente no remoto. No entanto, o branch master antigo ainda está presente no remoto. Outros colaboradores continuarão a usar o branch master como base de seu trabalho, até que você faça algumas alterações adicionais.

Agora você tem mais algumas tarefas pela frente para concluir a transição:

  • Quaisquer projetos que dependam deste precisarão atualizar o seu código e/ou configuração.

  • Atualizar quaisquer arquivos de configuração do test-runner.

  • Ajustar scripts de compilação (build) e lançamento (release).

  • Redirecionar as configurações no host do seu repositório para coisas como o branch padrão do repositório, regras de mesclagem e outras coisas que correspondam a nomes de branch.

  • Atualizar as referências ao branch antigo na documentação.

  • Fechar ou mesclar quaisquer pull requests direcionados ao branch antigo.

Depois de concluir todas essas tarefas e ter certeza de que o branch main funciona exatamente como o branch master, você pode excluir o branch master:

$ git push origin --delete master