Repositório Git: como criar com git init e conectar um remote
Um repositório Git é a pasta do projeto junto com o diretório oculto .git, onde o Git guarda todo o histórico de alterações, as branches e as configurações. Ele é criado com git init na pasta do projeto ou baixado pronto com git clone. O repositório remoto é conectado com git remote add origin endereço.
Um repositório Git é um projeto cujas alterações são acompanhadas pelo Git. Fisicamente, é uma pasta comum com os seus arquivos, mais o diretório oculto .git, onde fica todo o histórico: commits, branches, tags, configurações. Apague o .git e sobram só os arquivos, sem nenhuma versão anterior.
Do que um repositório é feito
Ao trabalhar com Git, ajuda ter em mente três áreas por onde as alterações passam:
- diretório de trabalho (working tree) — os arquivos que você vê e edita;
- índice (staging area) — o rascunho do próximo commit, para onde as alterações vão com
git add; - histórico — o banco de commits dentro do
.git, para onde as alterações vão comgit commit.
A rigor, o repositório em si é o conteúdo do .git. O diretório de trabalho é apenas uma versão "desempacotada" do projeto que o Git tira do histórico.
Como criar um repositório Git com git init
Entre na pasta do projeto e rode um único comando:
cd ~/projects/my-app
git init
Initialized empty Git repository in /home/user/projects/my-app/.git/
Você pode criar o repositório numa pasta vazia ou numa pasta que já tem arquivos. No segundo caso nada se perde: os arquivos existentes só ficam como não rastreados (untracked) até você adicioná-los com git add.
Variações úteis do comando:
# Criar a pasta e o repositório dentro dela de uma vez
git init my-app
# Definir o nome da primeira branch (senão: master ou o valor das configurações)
git init -b main
# Tornar main a branch padrão de todos os repositórios novos
git config --global init.defaultBranch main
O primeiro commit
Um repositório vazio, sem commits, quase não serve para nada. Logo depois do git init, normalmente se faz isto:
git config --global user.name "João Silva"
git config --global user.email "joao@example.com"
git status
git add .
git commit -m "Estrutura inicial do projeto"
Nome e e-mail são configurados uma vez por computador — eles vão gravados em cada commit. Sem eles, o Git se recusa a commitar e pede que você se identifique.
Adicione o .gitignore logo de cara
Antes do primeiro git add ., crie o arquivo .gitignore com a lista do que não deve entrar no repositório: dependências, builds, segredos, arquivos da IDE.
node_modules/
dist/
.env
.idea/
.vscode/
*.log
__pycache__/
Se o arquivo já entrou num commit, o .gitignore não o remove. É preciso deixar de rastreá-lo, mantendo-o no disco: git rm --cached .env, e depois commitar.
O que tem dentro da pasta .git
No dia a dia não é preciso mexer ali, mas entender a estrutura tira muitas dúvidas:
| Elemento | O que guarda |
|---|---|
objects/ | Objetos comprimidos: conteúdo dos arquivos (blob), estrutura das pastas (tree), commits |
refs/heads/ | Branches — arquivos com o hash do último commit |
refs/tags/ | Tags |
HEAD | Ponteiro para a branch atual, por exemplo ref: refs/heads/main |
config | Configurações deste repositório, incluindo a lista de remotes |
index | Estado da staging area |
hooks/ | Scripts executados em eventos (pre-commit, pre-push) |
Daí uma conclusão importante: uma branch no Git é um arquivinho com um único hash. Por isso criar branches é instantâneo e não custa nada.
Como verificar se uma pasta é um repositório
git status
# ou, de forma mais precisa
git rev-parse --is-inside-work-tree
Fora de um repositório, você recebe fatal: not a git repository (or any of the parent directories): .git. Repare no "parent directories": o Git procura o .git subindo pela árvore de pastas. Se você rodar git init sem querer no seu diretório home, ele inteiro vira um repositório — essa pasta .git precisa ser apagada.
Repositório local e remoto
O repositório criado com git init existe só no seu computador. Para compartilhar o código e ter um backup, conecta-se a ele um repositório remoto (remote) — uma cópia num servidor: GitHub, GitLab, Bitbucket ou um servidor Git próprio.
Para o Git, o repositório remoto não é o "principal": cada cópia é completa e contém todo o histórico. O que o torna central é apenas o combinado do time.
git remote: conectando um repositório remoto
Um remote é um nome curto para o endereço do servidor. Por convenção, o nome principal é origin.
# Adicionar um remote
git remote add origin git@github.com:username/my-app.git
# Ver a lista com os endereços
git remote -v
origin git@github.com:username/my-app.git (fetch)
origin git@github.com:username/my-app.git (push)
Em seguida, envie a branch e ligue-a à remota:
git push -u origin main
Principais comandos git remote
| Comando | O que faz |
|---|---|
git remote -v | Lista os remotes com os endereços |
git remote add <nome> <url> | Conecta um novo repositório remoto |
git remote set-url origin <url> | Troca o endereço, por exemplo de HTTPS para SSH |
git remote rename origin old | Renomeia o remote |
git remote remove old | Remove o remote (o servidor em si não é afetado) |
git remote show origin | Detalhes: branches, rastreamento, o que está desatualizado |
Formatos de endereço
https://github.com/user/repo.git— HTTPS, funciona em qualquer lugar; para escrever, precisa de token;git@github.com:user/repo.git— SSH, precisa de chave; depois de configurado, não pede senha;/srv/git/repo.gitoufile:///srv/git/repo.git— caminho local, prático para experimentos.
Erros comuns
"error: remote origin already exists". Já existe um remote com esse nome. Se você quer trocar o endereço, use git remote set-url origin <url>, e não um novo add.
"failed to push some refs" / "Updates were rejected". O servidor tem commits que você não tem — muitas vezes é o README criado ao abrir o repositório no site. Rode git pull --rebase origin main e tente o push de novo. Se os históricos não tiverem nenhuma relação, o Git responde "refusing to merge unrelated histories" — aí o git pull precisa da flag --allow-unrelated-histories. É mais simples criar o repositório vazio no site.
"src refspec main does not match any". Você está tentando enviar uma branch que não existe: ou ainda não houve nenhum commit, ou a branch se chama master. Confira com git branch.
Seu próprio servidor Git: repositório bare
O GitHub não é obrigatório. Qualquer máquina à qual você tenha acesso SSH pode ser o repositório remoto. Para isso, cria-se no servidor um repositório "nu" (bare) — sem diretório de trabalho, só com o conteúdo do .git:
# No servidor
ssh user@server
git init --bare /srv/git/my-app.git
# No seu computador
git remote add origin user@server:/srv/git/my-app.git
git push -u origin main
Para três pessoas trabalharem com esse servidor, basta dar aos colegas acesso SSH à pasta do repositório e um grupo comum com permissão de escrita. Para controlar permissões por branch e por projeto isso já não basta — aí você precisa de uma hospedagem Git completa.
Num repositório bare não dá para "entrar e corrigir um arquivo" — ele serve só para troca via push e fetch. É exatamente assim que funcionam os repositórios em qualquer hospedagem Git. Se você precisa de interface web, review e issues, instale soluções self-hosted como GitLab, Gitea ou Forgejo.
Branches de rastreamento: como o repositório local enxerga o servidor
Depois de conectar o remote e fazer o primeiro git fetch ou git push, aparecem no repositório branches remotas como origin/main. Não são as branches do servidor, e sim "fotografias" locais do que você viu no servidor na última sincronização. Elas só são atualizadas com fetch, pull e push.
Daí a diferença importante entre os três comandos de troca:
| Comando | O que muda |
|---|---|
git fetch | Atualiza origin/*, sem mexer nas suas branches nem nos arquivos |
git pull | fetch + merge de origin/main na branch atual |
git push | Envia seus commits e atualiza a branch no servidor |
Para saber quanto sua branch está atrás ou à frente:
git fetch
git status -sb
## main...origin/main [ahead 2, behind 1]
Aqui você tem dois commits que não estão no servidor, e o servidor tem um que você não tem. Antes do push, é preciso trazer esse commit.
A ligação entre a branch local e a remota (upstream) é definida com a flag -u no primeiro push. Se esqueceu, dá para configurar depois: git branch --set-upstream-to=origin/main. Para ver todas as ligações — git branch -vv.
Vários repositórios: monorepo ou um por projeto
Uma dúvida frequente de iniciantes é quantos repositórios Git criar. Regra simples: um repositório para cada unidade desenvolvida e lançada de forma independente. Projetos de estudo, projetos pessoais e serviços separados são repositórios diferentes. Não crie um único repositório para a pasta "Meus projetos" inteira: o histórico se mistura e fica difícil publicar um projeto sozinho no portfólio.
Grandes empresas às vezes mantêm todo o código num monorepo, por causa das mudanças transversais e do build unificado, mas essa é uma decisão de arquitetura consciente, com ferramentas próprias. Quem está começando deve seguir a regra "um projeto, um repositório" e nunca colocar um repositório dentro de outro sem submodules.
git init ou git clone
| Situação | Comando |
|---|---|
| Vai começar um projeto do zero | git init |
| Tem uma pasta com código sem controle de versão | git init nessa pasta |
| O projeto já está no GitHub ou num servidor | git clone <url> |
| Precisa de um repositório central no seu servidor | git init --bare |
Depois do git clone, o remote origin já vem configurado; não é preciso adicioná-lo manualmente.
Passo a passo: da pasta ao repositório no GitHub
- Crie a pasta do projeto e rode
git init -b main. - Adicione o
.gitignoree o README. - Faça o primeiro commit:
git add .egit commit -m "Initial commit". - Crie no GitHub um repositório vazio — sem README, licença ou .gitignore.
- Conecte-o:
git remote add origin <endereco>. - Envie o código:
git push -u origin main. - Daí em diante, trabalhe no ciclo: edições →
git add→git commit→git push.
Conclusão
Um repositório Git é o seu projeto mais a pasta .git com o histórico completo. Ele é criado com git init, e a conexão com o servidor é configurada com git remote add origin e o primeiro git push -u. O repositório remoto pode ser o GitHub, o GitLab ou o seu próprio servidor Git com um repositório bare. A criação do primeiro repositório, o índice e a conexão do remote são praticados no curso de Git.
Perguntas frequentes
Como apagar um repositório Git e manter os arquivos?
Apague a pasta oculta .git na raiz do projeto: rm -rf .git no Linux e no macOS. Os arquivos continuam, mas todo o histórico de versões é perdido.
Posso rodar git init numa pasta que já é um repositório?
Sim, é seguro: o Git informa Reinitialized existing Git repository e não mexe no histórico. O comando só recria os arquivos internos que estiverem faltando.
Quantos remotes posso conectar a um repositório?
Quantos quiser. Por exemplo, origin para o seu fork e upstream para o projeto original — é assim que normalmente se trabalha com open source.
Onde ficam as configurações de um repositório específico?
No arquivo .git/config. As configurações globais do usuário ficam em ~/.gitconfig e são definidas com git config --global.
Qual a diferença entre um repositório bare e um comum?
O repositório bare não tem diretório de trabalho com arquivos, só os dados internos do Git. Ele é usado como repositório central no servidor, para onde se faz push.
Este tema é abordado em profundidade, com prática, no curso “Git do zero ao desenvolvedor confiante”.
- Primeiro Repositório: init, add, commit e a Mágica do Índice
- GitHub e repositórios remotos: seu código na nuvem