Branches no Git


Você está no meio da construção do weather-app e quer tentar adicionar uma funcionalidade de previsão do tempo para cinco dias. Pode levar alguns commits até acertar, e enquanto isso não acontece, você não quer código pela metade convivendo com a versão do app que já funciona para todo mundo que o usa. Uma branch é a forma que o Git tem de resolver isso: uma linha de trabalho separada onde o experimento fica guardado, enquanto a main continua funcionando exatamente como antes de você começar.
O que uma branch realmente é
Veja isso na prática:
$ git branch forecast
$ git switch forecast
Switched to branch 'forecast'Dois comandos: o primeiro cria uma nova branch chamada forecast, o segundo te move para ela. A partir daí, todo commit que você fizer cai na forecast, enquanto a main permanece exatamente onde está.
Uma branch é um rótulo móvel que aponta para um commit. Agora mesmo, main e forecast apontam para o mesmo commit, aquele em que você estava quando executou git branch forecast. No momento em que você faz um novo commit estando na forecast, esse rótulo avança para o novo commit. A main permanece exatamente onde estava até você alternar para ela e fazer um commit por conta própria.
Você pode ver os dois rótulos com git branch:
$ git branch
forecast
* mainO asterisco marca a branch em que você está atualmente. Uma branch é apenas um nome apontando para um commit. Esse é todo o mecanismo. Todo o resto deste capítulo é uma variação sobre mover esses rótulos de um lugar para outro.
git branch forecast cria um novo rótulo apontando para o seu commit atual, e git switch forecast te move para ele. Nada muda nos seus arquivos até você de fato fazer um commit lá. Gosto de imaginar branches como post-its em um commit: baratos de adicionar, baratos de mover, baratos de descolar quando você termina. Criando e alternando entre branches
git branch forecast sozinho cria o rótulo sem te mover para ele. Na maioria das vezes você quer as duas coisas de uma vez, então git switch tem um atalho:
$ git switch -c forecast
Switched to a new branch 'forecast'-c significa "create" (criar). git switch -c cria e te move para uma branch ao mesmo tempo. Esse único comando é o que você vai usar praticamente toda vez que começar um novo trabalho.
Alternar entre branches muda qual snapshot dos seus arquivos aparece. Experimente: a linha echo abaixo é uma forma rápida de criar um novo arquivo, src/forecast.js, com uma única linha dentro, e todo o resto são comandos que você já conhece:
$ git switch forecast
$ echo "// lógica da previsão de cinco dias" > src/forecast.js
$ git add src/forecast.js
$ git commit -m "Start forecast module"
$ ls src
forecast.js index.js
$ git switch main
Switched to branch 'main'
$ ls src
index.jsO arquivo não desapareceu. Ele existe na branch forecast, e o snapshot da branch main nunca o incluiu. Volte para forecast e ele reaparece exatamente como você o deixou.
git switch -c forecast cria uma branch e te move para ela em um único passo, que é o que você vai usar praticamente toda vez. Alternar entre branches troca qual versão dos seus arquivos você vê, então um arquivo adicionado em uma branch fica ausente em outra até você voltar. Nada se perde, ele fica guardado na outra branch. HEAD e HEAD desanexado
O Git acompanha onde você está atualmente por meio de um marcador chamado HEAD. Normalmente, HEAD aponta para a sua branch atual, e essa branch aponta para um commit, então HEAD se move automaticamente sempre que você alterna de branch ou faz um commit. Se você fizer checkout de um commit específico pelo hash, ou de uma tag (um rótulo fixo preso a um único commit, geralmente marcando um lançamento), em vez de um nome de branch, o HEAD se conecta diretamente a esse commit em vez de a um rótulo de branch. Esse estado é chamado de HEAD desanexado.
Você pode navegar livremente por ali, e pode até fazer commits, mas nada aponta para esses novos commits pelo nome. Se você alternar para uma branch sem antes criar uma, eles ficam difíceis de encontrar de novo.
$ git switch a1b2c3d
HEAD is now at a1b2c3d Add password strength meterEssa mensagem, "HEAD is now at", é o Git te dizendo que você saiu do território das branches e conectou o HEAD diretamente a um único commit.
Para onde isso leva
Você já criou branches, alternou entre elas e viu como a main permanece intocada enquanto você experimenta em outro lugar. A próxima pergunta é como o trabalho feito em uma branch volta para a main, que é exatamente o que Merge e conflitos aborda. Se você quiser relembrar como ler o histórico de commits antes de seguir adiante, Histórico percorre git log, git show e git diff.

