[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!