1. O que são branches e para que servem?
Trabalhar com branches no Git — é um dos aspectos-chave do controle de versão, que permite conduzir em paralelo várias linhas de desenvolvimento em um único repositório. A ramificação torna o Git uma ferramenta poderosa para colaboração, experimentos e gerenciamento de diferentes versões do projeto.
gitGraph
commit id: "Initial setup"
commit id: "Add base features"
branch feature/new-idea
checkout feature/new-idea
commit id: "Implement new logic"
commit id: "Refactor the logic"
checkout main
commit id: "Urgent bugfix on main"
merge feature/new-idea
commit id: "Prepare for release"
main sai uma nova branch,
feature/new-idea, para desenvolvimento seguro. Após concluir o trabalho, ela é mesclada de volta à
main.
Imagine que você quer refatorar algo de forma significativa no seu projeto ou realizar um experimento arriscado. O que você faria sem o Git? Muito provavelmente, copiaria todo o projeto para uma nova pasta e trabalharia nela. Se o resultado agradasse — você o moveria para a pasta principal. Se não — simplesmente excluiria a cópia.
As branches no Git funcionam de maneira semelhante, mas de forma muito mais elegante. Vamos considerar um exemplo com a escrita de um livro:
- Você tem um manuscrito pronto (esta é sua branch principal
main). - Você quer escrever um final alternativo (cria uma nova branch, por exemplo
feature/new-idea). - Você escreve o novo final sem tocar no texto principal do manuscrito (trabalha na nova branch).
- Se o novo final ficar melhor, você substitui o antigo por ele (faz a mesclagem das branches —
merge). - O rascunho antigo com o final desnecessário pode ser removido (você apaga a branch).
2. Criando uma nova branch e trabalhando nela
Etapa 1. Abra o menu de gerenciamento de branches.
Na barra superior da IDE há um widget que exibe o nome da branch atual (por padrão — main). Clique nele e escolha + New Branch.
Etapa 2. Nome da nova branch.
Uma boa prática é nomear as branches de acordo com a tarefa que você está resolvendo. Por exemplo, feature/add-usage-examples.
Após criar a branch, a IDE alternará para ela automaticamente. Você verá o novo nome no mesmo widget.
Etapa 3. Faça alterações e faça o commit.
Agora você está no seu “sandbox”. Vamos adicionar ao nosso arquivo README.md uma nova seção com exemplos de uso. Faça as alterações e crie um commit, como você aprendeu na aula anterior.
3. Alternando entre branches
Suas alterações com exemplos de uso agora estão salvas com segurança na branch feature/add-usage-examples. Vamos voltar para a branch principal main e ver como está por lá.
Etapa 1. Clique novamente no widget com o nome da branch atual.
Etapa 2. Na lista Local ou Recent, selecione a branch main e, no submenu que aparecer, clique em Checkout.
Etapa 3. Verifique o resultado.
Assim que você alternar, abra o arquivo README.md. Você verá que a seção com exemplos de uso não está lá! Ela ficou na outra branch. Dessa forma, você pode trabalhar em uma nova funcionalidade sem tocar na versão estável na branch main.
4. Mesclando branches (Merge)
O comando merge pega todos os commits da branch feature/add-examples (neste caso, o commit C3) e os combina com a branch atual main, criando um novo commit de mesclagem.
gitGraph
commit id: "C1"
commit id: "C2"
branch feature/add-examples
checkout feature/add-examples
commit id: "C3: Add new section"
checkout main
merge feature/add-examples
Então, você terminou o trabalho na sua tarefa na branch feature/add-usage-examples e quer adicionar essas mudanças ao projeto principal.
Etapa 1. Alterne para a branch de destino.
Certifique-se de que você está na branch PARA ONDE quer adicionar as alterações. No nosso caso, é a main.
Etapa 2. Execute a mesclagem.
Clique novamente no widget de gerenciamento de branches. Na lista, escolha a branch DE ONDE você quer pegar as alterações (feature/add-usage-examples) e, no submenu, selecione Merge feature/add-usage-examples em main.
Etapa 3. Verifique o resultado.
Agora, no arquivo README.md na branch main, apareceu sua nova seção com exemplos. Você mesclou com sucesso seu trabalho à versão principal do projeto!
5. Conflitos de mesclagem: não tenha medo, isso é normal!
Às vezes, ao mesclar branches, surgem conflitos. Isso acontece quando nas duas branches foram alteradas as mesmas linhas no mesmo arquivo. O Git não consegue decidir por conta própria qual versão está correta e pede a sua ajuda.
gitGraph
commit id: "C1: Base comum"
branch feature/new-title
checkout main
commit id: "C2: Alteração em main"
checkout feature/new-title
commit id: "C3: Alteração em feature"
main e
feature/new-title, têm novos commits (C2 e C3) baseados em um ancestral comum (C1). Isso certamente levará a um conflito na mesclagem.
Vamos simular um conflito:
- Certifique-se de que você está na branch
maine de que não há alterações não salvas. - Crie imediatamente uma nova branch
feature/new-title, mas não alterne para ela ainda. Verifique se a caixa de seleção Checkout branch está desmarcada. - Agora, estando na branch
main, altere a primeira linha emREADME.mdpara "My Awesome Project" e faça umcommit. - Alterne para a branch
feature/new-title. Você verá que a primeira linha emREADME.mdaqui permaneceu a antiga: é o estado do arquivo no momento da criação da branch. Altere essa mesma linha para "My Super Project" e faça umcommit. - Volte para a branch
maine faça a mesclagem comfeature/new-title.
Agora o Git verá que ambas as branches têm novos históricos divergentes a partir de seu ancestral comum. Em ambos os históricos, a mesma linha foi alterada, portanto o Git não poderá escolher qual versão está correta e mostrará uma janela para você resolver o conflito.
Merge Revision
O que você vê aqui:
- À esquerda (Your changes): a versão do arquivo da sua branch atual (
main). - À direita (Changes from branch...): a versão do arquivo da branch que você está mesclando.
- No centro (Result): a versão final do arquivo que você deve montar.
Você pode clicar nas setinhas >> ou << para aceitar por completo uma ou outra opção.
Quando o resultado no painel central estiver de acordo, clique em Apply. A IDE vai criar automaticamente um commit de mesclagem, e o conflito será resolvido.
Por que não houve conflito?
Pode acontecer de você seguir todos os passos e nenhum conflito ocorrer. Na maioria das vezes, isso acontece porque o Git conseguiu fazer um fast-forward merge, já que o histórico de uma branch simplesmente continuou o da outra. Para que o conflito seja garantido, os históricos das branches precisam divergir para lados diferentes a partir do ancestral comum.
Exemplo:
- Você tem um commit em
main(digamos, C1). - Você faz um novo commit em
maincom o texto "My Awesome Project". A branchmainagora aponta para o commit C2 (main -> C1 -> C2). - Você cria a branch
feature/new-titlea partir da posição atual da branch main. Isso significa que a nova branch também começa no commit C2. - Você faz um commit em
feature/new-titlecom o texto "My Super Project". Essa branch “avança” e agora aponta para o commit C3 (feature/new-title -> C1 -> C2 -> C3). - Você volta para
main(que ainda está no commit C2) e manda mesclar feature/new-title.
O Git analisa a situação e vê que a branch main é ancestral direta da branch feature/new-title. No histórico de main não houve nenhum commit novo enquanto você trabalhava na outra branch. O Git “pensa”: “Ah, aqui basta avançar main até o commit C3. Não há contradições”. E ele simplesmente move o ponteiro de main para o commit C3.
gitGraph
commit id: "C1"
commit id: "C2"
branch feature/new-title
checkout feature/new-title
commit id: "C3"
checkout main
merge feature/new-title
6. Visualizando o histórico de alterações
Para entender melhor o que está acontecendo no seu projeto, é útil olhar o histórico.
Abra a aba Git na parte inferior da IDE e selecione Log. Você verá uma representação gráfica de todas as suas branches e commits. Isso ajuda a rastrear claramente de qual branch cada uma se separou e onde foram mescladas.
Aqui você pode clicar em qualquer commit para ver quais alterações ele contém, quem o fez e quando. É uma verdadeira máquina do tempo para o código!
GO TO FULL VERSION