Git: Inicializando um repositório Git
Um repositório Git é o cerne do controle de versão; todo o histórico do código, os ramos e as tags são armazenados no repositório. Esta lição oferece uma explicação detalhada sobre como criar e gerenciar repositórios.
1. Visão geral dos repositórios Git
Um repositório Git é um banco de dados que contém todos os arquivos de um projeto e seu histórico completo.
(1) O que é um repositório Git?
Um repositório Git é um diretório que contém os arquivos do projeto e o histórico de versões. Ele apresenta as seguintes características:
- Histórico completo: registra um instantâneo completo de cada commit
- Suporte a ramificações: É possível criar várias ramificações de desenvolvimento paralelas
- Distribuído: Cada repositório é independente e contém o histórico completo
- Armazenamento eficiente: economiza espaço por meio de tecnologias de compactação e deduplicação
(2) Duas maneiras de criar um repositório
graph TB
A[CreateGitWarehouse] --> B[git init<br/>Create a New Repository from Scratch]
A --> C[git clone<br/>Clone a Remote Repository]
B --> D[Empty Warehouse<br/>You need to add the files manually.]
C --> E[Complete Repository<br/>Includes all historical data]
style A fill:#e1f5ff
style B fill:#fff4e1
style C fill:#fff4e1
A diferença entre os dois métodos:
| Método | Comando | Cenários aplicáveis | Inclui histórico |
|---|---|---|---|
| Inicialização | git init |
Criar um novo projeto | ❌ Repositório vazio |
| Clonar | git clone |
Participar de um projeto existente | ✅ Histórico completo |
2. Inicializar um repositório com git init
O comando git init converte um diretório comum em um repositório Git.
(1) Processo de inicialização
graph LR
A[Create a Directory] --> B[Go to the Table of Contents]
B --> C[Run git init]
C --> D[Create .git Table of Contents]
D --> E[The warehouse was successfully created.]
style A fill:#e1f5ff
style E fill:#d4edda
(2) Uso básico
# Method1:Initialize in the current directory
cd my-project
git init
# Method2:Create and initialize a new directory
git init my-project
▶ Exemplo: Como criar um novo repositório
# Steps1:Create a project directory
mkdir my-project
# Steps2:Go to the Table of Contents
cd my-project
# Steps3:InitializationGitWarehouse
git init
# Output:
# Initialized empty Git repository in /path/to/my-project/.git/
# Steps4:View Repository Status
git status
# Output:
# On branch main
# No commits yet
# nothing to commit (create/copy files and use "git add" to track)
# Steps5:View the directory structure
ls -la
# Output:
# total 0
# drwxr-xr-x 3 user group 4096 Jan 1 00:00 .
# drwxr-xr-x 3 user group 4096 Jan 1 00:00 ..
# drwxr-xr-x 7 user group 4096 Jan 1 00:00 .git
(3) Inicializar em um projeto existente
Se você já tiver um arquivo de projeto, poderá inicializá-lo diretamente no diretório do projeto:
# Go to the directory of the existing project
cd existing-project
# InitializationGitWarehouse
git init
# View Status(All existing files are untracked.)
git status
# Output:
# Untracked files:
# src/
# README.md
# package.json
git init não altera os arquivos existentes; ele simplesmente cria o diretório .git. Todos os arquivos existentes passarão a ser considerados “Não rastreados”.
3. Estrutura do diretório .git
.git O diretório é o núcleo de um repositório Git e armazena todas as informações de controle de versão.
(1) Explicação detalhada da estrutura de diretórios
.git/
├── HEAD # Current branch pointer
├── config # Local Configuration File
├── description # Repository Description (for GitWeb)
├── hooks/ # Hook Scripts Directory
│ ├── pre-commit.sample
│ └── post-commit.sample
├── info/ # Additional Information
│ └── exclude # Local Ignore Rules
├── objects/ # All Data Objects (Commits, Trees, Documents)
│ ├── info/
│ └── pack/
├── refs/ # Quote(Branch、Tags)
│ ├── heads/ # Local Branch
│ └── tags/ # Tags
└── index # Buffer Information(Documents)
(2) Observações sobre documentos importantes
| Arquivo/Diretório | Descrição | Exemplo de conteúdo |
|---|---|---|
| HEAD | Aponta para o branch atual | ref: refs/heads/main |
| config | Configuração local | Endereço do repositório remoto, informações do usuário, etc. |
| objects/ | Armazena todos os objetos de dados | Commits, árvores, instantâneos de arquivos (armazenados de forma compactada) |
| refs/heads/ | Ponteiro de ramificação local | Um arquivo por ramificação, contendo o hash do commit |
| refs/tags/ | Pontoadores de tags | Um arquivo por tag |
| índice | Informações do stash | Registra o status dos arquivos no stash |
▶ Exemplo: Visualizando o diretório .git
# Steps1:View.gitTable of Contents
ls -la .git
# Output:
# -rw-r--r-- 1 user group 23 Jan 1 00:00 HEAD
# -rw-r--r-- 1 user group 137 Jan 1 00:00 config
# -rw-r--r-- 1 user group 73 Jan 1 00:00 description
# drwxr-xr-x 2 user group 4096 Jan 1 00:00 hooks
# drwxr-xr-x 2 user group 4096 Jan 1 00:00 info
# drwxr-xr-x 4 user group 4096 Jan 1 00:00 objects
# drwxr-xr-x 4 user group 4096 Jan 1 00:00 refs
# Steps2:ViewHEADDocuments
cat .git/HEAD
# Output:ref: refs/heads/main
# Steps3:View Profile
cat .git/config
# Output:
# [core]
# repositoryformatversion = 0
# filemode = true
# bare = false
# logallrefupdates = true
# Steps4:View the branch directory
ls -la .git/refs/heads
# Output:(Initially empty,After creating a commit, there will bemainDocuments)
(3) Explicação detalhada do diretório “objects”
objects O repositório armazena todos os objetos de dados do Git, utilizando hashes SHA-1 como nomes de arquivo:
objects/
├── 4a/ # Before hashing2"as" as the directory name
│ └── 8b2f... # After hashing38"as" as the filename
├── info/
└── pack/ # Packaging and Storage(Space-saving)
Tipo de objeto:
- Blob: Conteúdo do arquivo
- Árvore: Estrutura de diretórios
- Commit: Mensagem do commit
- Tag: Informações sobre a tag
.git, a menos que tenha certeza absoluta do que está fazendo! Modificações incorretas podem causar corrupção no repositório.
4. Clonando um repositório com git clone
O comando git clone é usado para clonar um repositório remoto para o seu computador local.
(1) O papel da clonagem
A clonagem realiza as seguintes operações:
- Baixar o histórico completo: Inclui todos os commits, branches e tags
- Crie um repositório local: Crie um diretório
.gitno seu computador - Vincular remotamente de forma automática: Crie uma referência remota chamada
origin - Ramo padrão: Normalmente
mainoumaster
(2) Sintaxe do comando clone
# Basic Syntax
git clone <Warehouse Address>
# Clone to the specified directory
git clone <Warehouse Address> <Directory Name>
# Shallow Cloning(Clone Only RecentNNext Submission)
git clone --depth <In-Depth> <Warehouse Address>
# Clone a Single Branch
git clone -b <Branch Name> --single-branch <Warehouse Address>
▶ Exemplo: Clonando um repositório do GitHub
# Method1:UsageHTTPSClone(Recommended for Beginners)
git clone https://github.com/user/repo.git
# Output:
# Cloning into 'repo'...
# remote: Enumerating objects: 100, done.
# remote: Counting objects: 100% (100/100), done.
# remote: Compressing objects: 100% (80/80), done.
# remote: Total 100 (delta 20), reused 100 (delta 20), pack-reused 0
# Receiving objects: 100% (100/100), done.
# Resolving deltas: 100% (20/20), done.
# Method 2: Use SSH Clone (requires SSH key configuration)
git clone git@github.com:user/repo.git
# Method3:Clone to the specified directory
git clone https://github.com/user/repo.git my-project
# Method4:Shallow Cloning(Clone Only Recent1Next Submission,Fast)
git clone --depth 1 https://github.com/user/repo.git
# Steps:Verify the cloning results
cd repo
git remote -v
# Output:
# origin https://github.com/user/repo.git (fetch)
# origin https://github.com/user/repo.git (push)
(3) Estrutura de diretórios após a clonagem
graph TB
A[Remote Repository<br/>github.com/user/repo] --> B[git clone]
B --> C[Local Warehouse]
C --> D[.git Table of Contents<br/>Complete History+Remote Configuration]
C --> E[Project Documents<br/>The latest version of the default branch]
D --> F[origin Remote References]
style A fill:#e1f5ff
style C fill:#d4edda
origin que aponta para o endereço do repositório original. Você pode visualizá-la usando git remote -v.
5. Como verificar o status do armazém
git status é o comando básico para verificar o status atual de um repositório.
(1) Tipos de status de arquivo
graph LR
A[Document Status] --> B[Not tracked<br/>Untracked]
A --> C[Modified<br/>Modified]
A --> D[Saved<br/>Staged]
A --> E[Submitted<br/>Committed]
B -->|git add| D
C -->|git add| D
D -->|git commit| E
E -->|Edit File| C
style B fill:#fff3cd
style C fill:#ffe6e6
style D fill:#d4edda
style E fill:#c3e6cb
(2) Tabela de descrição de status
| Status | Nome em inglês | Descrição | Próxima ação |
|---|---|---|---|
| Não rastreado | Não rastreado | Novo arquivo, não rastreado pelo Git | git add Adicionado à área de preparação |
| Modified | Modified | Tracked file has been modified but not staged | git add Added to staging area |
| Staged | Staged | Added to staging, ready to be committed | git commit Commit |
| Confirmado | Confirmado | Confirmado no repositório local | Continuar trabalhando ou enviar |
▶ Exemplo: Verificando o status do repositório
# Steps1:Initialize the repository
mkdir demo && cd demo
git init
# Steps2:View Initial State(Empty Warehouse)
git status
# Output:
# On branch main
# No commits yet
# nothing to commit (create/copy files and use "git add" to track)
# Steps3:Create a New File
echo "# Demo Project" > README.md
# Steps4:View Status(Not tracked)
git status
# Output:
# On branch main
# No commits yet
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# README.md
# nothing added to commit but untracked files present
# Steps5:Add to Stash
git add README.md
# Steps6:View Status(Saved)
git status
# Output:
# On branch main
# No commits yet
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
# new file: README.md
# Steps7:Submit
git commit -m "Initial commit"
# Steps8:View Status(Clean)
git status
# Output:
# On branch main
# nothing to commit, working tree clean
(3) Visão geral do status
Use a opção -s para visualizar uma saída concisa do status:
git status -s
# Output Example:
# M modified-file.txt # Modified(On the leftMIndicates a temporary storage area,on the rightMIndicates workspace)
# A new-file.txt # New files that have been cached
# ?? untracked-file.txt # Untracked files
❓ Perguntas Frequentes
P: Qual é a diferença entre
git initegit clone?R:
git initcria um repositório totalmente novo e vazio, adequado para novos projetos;git clonecopia um repositório remoto existente (incluindo todo o seu histórico), adequado para participar de um projeto já existente.
P: Posso excluir o diretório .git?
R: Sim, mas isso excluirá todo o histórico de versões! Após a exclusão, o diretório se tornará um diretório comum e não será mais um repositório Git. Você só deve excluí-lo se tiver certeza de que não precisa mais do histórico de versões.
P: Como faço para inicializar um repositório em um diretório que já contém arquivos?
R: Execute
git initdiretamente no diretório. O Git não modificará nenhum arquivo existente; ele simplesmente criará um diretório .git. Todos os arquivos existentes serão marcados como não rastreados.
P: O que devo fazer se a clonagem de um repositório estiver lenta?
R: Você pode usar um clone superficial
git clone --depth 1 <url>, que clona apenas o commit mais recente e é mais rápido. Isso é adequado para situações em que você precisa apenas do código mais recente e não precisa do histórico.
📖 Resumo
- Um repositório Git é o núcleo do controle de versão; ele contém os arquivos do projeto e um histórico completo.
- Existem duas maneiras de criar um repositório:
git init(Novo) egit clone(Clonar) - O diretório
.gitarmazena todas as informações de controle de versão, incluindo HEAD, config, objects, refs e muito mais. - Ao clonar, todo o histórico é baixado, um repositório local é criado e uma conexão com o repositório remoto “origin” é estabelecida automaticamente
- Os arquivos têm quatro estados: não rastreados, modificados, preparados para envio e confirmados
- Use
git statuspara verificar o status do repositório e ver em que estágio o arquivo se encontra
📝 Exercícios
-
Exercício básico (Dificuldade: ⭐): Crie um repositório Git chamado
my-first-repo, examine a estrutura de diretórios de.gite explique a finalidade do arquivo HEAD. -
Advanced Exercise (Difficulty ⭐⭐): Create a README.md file and a src directory in the repository. Use
git statusto observe changes in the file statuses, and record the meaning of each status. -
Desafio (Dificuldade: ⭐⭐⭐): Clone um repositório público do GitHub (por exemplo, https://github.com/octocat/Hello-World.git), analise a configuração remota (
git remote -v) e explique o significado e a finalidade deorigin.