<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: brduarte</title>
    <description>The latest articles on DEV Community by brduarte (@brduarte).</description>
    <link>https://dev.to/brduarte</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F166254%2Ff055cc4d-2ca5-4e34-98b2-60607cf59a69.jpg</url>
      <title>DEV Community: brduarte</title>
      <link>https://dev.to/brduarte</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brduarte"/>
    <language>en</language>
    <item>
      <title>Chega de git stash: como trabalhar em múltiplas features em paralelo com git worktree</title>
      <dc:creator>brduarte</dc:creator>
      <pubDate>Tue, 25 Aug 2026 12:08:39 +0000</pubDate>
      <link>https://dev.to/brduarte/chega-de-git-stash-como-trabalhar-em-multiplas-features-em-paralelo-com-git-worktree-171b</link>
      <guid>https://dev.to/brduarte/chega-de-git-stash-como-trabalhar-em-multiplas-features-em-paralelo-com-git-worktree-171b</guid>
      <description>&lt;p&gt;Se você já perdeu tempo com essa sequência:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash
git checkout outra-branch
&lt;span class="c"&gt;# resolve o problema urgente&lt;/span&gt;
git checkout branch-original
git stash pop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...só pra descobrir depois que esqueceu o que tinha no stash, ou que o &lt;code&gt;venv&lt;/code&gt;/&lt;code&gt;node_modules&lt;/code&gt; da outra branch estava desatualizado — este artigo é pra você.&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema
&lt;/h2&gt;

&lt;p&gt;Um repositório Git tradicional tem uma única pasta de trabalho ligada a uma branch por vez. Trocar de branch significa trocar todo o conteúdo dessa pasta. Isso funciona bem quando você faz uma coisa de cada vez, mas quebra assim que você precisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Revisar um PR urgente enquanto está no meio de uma feature grande&lt;/li&gt;
&lt;li&gt;Rodar testes de uma branch enquanto edita outra&lt;/li&gt;
&lt;li&gt;Manter ambientes de dependências diferentes (versões de libs, &lt;code&gt;.env&lt;/code&gt;) para features distintas sem reinstalar tudo a cada troca&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A saída mais comum é o &lt;code&gt;stash&lt;/code&gt;, mas ele é frágil: some da vista, acumula, e é fácil esquecer o que tinha ali dentro.&lt;/p&gt;

&lt;h2&gt;
  
  
  A solução: &lt;code&gt;git worktree&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;git worktree&lt;/code&gt; permite ter &lt;strong&gt;várias pastas de trabalho simultâneas&lt;/strong&gt;, cada uma vinculada a uma branch diferente, todas compartilhando o mesmo histórico de commits (o &lt;code&gt;.git&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Pense em uma biblioteca central (o histórico do repositório) com várias mesas de leitura (as worktrees), cada uma com um livro diferente aberto. Você não precisa fechar um livro pra abrir outro.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é compartilhado, o que é separado
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Compartilhado entre worktrees&lt;/th&gt;
&lt;th&gt;Separado por worktree&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Histórico de commits&lt;/td&gt;
&lt;td&gt;Arquivos da working directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Objetos do Git (blobs, trees)&lt;/td&gt;
&lt;td&gt;Arquivos não versionados (&lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;venv&lt;/code&gt;, &lt;code&gt;node_modules&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuração do repositório&lt;/td&gt;
&lt;td&gt;Saída do &lt;code&gt;git status&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Um commit feito em uma worktree aparece imediatamente no &lt;code&gt;git log&lt;/code&gt; das outras — mas os arquivos físicos de cada pasta continuam independentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Colocando em prática
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Criando uma worktree com branch nova
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree add ../meu-projeto-feature-x &lt;span class="nt"&gt;-b&lt;/span&gt; feature/nome-da-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso cria a pasta &lt;code&gt;../meu-projeto-feature-x&lt;/code&gt;, já com uma branch nova &lt;code&gt;feature/nome-da-feature&lt;/code&gt; criada a partir do commit atual.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando uma worktree para uma branch que já existe
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree add ../meu-projeto-hotfix feature/hotfix-urgente
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Útil quando a branch já veio de um colega ou de um PR aberto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Listando as worktrees ativas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saída parecida com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/home/user/meu-projeto           abc1234 [main]
/home/user/meu-projeto-feature-x def5678 [feature/nome-da-feature]
/home/user/meu-projeto-hotfix    ghi9012 [feature/hotfix-urgente]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Removendo uma worktree depois do merge
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree remove ../meu-projeto-feature-x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se a pasta tiver mudanças não commitadas, o Git avisa e pede &lt;code&gt;--force&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrutura de pastas sugerida
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/projetos/meu-projeto/            # repo principal (main/develop)
~/projetos/meu-projeto-feature-x/  # worktree da feature X
~/projetos/meu-projeto-hotfix/     # worktree do hotfix urgente
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada pasta pode ter seu próprio ambiente virtual, seu próprio servidor rodando em uma porta diferente, sua própria instância do editor aberta — sem um interferir no outro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convenção de nomes ligada ao board
&lt;/h2&gt;

&lt;p&gt;Se seu time usa um board tipo Jira/Linear, vale manter o ID do card no nome da branch (e da worktree):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree add ../meu-projeto-proj-123 &lt;span class="nt"&gt;-b&lt;/span&gt; feature/PROJ-123-descricao-curta
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso facilita rastrear no PR, no CI e em qualquer extração de métricas de fluxo (lead time, deployment frequency) que você faça a partir do histórico de branches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dicas práticas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Evite worktrees de vida muito longa.&lt;/strong&gt; O worktree resolve o problema de contexto simultâneo, não o de branches gigantes. Combine com features pequenas e merges frequentes — se uma feature for demorar semanas, considere feature flags em vez de manter a branch (e a worktree) viva por muito tempo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Cuidado com portas e serviços locais.&lt;/strong&gt; Se cada worktree sobe um servidor de desenvolvimento, defina portas diferentes por ambiente (&lt;code&gt;.env.local&lt;/code&gt; com &lt;code&gt;PORT=8001&lt;/code&gt;, por exemplo) pra evitar conflito.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;code&gt;.gitignore&lt;/code&gt; continua valendo por pasta.&lt;/strong&gt; Arquivos como &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;venv/&lt;/code&gt;, &lt;code&gt;node_modules/&lt;/code&gt; não são compartilhados automaticamente — cada worktree precisa da própria cópia (ou de um &lt;code&gt;pip install&lt;/code&gt; / &lt;code&gt;npm install&lt;/code&gt; local).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Worktrees podem viver fora do diretório do repo.&lt;/strong&gt; Não precisam ficar como subpastas; o exemplo usa &lt;code&gt;../&lt;/code&gt; só por convenção de organização.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que isso importa
&lt;/h2&gt;

&lt;p&gt;A alternativa mais comum ao worktree — múltiplos clones separados do mesmo repositório — resolve o problema de paralelismo, mas duplica o histórico completo em disco e obriga a sincronizar remotes manualmente entre os clones. O worktree resolve o mesmo problema mantendo um único &lt;code&gt;.git&lt;/code&gt; como fonte de verdade, com o custo de espaço em disco apenas dos arquivos de trabalho, não do histórico inteiro.&lt;/p&gt;

&lt;p&gt;Se seu fluxo de trabalho envolve alternar entre features, revisar PRs no meio de outra tarefa, ou manter hotfixes prontos pra aplicar sem abandonar o que está em andamento, o &lt;code&gt;git worktree&lt;/code&gt; provavelmente vai economizar mais tempo do que qualquer alias de &lt;code&gt;stash&lt;/code&gt; que você já criou.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Já usa &lt;code&gt;git worktree&lt;/code&gt; no seu fluxo? Como você organiza as pastas e os ambientes de cada worktree? Comenta aí.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
      <category>tools</category>
    </item>
    <item>
      <title>Por que evitar incluir o arquivo .env no processo de build do projeto</title>
      <dc:creator>brduarte</dc:creator>
      <pubDate>Mon, 27 Mar 2023 03:00:13 +0000</pubDate>
      <link>https://dev.to/brduarte/seguranca-e-eficiencia-por-que-evitar-incluir-o-arquivo-env-no-processo-de-build-do-projeto-3j24</link>
      <guid>https://dev.to/brduarte/seguranca-e-eficiencia-por-que-evitar-incluir-o-arquivo-env-no-processo-de-build-do-projeto-3j24</guid>
      <description>&lt;p&gt;O arquivo .env é um componente importante de muitos projetos, especialmente aqueles que dependem de variáveis de ambiente para funcionar corretamente. No entanto, em alguns casos, pode ser uma má prática incluir o arquivo .env no processo de build do projeto.&lt;/p&gt;

&lt;p&gt;A principal razão para não incluir o arquivo .env no processo de build é a segurança. O arquivo .env geralmente contém informações sensíveis, como senhas, chaves de API e outras credenciais. Se essas informações forem incluídas no processo de build, elas podem ser acessadas por qualquer pessoa com acesso ao código fonte ou ao pacote compilado. Isso pode levar a graves problemas de segurança, como invasões de sistemas, roubo de dados e comprometimento de credenciais.&lt;/p&gt;

&lt;p&gt;Além disso, incluir o arquivo .env no processo de build pode tornar o processo mais complexo e demorado. Se o arquivo .env contiver muitas variáveis de ambiente ou informações sensíveis, ele pode aumentar significativamente o tamanho do pacote final e, consequentemente, o tempo de compilação e implantação. Isso pode afetar negativamente o desempenho e a eficiência do projeto.&lt;/p&gt;

&lt;p&gt;Uma solução para evitar incluir o arquivo .env no processo de build é separá-lo do restante do código fonte e manter as informações sensíveis em um local seguro, como um servidor seguro ou um cofre de segredos. Em vez de incluir as informações diretamente no arquivo .env, é possível fazer referência a elas por meio de variáveis de ambiente definidas no sistema operacional ou em outro lugar seguro. Isso permite que o projeto seja compilado e implantado sem expor informações sensíveis a usuários não autorizados.&lt;/p&gt;

&lt;p&gt;Em resumo, incluir o arquivo .env no processo de build pode ser uma má prática de segurança e pode tornar o processo mais complexo e demorado. É importante considerar cuidadosamente a melhor maneira de gerenciar informações sensíveis em projetos que dependem de variáveis de ambiente e tomar medidas para garantir a segurança e eficiência do processo de build.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>segurança</category>
    </item>
  </channel>
</rss>
