git init
Saiba sobre a importância, o uso, o diretório de templates e as opções do comando git init, e como distinguir git init e git clone.
O que o git init faz
git init cria um repositório Git novo e vazio — ou reinicializa um existente. É quase sempre o primeiro comando Git que você executa em um projeto, e é o que transforma uma pasta comum em algo que o Git pode rastrear.
Ao executá-lo, é criado um único subdiretório oculto chamado .git dentro do seu projeto. Esse diretório contém tudo o que o Git precisa para gerenciar seu histórico: o banco de dados de objetos, referências (branches e tags), o ponteiro HEAD, configuração e uma cópia dos arquivos de template padrão. Seus arquivos de projeto permanecem exatamente onde estão — o Git nunca os move ou modifica durante o init.
Esta página aborda como executar git init de diferentes maneiras, a diferença entre um repositório regular e um bare, o diretório de templates e a lista completa de opções. Se, em vez disso, você quiser uma cópia de um repositório que já existe em outro lugar, use git clone em vez de git init. Para uma visão geral de alto nível, consulte O que é Git.
Inicializando um repositório
A forma mais simples de começar a versionar um projeto é entrar no diretório com cd e executar o comando sem argumentos:
cd my-project
git initO Git exibe uma confirmação e cria o subdiretório .git:
Initialized empty Git repository in /home/user/my-project/.git/Você também pode passar um nome de diretório. O Git cria esse diretório (se ainda não existir) e coloca o novo repositório lá:
git init my-projectO repositório está vazio nesse ponto — ainda não há commits. Os próximos passos normalmente são adicionar arquivos ao stage com git add e registrá-los com git commit. Você pode verificar o estado do seu novo repositório a qualquer momento com git status.
Reinicializando um repositório existente
Executar git init dentro de um diretório que já possui um subdiretório .git é seguro. O Git não apaga nem sobrescreve seu histórico ou configuração — ele simplesmente reaplicará quaisquer arquivos de template ausentes e exibirá:
Reinitialized existing Git repository in /home/user/my-project/.git/Isso é ocasionalmente útil para incorporar novos arquivos de um diretório de templates atualizado.
Repositórios bare
Um repositório bare é criado com a flag --bare. Ele contém o histórico do Git, mas não possui diretório de trabalho — não há arquivos com checkout para editar, portanto não é possível fazer commits diretamente nele.
git init --bare project.gitRepositórios bare existem para ser um local central e compartilhado para onde outros clones fazem push e de onde fazem pull. Fazer push para um repositório não-bare pode sobrescrever os arquivos que alguém está editando ativamente em seu diretório de trabalho, por isso repositórios centrais/remotos são quase sempre bare. Por convenção, eles são nomeados com o sufixo .git (por exemplo, project.git).
A diferença é visível na estrutura. Um repositório regular oculta os arquivos do Git dentro de uma pasta .git:
my-project/
├── .git/ ← Git's data lives here
└── (your files)Um repositório bare coloca esse mesmo conteúdo diretamente no nível superior — não há uma árvore de trabalho envolvendo-o:
project.git/
├── HEAD
├── config
├── description
├── hooks/
├── info/
├── objects/
└── refs/
Definindo o nome do branch inicial
Historicamente, o Git nomeava o primeiro branch como master. Você pode escolher um nome diferente no momento do init com --initial-branch (ou sua forma abreviada -b):
git init --initial-branch=mainPara tornar isso o padrão para cada novo repositório, sem precisar passar a flag, defina-o uma vez na sua configuração global:
git config --global init.defaultBranch mainConsulte git config para mais informações sobre configurações globais.
O diretório de templates
Quando o Git cria o subdiretório .git, ele o inicializa a partir de um diretório de templates — um conjunto de arquivos (como hooks de exemplo e um arquivo info/exclude) que são copiados para cada novo repositório. O Git escolhe o template a usar a partir do primeiro destes que estiver definido, na seguinte ordem:
- o caminho fornecido com a opção
--template, - a variável de ambiente
$GIT_TEMPLATE_DIR, - a variável de configuração
init.templateDir, - o padrão embutido, geralmente
/usr/share/git-core/templates.
Os templates padrão servem principalmente como exemplos (por exemplo, os hooks de exemplo são desabilitados por padrão). Ao fornecer seu próprio diretório de templates, você pode ter arquivos e pastas — como um conjunto padrão de hooks — copiados automaticamente para cada repositório que você inicializar.
Referência de opções
git init aceita um argumento opcional <directory>. Se você omiti-lo, o comando é executado no diretório atual; se você fornecer um caminho que não existe, o Git o cria. As flags mais úteis estão abaixo.
| Flag | Descrição |
|---|---|
-q, --quiet | Exibe apenas erros e avisos; toda outra saída é suprimida. |
--bare | Cria um repositório bare (sem diretório de trabalho). |
--template=<template-directory> | Especifica o diretório de templates do qual copiar arquivos ao criar o repositório. |
--separate-git-dir=<git-dir> | Armazena os dados reais do Git em <git-dir> e deixa um pequeno arquivo de texto .git apontando para ele. Em um repositório existente, o diretório .git é movido para o novo caminho. |
--shared[=(false|true|umask|group|all|world|everybody|0xxx)] | Configura o repositório para ser compartilhado entre vários usuários, controlando as permissões de arquivo do grupo. |
-b <name>, --initial-branch=<name> | Define o nome do branch inicial no novo repositório. |
git init vs. git clone
Esses dois comandos criam um repositório local, mas partem de pontos opostos:
git inittransforma uma pasta local existente em um repositório novo e vazio, sem histórico.git clonebaixa um repositório remoto existente — com todo seu histórico, branches e arquivos — e configura uma conexão de volta para esse remoto.
Use git init quando estiver iniciando um projeto do zero em sua máquina; use git clone quando estiver ingressando em um projeto que já existe em um servidor como o GitHub.