<?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: André Moreira</title>
    <description>The latest articles on DEV Community by André Moreira (@moreiraandre).</description>
    <link>https://dev.to/moreiraandre</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%2F79021%2Fd1c7876c-3cfb-402c-8e09-c272dd89e56d.jpeg</url>
      <title>DEV Community: André Moreira</title>
      <link>https://dev.to/moreiraandre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/moreiraandre"/>
    <language>en</language>
    <item>
      <title>Git com múltiplas contas: configure trabalho e pessoal no mesmo computador</title>
      <dc:creator>André Moreira</dc:creator>
      <pubDate>Wed, 24 Jun 2026 12:49:58 +0000</pubDate>
      <link>https://dev.to/moreiraandre/git-com-multiplas-contas-configure-trabalho-e-pessoal-no-mesmo-computador-p98</link>
      <guid>https://dev.to/moreiraandre/git-com-multiplas-contas-configure-trabalho-e-pessoal-no-mesmo-computador-p98</guid>
      <description>&lt;p&gt;Você já fez um commit no repositório do trabalho e percebeu que estava com o seu e-mail pessoal? Ou o contrário? Esse é um dos erros mais comuns de quem usa Git com múltiplas contas no mesmo computador.&lt;/p&gt;

&lt;p&gt;Neste tutorial você vai aprender a configurar tudo corretamente, de uma vez, usando chaves SSH separadas e &lt;code&gt;.gitconfig&lt;/code&gt; condicional — sem gambiarras.&lt;/p&gt;




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

&lt;p&gt;Por padrão o Git usa uma configuração global:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Seu Nome"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"seu@email.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso significa que &lt;strong&gt;todos os repositórios&lt;/strong&gt; no seu computador usam o mesmo usuário. Quando você tem contas separadas (ex: &lt;code&gt;joao@empresa.com&lt;/code&gt; no GitLab da empresa e &lt;code&gt;joao@gmail.com&lt;/code&gt; no GitLab pessoal), os commits vão sair com o e-mail errado.&lt;/p&gt;

&lt;p&gt;A solução profissional envolve duas partes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Chaves SSH separadas&lt;/strong&gt; para cada conta&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.gitconfig&lt;/code&gt; condicional&lt;/strong&gt; que aplica o usuário certo — e a chave SSH certa — por pasta&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Passo 1 — Gerar as chaves SSH
&lt;/h2&gt;

&lt;p&gt;Abra o terminal e gere uma chave para cada conta. Use nomes diferentes para não sobrescrever:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Chave para a conta pessoal&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"joao@gmail.com"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/id_ed25519_pessoal

&lt;span class="c"&gt;# Chave para a conta do trabalho&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"joao@empresa.com"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/id_ed25519_trabalho
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Por que &lt;code&gt;ed25519&lt;/code&gt;?&lt;/strong&gt; É o algoritmo mais moderno, mais seguro e recomendado pelo GitHub, GitLab e Bitbucket. Evite RSA a menos que seu servidor seja muito antigo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ao final você terá quatro arquivos em &lt;code&gt;~/.ssh/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;id_ed25519_pessoal      ← chave privada (nunca compartilhe)
id_ed25519_pessoal.pub  ← chave pública (você registra no GitLab)
id_ed25519_trabalho
id_ed25519_trabalho.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Passo 2 — Registrar as chaves no GitLab
&lt;/h2&gt;

&lt;p&gt;Para cada conta:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Copie o conteúdo da chave pública:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pessoal&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519_pessoal.pub

&lt;span class="c"&gt;# Trabalho&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519_trabalho.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Acesse &lt;strong&gt;Settings → SSH and GPG keys → New SSH key&lt;/strong&gt; na conta correspondente e cole o conteúdo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Faça isso nas &lt;strong&gt;duas contas&lt;/strong&gt;, cada uma com a sua respectiva chave pública.&lt;/p&gt;




&lt;h2&gt;
  
  
  Passo 3 — Configurar o Git por pasta (o pulo do gato)
&lt;/h2&gt;

&lt;p&gt;Aqui está o diferencial: usar o &lt;strong&gt;&lt;code&gt;includeIf&lt;/code&gt;&lt;/strong&gt; do Git para aplicar configurações diferentes dependendo de onde o repositório está — incluindo &lt;strong&gt;qual chave SSH usar&lt;/strong&gt;, sem precisar mexer no &lt;code&gt;~/.ssh/config&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A ideia é simples: você organiza seus projetos em pastas separadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/
├── projetos/
│   ├── pessoal/       ← projetos pessoais
│   └── trabalho/      ← projetos da empresa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.1 — Criar os &lt;code&gt;.gitconfig&lt;/code&gt; específicos
&lt;/h3&gt;

&lt;p&gt;Cada arquivo define o usuário &lt;strong&gt;e&lt;/strong&gt; a chave SSH que o Git deve usar naquela pasta. O &lt;code&gt;core.sshCommand&lt;/code&gt; instrui o Git a chamar o SSH com uma chave específica e ignorar qualquer configuração do &lt;code&gt;~/.ssh/config&lt;/code&gt; (o &lt;code&gt;-F /dev/null&lt;/code&gt; garante isso):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Configuração pessoal&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.gitconfig-pessoal &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
[user]
    name = João Silva
    email = joao@gmail.com
[core]
    sshCommand = ssh -i ~/.ssh/id_ed25519_pessoal -F /dev/null
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Configuração do trabalho&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.gitconfig-trabalho &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
[user]
    name = João Silva
    email = joao@empresa.com
[core]
    sshCommand = ssh -i ~/.ssh/id_ed25519_trabalho -F /dev/null
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;O que é &lt;code&gt;-F /dev/null&lt;/code&gt;?&lt;/strong&gt; Diz ao SSH para ignorar completamente o &lt;code&gt;~/.ssh/config&lt;/code&gt;. Isso evita que configurações globais de SSH interfiram e garante que a chave especificada em &lt;code&gt;-i&lt;/code&gt; seja a única usada. Sem essa flag, o SSH ainda pode carregar outras identidades do seu agente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3.2 — Configurar o &lt;code&gt;.gitconfig&lt;/code&gt; global com &lt;code&gt;includeIf&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Edite &lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vim ~/.gitconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deixe assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[user]&lt;/span&gt;
    &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;João Silva&lt;/span&gt;
    &lt;span class="py"&gt;email&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;joao@gmail.com   # fallback (usado fora das pastas mapeadas)&lt;/span&gt;

&lt;span class="nn"&gt;[includeIf "gitdir:~/projetos/pessoal/"]&lt;/span&gt;
    &lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;~/.gitconfig-pessoal&lt;/span&gt;

&lt;span class="nn"&gt;[includeIf "gitdir:~/projetos/trabalho/"]&lt;/span&gt;
    &lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;~/.gitconfig-trabalho&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;A barra no final do caminho é obrigatória.&lt;/strong&gt; &lt;code&gt;~/projetos/trabalho/&lt;/code&gt; funciona; &lt;code&gt;~/projetos/trabalho&lt;/code&gt; não.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Passo 4 — Testar a conexão SSH
&lt;/h2&gt;

&lt;p&gt;Com os &lt;code&gt;.gitconfig&lt;/code&gt; configurados, o teste correto é deixar o &lt;strong&gt;Git invocar o SSH automaticamente&lt;/strong&gt; — sem passar a chave no comando.&lt;/p&gt;

&lt;p&gt;O detalhe importante: o &lt;code&gt;includeIf&lt;/code&gt; só é ativado dentro de um repositório git. Por isso o teste cria um repo temporário dentro de cada pasta mapeada e roda &lt;code&gt;git ls-remote&lt;/code&gt;, que faz uma conexão SSH real sem precisar de nenhum clone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Crie as pastas base se ainda não existirem&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/projetos/pessoal ~/projetos/trabalho

&lt;span class="c"&gt;# Teste da conta pessoal&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projetos/pessoal
git init .teste-pessoal &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; .teste-pessoal
git ls-remote git@gitlab.com:joao-pessoal/meu-projeto.git HEAD
&lt;span class="c"&gt;# deve listar o HEAD autenticado como joao-pessoal&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; .. &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; .teste-pessoal

&lt;span class="c"&gt;# Teste da conta do trabalho&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projetos/trabalho
git init .teste-trabalho &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; .teste-trabalho
git ls-remote git@gitlab.com:empresa/projeto-empresa.git HEAD
&lt;span class="c"&gt;# deve listar o HEAD autenticado como conta da empresa&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; .. &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; .teste-trabalho
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 O &lt;code&gt;git init&lt;/code&gt; dentro da pasta é necessário porque o &lt;code&gt;includeIf "gitdir:..."&lt;/code&gt; só é avaliado quando o Git está operando dentro de um repositório. O &lt;code&gt;ls-remote&lt;/code&gt; faz a conexão SSH sem precisar de histórico ou commits — é o teste mais leve possível.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se aparecer &lt;code&gt;Permission denied (publickey)&lt;/code&gt;, volte ao Passo 2 e verifique se a chave pública foi cadastrada na conta correta.&lt;/p&gt;




&lt;h2&gt;
  
  
  Passo 5 — Clonar repositórios
&lt;/h2&gt;

&lt;p&gt;Com essa abordagem, as URLs de clone continuam normais — você usa &lt;code&gt;git@gitlab.com&lt;/code&gt; em todos os casos. O Git saberá qual chave usar com base na pasta onde o repositório está:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Repositório pessoal — clone normalmente dentro de ~/projetos/pessoal/&lt;/span&gt;
git clone git@gitlab.com:joao-pessoal/meu-projeto.git ~/projetos/pessoal/meu-projeto

&lt;span class="c"&gt;# Repositório do trabalho — clone dentro de ~/projetos/trabalho/&lt;/span&gt;
git clone git@gitlab.com:empresa/projeto-empresa.git ~/projetos/trabalho/projeto-empresa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para repositórios já clonados fora da pasta certa, mova-os para a pasta correta ou defina o &lt;code&gt;sshCommand&lt;/code&gt; manualmente só naquele repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/algum-repo-avulso
git config core.sshCommand &lt;span class="s2"&gt;"ssh -i ~/.ssh/id_ed25519_trabalho -F /dev/null"&lt;/span&gt;
git config user.email &lt;span class="s2"&gt;"joao@empresa.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verificação final
&lt;/h2&gt;

&lt;p&gt;Dentro de cada repositório, confirme que o Git está usando o usuário e a chave corretos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projetos/trabalho/projeto-empresa
git config user.email
&lt;span class="c"&gt;# deve retornar: joao@empresa.com&lt;/span&gt;

git config core.sshCommand
&lt;span class="c"&gt;# deve retornar: ssh -i ~/.ssh/id_ed25519_trabalho -F /dev/null&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projetos/pessoal/meu-projeto
git config user.email
&lt;span class="c"&gt;# deve retornar: joao@gmail.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Resumo da estrutura
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.ssh/
├── id_ed25519_pessoal        ← chave privada pessoal
├── id_ed25519_pessoal.pub
├── id_ed25519_trabalho       ← chave privada do trabalho
└── id_ed25519_trabalho.pub

~/.gitconfig                  ← config global com includeIf
~/.gitconfig-pessoal          ← user, email e sshCommand pessoal
~/.gitconfig-trabalho         ← user, email e sshCommand do trabalho

~/projetos/
├── pessoal/                  ← clones pessoais aqui
└── trabalho/                 ← clones do trabalho aqui
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Problemas comuns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Still using the wrong email after setup"&lt;/strong&gt;&lt;br&gt;
Verifique se a barra final está no &lt;code&gt;includeIf&lt;/code&gt;. Rode &lt;code&gt;git config user.email&lt;/code&gt; dentro do repositório (não globalmente).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Permission denied (publickey)"&lt;/strong&gt;&lt;br&gt;
Rode &lt;code&gt;ssh -i ~/.ssh/id_ed25519_trabalho -vT git@gitlab.com&lt;/code&gt; para ver o que acontece. Confirme que a chave pública está cadastrada na conta correta no GitLab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"sshCommand não está sendo aplicado"&lt;/strong&gt;&lt;br&gt;
Confirme que o repositório está dentro da pasta mapeada no &lt;code&gt;includeIf&lt;/code&gt; e que a barra final está presente. Teste com &lt;code&gt;git config core.sshCommand&lt;/code&gt; dentro do repo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Com essa configuração você nunca mais vai:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Commitar com o e-mail errado&lt;/li&gt;
&lt;li&gt;❌ Misturar credenciais de contas diferentes&lt;/li&gt;
&lt;li&gt;❌ Precisar criar aliases de host no &lt;code&gt;~/.ssh/config&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;❌ Precisar configurar manualmente cada repositório&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lógica é elegante: o &lt;strong&gt;&lt;code&gt;includeIf&lt;/code&gt;&lt;/strong&gt; do Git ativa automaticamente o &lt;code&gt;user&lt;/code&gt;, o &lt;code&gt;email&lt;/code&gt; e o &lt;code&gt;core.sshCommand&lt;/code&gt; certos com base na pasta — tudo em um único lugar, sem efeitos colaterais no restante do sistema.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Gostou? Deixa uma reação e compartilha com aquele dev que sempre commita com o e-mail errado 👇&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>ssh</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
