Git e GitHub: Trabalhando com branches
- #GitHub
- #Git
É comum que softwares e aplicações sejam desenvolvidos por um conjunto de pessoas, por meio de repartição de competências e tarefas; sendo raros casos em que um único individuo produza todo o conteúdo do início ao fim.
Nesse contexto, surge a necessidade de uma estratégia que permita que todos os
envolvidos trabalhem no projeto de forma simultânea e com a garantia de compatibilidade de alterações, mantendo o código principal protegido, coeso e funcional.
Além do mais, softwares são continuamente atualizados e incrementados, e é importante que se mantenha um histórico dessa evolução.
O Git é a ferramenta mais poderosa para essa tarefa. Ele consiste em um Sitema de
Controle de Versão Distribuído (DVCS), o que significa que o arquivo principal é protegido e que cada utilizador utiliza um cópia deste na sua própria máquina. É uma ferramenta gratuíta e Open Source, que funciona com Ramificações (branching) e fusões (merging).
Como o Git Funciona
O sistema de controle de versão garante o rastreamento de cada modificação realizada no código.
É possível identificar quais alterações foram feitas, quais partes do projeto foram
modificadas, e quando e por quem essas modificações foram realizadas.
Dessa forma, consegue-se manter um rigoroso controle da evolução do código,
preservando um histórico organizado de modificações e garantindo, assim, que seja
possível consultar ou recuperar qualquer versão do projeto.
Fluxo Básico do Git
git clone: Salva uma cópia do repositório remoto numa pasta local.
git commit: Grava todas as informações sobre as modificações realizadas no seu
repositório local.
git pull: Atualiza o repositório local a partir do repositório remoto.
Ao trazer o conteúdo do repositório remoto, é feita a mesclagem das informações deste conteúdo com o arquivo da sua máquina.
git push: Envia as alterações salvas no repositório local para o repositório remoto.
Diferenças entre Git e GitHub
Enquanto o Git é a ferramenta que faz todo o controle de versionamento, o GitHub é uma plataforma de hospedaria de código para o versionamento com Git. Basicamente, o GitHub é o servidor remoto que hospeda os repositórios principais (espaço delimitado para que o Git possa exercer o controle de versionamento) , e o Git é a ferramenta que o GitHub utiliza para gerir o versionamento do código.
Além de hospedar os repositórios, o GitHub também proporciona um ambiente
colaborativo, já que é possível ter acesso aos conteúdos de outros desenvolvedores, e, inclusive, contribuir nesses projetos.
Trabalhando com branches
A branch main é o projeto principal e, como tal, deve ser protegida para que só cheguem até ela alterações ou adições já em estado de utilização, ou seja, que já foram concluídas, testadas, aprovadas, e que estão em perfeito funcionamento.
Para a fase de desenvolvimento de novas funcionalidades, são utilizadas novas
branches, que podem ser consideradas ramificações do projeto principal (branch main).
Ao criar uma nova branch, tem-se uma cópia exata da branch principal. A partir daí, as alterações feitas na nova branch não atingirão a branch principal (ou vice-versa).
Dessa maneira, é possibilitado pela branch auxiliar, um ambiente seguro de desenvolvimento, onde o desenvolvedor poderá realizar todas as alterações ou
implementações necessárias ao projeto sem que seu trabalho coloque em risco as
funcionalidades já existentes no código principal. Ao finalizar a tarefa, com todos os
ajustes, correções e testes necessários, o código da branch auxíliar pode ser incorporado à branch main passando a constituir o projeto principal.
Embora seja uma ferramenta poderosa, a utilização de branches deve ser feita com muita atenção. Isto porque, como a branch auxíliar deixa de acompanhar as modificações feitas na branch principal, pode acontecer de, enquanto se trabalha na branch auxiliar, uma modificação seja feita no mesmo ponto do código na branch principal. Isso ocasionaria um conflito no momento de incorporar a sua branch auxiliar ao código principal. Por essa razão, o desenvolvedor deve sempre acompanhar a evolução da branch principal enquanto trabalha na auxiliar, podendo, dessa forma, ajustar o seu código quando necessáio e evitar essas colisões.
Fluxo básico de uma branch
Primeiro é necessário ter localmente o repositório, e para isso, basta realizar o clone do repositório remoto (clone).
Depois, cria-se a branch auxiliar e obtém-se uma cópia exata da branch principal,
apontando para a ultima modificação (commit) realizada.
Daí em diante, grava-se todas as modificações que estão sendo realizadas na branch
auxiliar, sem que a branch principal seja atiginda.
Ao finalizar a tarefa para qual a branch auxiliar foi criada, é o momento de transferir as implementações para a branch principal (merge).
Nesse ponto, é importante conferir se a branch principal na origem (repositório remoto) ainda é exatamente igual à que você utilizou como base para a sua branch auxiliar ou se já foi feita alguma modificação. Para isso, atualiza-se o repositório local (pull).
Se a branch original na origem permanece igual, basta enviar as suas alterações na
branch auxiliar local para a branch auxiliar na origem (push), e em seguida realizar a
fusão (merge).
Caso contrário, é necessário transferir as modificações realizadas para a versão mais
atual da branch main (rebase). Neste ponto, podem ocorrer alguns conflitos entre a sua branch auxiliar e a branch main atualizada, e antes de fazer a fusão, é necessário
resolver esses conflitos, decidindo quais das informações permanecem no código, quais serão descartas, ou até realizando novas alterações.
Após a resolução dos conflitos, segue-se os mesmos passos, transferindo-se a banch
auxiliar local para a origem, e em seguidar realizando a fusão com a branch main.
Principais comandos para uma branch
git clone: Salva uma cópia do repósito remoto numa pasta local.
git checkout -b nome-da-branch-auxiliar: Cria uma nova branch.
git commit: Salva alterações na branch desejada
git pull: Atualiza o repositório local com o conteúdo do repositório remoto.
git push: Envia as alterações salvas na branch local para a branch na origem (remota).
Comandos úteis
Atualizar repositório local
- git pull : Puxa as alterações do repositório remoto e mescla com o repositório local.
- git fetch : Baixa o conteúdo do repositório remoto, sem atualizar o local
- git merge : Integra o conteúdo da branch remota à local.
Atualizar repositório remoto
- git push : Envia os commits do repositório local para o repositório remoto. O repositório local, exceto alterações commitadas, deve estar atualizado com o brach remoto.
Alterar mensagem do último commit:
- git commit --amend -m ”Nova mensagem do commit”
Descartar alterações:
- git restore
- nome-de-um-arquivo.xxx : Restaura a condição que o arquivo se encontrava no último commit, ou seja, descarta todas as alterações do arquivo feitas após o último commit.
- . :Aplica a ação para todos os arquivos modificados desde o último commit.
Desfazer commit:
- git reset
- --soft hashdocommit : Os arquivos modificados após o commit indicado retornam para a Staging Area: Pronto para ser commitado (git add).
- --mixed hashdocommit : Comportamento padrão do reset. Os arquivos modificados após o commit indicado retornam para a Untracked Area (se for um arquivo novo) ou Working Area (se for um arquivo modificado - situação anterior ao git add).
- --soft hashdocommit : Os arquivos modificados após o commit indicado retornam para a Staging Area: Pronto para ser commitado (git add).
- nome-de-um-arquivo.xxx : Aplica a operação --mixed apenas no arquivo indicado. Caso não seja indicado o hash do commit, o reset alcançará o último realizado.
Trabalhando com branches:
- git checkout -b nome-da-branch-auxiliar : Cria uma nova branch
- git checkout nome-da-branch : Acessa a branch indicada
- git diff nome-branch1 nome-branch2 : Mostra a diferença entre as duas branches
- git clone url --branch nome-da-branch --single-branch : Clona apenas a branch desejada
- git stash: arquiva modificações da working area, caso seja criada uma nova branch, ela não receberá a modificação arquivada git stash
- git stash
- pop : recupera informações arquivadas para a branch
- apply : recupera informações arquivadas para a branch, mas mantém também na lista de arquivadas.
Links úteis
Documentação do Git:
Git Download:
Tutorial para instalar e configurar Git e Github:
DIO - Material do Curso Versionamento de Código com Git e GitHub: