[GIT] Worktrees - Aula 19

Worktrees

Worktrees (ou árvores de trabalho) permitem que você tenha várias cópias do seu repositório em diferentes diretórios, compartilhando o mesmo repositório .git. Isso é útil para trabalhar em múltiplas Branchs ao mesmo tempo.

Trabalhando com Worktrees

Vamos iniciar listando nossas Worktrees, que inicialmente será apenas a principal (Main), para isso usamos:

git worktree list

Para criarmos uma nova Worktree, basta:

git worktree add Path_da_pasta Nome_da_branch

Obs: Caso não passe um nome para a Branch, o Git usará o nome da pasta.

Para remover uma Worktree, basta:

git worktree remove Path_da_pasta

Obs: O Git impede que uma Branch esteja ativa em duas Worktrees ao mesmo tempo.

O Git irá gerar um aviso caso tente remover uma Worktree com Commits ainda não Commitados, para forçar a remoção:

git worktree remove --force Path_da_pasta

Podemos também apagar diretamente o diretório da Worktree, depois basta:

git worktree prune

Obs: Ao apagar o diretório da Worktree e utilizar o comando worktree list, a Worktree que teve o diretório apagado estará indicada como prunable.

Benefícios das Worktrees

  • Melhor organização para quem lida com múltiplas Branchs.

  • Economia de espaço comparado a clonar o repositório várias vezes (uma Worktree pesa um pouco mais que uma Branch comum).

  • Possibilidade de alternar entre Branchs sem perder o progresso.

Como as Worktrees Funcionam?

Quando criamos uma Worktree, o Git não duplica todo o repositório. Em vez disso, todas as Worktrees compartilham o mesmo repositório principal armazenado na pasta .git do diretório original.

Cada Worktree tem sua própria cópia dos arquivos e seu próprio índice, o que permite que você trabalhe em diferentes Branchs separadamente.

O Git mantém um registro das Worktrees no diretório .git/worktrees do repositório principal, cada Worktree recebe um subdiretório, contendo informações sobre a Branch associada e a localização do diretório de trabalho.

As alterações afetam a Worktree principal?

Se modificarmos os arquivos em uma Worktree sem fazer commit, isso não afeta nenhuma outra Worktree, cada Worktree tem seu próprio diretório de trabalho e seu próprio índice, então mudanças não salvas não interferem nas outras Worktrees.

Se fizermos commit e push em uma Worktree, qualquer outra Worktree que usar essa mesma Branch verá as mudanças ao fazer git pull.

Esta é uma função bem útil para mudanças de contexto em projetos, onde você pode se beneficiar com várias versões e munido com uma extensão para o seu editor favorito, apoia na evolução de vários tipos de tarefas de um projeto caso as requisições de mudanças sejam constantes.

Muito bom o conteúdo!

Esse é provavelmente o comando mais útil do git que pouca gente usa. O workflow de montar uma tree (principalmente branches) em uma pasta deveria ser o modo padrão de trabalhar com o git!