Trabalhe com duas branches ou mais ao mesmo tempo com Git Worktree
Tags: git
Published: 2024-04-19 02:08:42

Há pouco tempo na empresa em que trabalho, estava atuando em uma tarefa em uma branch e surgiu a necessidade de ter que verificar um código de outra branch de um colega de squad. Porém, eu ainda não tinha finalizado meu trabalho e nem tinha feito os commits necessários. Normalmente, nessas situações, eu sempre utilizei o [git stash](https://www.atlassian.com/br/git/tutorials/saving-changes/git-stash) ou até mesmo optei por fazer um commit do tipo `git commit -m "chore: wip"` para não perder minhas alterações.

O problema é que ao retornar para minha branch, tenho que pegar de volta tudo que coloquei no stash ou reverter o commit wip para a área de staging e continuar meu trabalho. Porém, navegando pela internet em busca de outras soluções para esses cenários, acabei encontrando o `git worktree` e passei a utilizá-lo nos cenários em que preciso atuar em branches diferentes.

Caso queira se aprofundar mais sobre o git worktree, recomendo olhar a [documentação](https://git-scm.com/docs/git-worktree).

## Porque eu passei a utilizar o git worktree e recomendo que você faça o mesmo?

Justamente pelo motivo do cenário que mencionei acima ocorrer com frequência, ficar dando stash ou commit wip pra lá e pra cá, pelo menos para mim, é uma experiência ruim. Utilizando o comando git worktree, basicamente podemos criar um novo diretório/espaço de trabalho com o estado do git desejado sem afetar o espaço de trabalho atual, poupando uso de git stash e commits desnecessários.

Pra falar a verdade, o espaço de trabalho atual já está no worktree do git. Se você digitar o comando `git worktree list`, verá que seu espaço de trabalho atual já está listado, assim como meu exemplo abaixo.

```bash
git worktree list
/home/djalmeida/www/golang/go-study  03a1d59 [feat/add-verify-token]
```
No meu exemplo, possuo apenas um espaço de trabalho e estou na branch feat/add-verify-token. Digamos que surgiu um bug em produção e preciso urgentemente corrigir, mas ainda não terminei meu código na branch `feat/add-verify-token`. Uma solução rápida é criar um novo espaço de trabalho.

```bash
git worktree add -b fix/quick-fix ../go-study-2 origin/main
```
Dessa forma, um novo espaço de trabalho será criado chamado `go-study-2` no mesmo nível de diretório do projeto com a nova branch chamada `fix/quick-fix` criada a partir de `origin/master`.

Verificando novamente o espaço de trabalho, agora podemos ver que tenho dois espaços de trabalho.

```bash
 git worktree list                                          
/home/djalmeida/www/golang/go-study    03a1d59 [feat/add-verify-token]
/home/djalmeida/www/golang/go-study-2  07ed0e8 [fix/quick-fix]
```
Agora basta navegar para o novo espaço de trabalho que acabei de criar, fazer as alterações, enviar para o remoto, mesclar e etc.

```bash
cd ../go-study-2
```
Depois de concluir o trabalho, é só remover o espaço de trabalho criado.

```bash
git worktree remove go-study-2
```
Verificando novamente a lista de espaços de trabalho, note que agora voltei a ter apenas meu espaço de trabalho original.

```
git worktree list
/home/djalmeida/www/golang/go-study  03a1d59 [feat/add-verify-token]
```
Agora posso voltar para o espaço original e continuar atuando na branch `feat/add-verify-token`.

```bash
cd ../go-study
```

## Observação sobre o git worktree

Um fato a ter em conta é que você não pode fazer checkout na mesma branch em mais de um espaço de trabalho.

> Por exemplo se você tiver dois espaço de trabalho, no espaço 1 você está na main e tentar fazer checkout na main do espaço 2, receberá um erro parecido com o exemplo abaixo.

```bash
git worktree add ../go-study-2 main                        
Preparing worktree (checking out 'main')
fatal: 'main' is already checked out at '/home/djalmeida/www/golang/go-study'
```

> Da mesma forma, se você tentar mudar para uma branch que já está em checkout em outro espaço de trabalho.

```bash
cd ../go-study-2
git checkout main
fatal: 'main' is already checked out at '/home/djalmeida/www/golang/go-study'
```

## Resumo
Neste post, explorei o cenário em que é necessário alternar entre branches. Enfrentar esse desafio durante uma grande refatoração ou um trabalho complexo pode ser desanimador. O git worktree oferece uma abordagem alternativa, possibilitando realizar checkouts adicionais de branches diferentes em diretórios separados e "conectar" esses espaços de trabalho ao repositório. Considero esse utilitário valioso especialmente ao lidar com múltiplas branches simultaneamente.

E você, já tinha ouvido falar do git worktree antes? Gostaria de saber a sua opinião sobre esse utilitário do git. Compartilhe suas experiências nos comentários abaixo.