Git: Introdução à clonagem de repositórios Git e à…
A clonagem é o processo de obter uma cópia completa de um repositório Git de um servidor remoto, incluindo todos os arquivos, ramificações e todo o histórico de commits. Esse é o primeiro passo para colaborar com uma equipe.
1. Visão geral da clonagem
(1) O que é clonagem?
A clonagem é o processo de copiar um repositório remoto na íntegra para o seu computador local. Ao contrário do download de um arquivo ZIP, a clonagem recupera o repositório Git completo, incluindo:
- Todos os arquivos: Um instantâneo completo dos arquivos do projeto em um determinado momento
- Histórico completo: Todos os registros de commit, informações sobre os autores e registros de data e hora
- Todos os ramos: Informações sobre todos os ramos no repositório remoto
- Associação remota: cria automaticamente uma conexão com um repositório remoto
(2) A diferença entre clonagem e download
Muitas pessoas perguntam: por que não baixar simplesmente o arquivo ZIP? Vamos comparar as duas opções:
| Ação | Conteúdo | É possível visualizar o histórico? | É possível enviar alterações? | É possível alternar entre versões? |
|---|---|---|---|---|
| git clone | Repositório completo | ✅ | ✅ | ✅ |
| Baixar ZIP | Apenas instantâneo do arquivo | ❌ | ❌ | ❌ |
(3) Casos de uso para clonagem
A clonagem é utilizada principalmente nos seguintes cenários:
- Participe de projetos de código aberto: Clone um projeto localmente para aprender e contribuir
- Colaboração em equipe: Acesse o repositório de código compartilhado da equipe
- Implantação do projeto: Clone o código no servidor para implantação
- Backup do código: Clone o repositório remoto para o seu computador local como backup
2. O comando git clone
(1) Sintaxe básica
Sintaxe básica do comando git clone:
# Clone to the current directory(Automatically create a folder with the same name)
git clone <Warehouse Address>
# Clone to the specified directory
git clone <Warehouse Address> <Directory Name>
(2) Processo de clonagem
O processo completo de clonagem é o seguinte:
sequenceDiagram
participant L as Local Warehouse
participant R as Remote Server
L->>R: 1. Initiate a Cloning Request
R->>L: 2. Send Repository Metadata
R->>L: 3. Send All Objects(Documents、Submit)
R->>L: 4. Send Branch Information
L->>L: 5. CreateoriginRemote Association
L->>L: 6. Check out the default branch
L->>L: 7. Cloning Complete
▶ Exemplo: Clonando um repositório do GitHub
# CloneReactProject(HTTPSMethod)
git clone https://github.com/facebook/react.git
# Output Information:
# Cloning into 'react'...
# remote: Enumerating objects: 156789, done.
# remote: Counting objects: 100% (156789/156789), done.
# remote: Compressing objects: 100% (456/456), done.
# remote: Total 156789 (delta 12345), reused 156333 (delta 12000), pack-reused 0
# Receiving objects: 100% (156789/156789), 45.67 MiB | 5.23 MiB/s, done.
# Resolving deltas: 100% (123456/123456), done.
# Clone to the specified directory
git clone https://github.com/facebook/react.git my-react-project
# Clone to the current directory(Pay attention to the last point)
git clone https://github.com/facebook/react.git .
▶ Exemplo: Visualização de informações após a clonagem
# Clone the repository
git clone https://github.com/user/demo.git
cd demo
# View Remote Repository Associations
git remote -v
# origin https://github.com/user/demo.git (fetch)
# origin https://github.com/user/demo.git (push)
# View All Branches(Including remote branches)
git branch -a
# * main
# remotes/origin/HEAD -> origin/main
# remotes/origin/main
# remotes/origin/develop
# remotes/origin/feature
# View Commit History
git log --oneline -5
# a1b2c3d (HEAD -> main, origin/main, origin/HEAD) Update README
# e4f5g6h Add new feature
# i7j8k9l Fix bug in login
# m0n1o2p Initial commit
3. Opções de clonagem
(1) Clonagem superficial
Em projetos grandes, um clone completo pode demorar muito tempo e exigir bastante espaço. Um clone superficial baixa apenas os commits mais recentes:
# Clone only the most recent commit
git clone --depth 1 <Warehouse Address>
# Clone RecentNNext Submission
git clone --depth 10 <Warehouse Address>
Características da clonagem superficial:
- Prós: Velocidades de download rápidas, ocupa pouco espaço
- Desvantagens: Não é possível visualizar o histórico completo; certas operações são restritas
- Casos de uso: compilações de CI/CD, quando o que importa é apenas o código mais recente
(2) Clonagem de ramo único
Se você precisar apenas de um branch específico, pode clonar apenas esse branch:
# Clone only the specified branch
git clone --branch main --single-branch <Warehouse Address>
# Abbreviated form
git clone -b main --single-branch <Warehouse Address>
(3) Clonagem recursiva
Se um projeto contiver submódulos, é necessário cloná-los recursivamente:
# Recursive Cloning,Clone all submodules at the same time
git clone --recursive <Warehouse Address>
# If you have already cloned it,Submodules can be initialized individually
git clone <Warehouse Address>
cd <Table of Contents>
git submodule update --init --recursive
(4) Comparação das opções de clonagem
| Opção | Descrição | Downloads | Casos de uso |
|---|---|---|---|
| Sem opções | Clone completo | Todas | Desenvolvimento diário |
--depth 1 |
Clone superficial | Apenas o commit mais recente | CI/CD, implantação |
--single-branch |
Ramificação única | Especificar apenas uma ramificação | Apenas uma ramificação específica |
--recursive |
Clonagem recursiva | Inclui submódulos | O projeto possui submódulos |
--bare |
Servidor bare-metal | Sem área de trabalho | Imagem do servidor |
▶ Exemplo: Clonagem superficial de um projeto grande
# LinuxFull Kernel Cloning(3GB+,It takes a long time)
git clone https://github.com/torvalds/linux.git
# Cloning into 'linux'...
# Receiving objects: 100% (8234567/8234567), 3.45 GiB | 1.23 MiB/s, done.
# Shallow CloningLinuxKernel(100MB+,Fast)
git clone --depth 1 https://github.com/torvalds/linux.git
# Cloning into 'linux'...
# Receiving objects: 100% (12345/12345), 156.78 MiB | 5.67 MiB/s, done.
# View Historical Differences
cd linux
git log --oneline
# Only1Next Submission(Shallow Cloning)
# Fully cloned repository
git log --oneline | wc -l
# 1M+ Next Submission
4. Endereço remoto
(1) Tipo de protocolo
O Git oferece suporte a vários protocolos para acessar repositórios remotos:
graph TB
A[Remote Repository Address] --> B[HTTPS]
A --> C[SSH]
A --> D[Git Protocol]
A --> E[Local Path]
B --> B1[Example: https://...]
C --> C1[Example: git@...]
D --> D1[Example: git://...]
E --> E1[Example: /path/to/...]
style B fill:#d4edda
style C fill:#c3e6cb
style D fill:#fff3cd
style E fill:#f8d7da
(2) HTTPS x SSH
Os dois protocolos mais utilizados são o HTTPS e o SSH:
| Recurso | HTTPS | SSH |
|---|---|---|
| Formato do endereço | https://github.com/user/repo.git |
git@github.com:user/repo.git |
| Dificuldade de configuração | Fácil, não requer configuração | Requer a geração e configuração de chaves SSH |
| Método de autenticação | Nome de usuário + senha/token | Chave SSH |
| Ação de envio | É necessário inserir credenciais a cada vez | Não é necessária senha |
| Firewall | Compatível, usa a porta 443 | Pode ser bloqueado, usa a porta 22 |
| Cenários recomendados | Iniciantes, uso ocasional | Desenvolvimento diário, automação |
(3) Como usar um token de acesso pessoal
A partir de 2021, o GitHub não oferece mais suporte à autenticação por senha; é necessário usar um token de acesso pessoal:
# Use when cloningToken
git clone https://<token>@github.com/user/repo.git
# Or enter it when sending the push notificationTokenAs a password
git clone https://github.com/user/repo.git
# Username: your-username
# Password: ghp_xxxxxxxxxxxx(UsageToken)
▶ Exemplo: Clonagem utilizando protocolos diferentes
# HTTPSMethod(Recommended for Beginners)
git clone https://github.com/facebook/react.git
# SSHMethod(Recommended for Experienced Developers)
git clone git@github.com:facebook/react.git
# Git Protocol(Read-only,Used less frequently)
git clone git://github.com/facebook/react.git
# Local Path(Clone the local repository)
git clone /path/to/local/repo.git
# Clone from another user's directory on the same server
git clone file:///home/otheruser/project.git
5. Configuração pós-clonagem
(1) Associações criadas automaticamente
Assim que a clonagem for concluída, o Git criará automaticamente a seguinte configuração:
graph TB
A[Cloned repository] --> B[.gitTable of Contents]
A --> C[Workspace Files]
A --> D[Remote Associationorigin]
B --> B1[All Commit History]
B --> B2[All Branch Information]
B --> B3[Profile]
D --> D1[fetchAddress]
D --> D2[pushAddress]
D --> D3[Default Branch Tracking]
style A fill:#e1f5ff
style D fill:#d4edda
(2) Visualizar informações remotas
# View the name of the remote repository
git remote
# origin
# View Details
git remote -v
# origin https://github.com/user/repo.git (fetch)
# origin https://github.com/user/repo.git (push)
# View details about a remote repository
git remote show origin
# * remote origin
# Fetch URL: https://github.com/user/repo.git
# Push URL: https://github.com/user/repo.git
# HEAD branch: main
# Remote branches:
# main tracked
# develop tracked
# Local branch configured for 'git pull':
# main merges with remote main
# Local ref configured for 'git push':
# main pushes to main (up to date)
(3) Ramificação clonada
A clonagem recupera todos os branches remotos, mas faz o check-out apenas do branch padrão:
# View local branches
git branch
# * main (Only the default branch)
# View All Branches(Including remote)
git branch -a
# * main
# remotes/origin/HEAD -> origin/main
# remotes/origin/main
# remotes/origin/develop
# remotes/origin/feature-login
# Create a local branch to track a remote branch
git checkout -b develop origin/develop
# Or use the abbreviation
git checkout develop
# Branch 'develop' set up to track remote branch 'develop' from 'origin'.
# Switched to a new branch 'develop'
▶ Exemplo: Fluxo de trabalho completo após a clonagem
# 1. Clone the repository
git clone https://github.com/user/project.git
cd project
# 2. View Status
git status
# On branch main
# Your branch is up to date with 'origin/main'.
# 3. View Remote Information
git remote -v
# 4. View All Branches
git branch -a
# 5. Switch to another branch
git checkout develop
# 6. View Commit History
git log --oneline --graph --all -10
# 7. Get the latest updates
git pull origin main
❓ Perguntas Frequentes
P: Qual é a diferença fundamental entre clonar e baixar um arquivo ZIP?
R: A clonagem cria um repositório Git completo, que inclui todo o histórico, informações sobre ramificações e metadados de controle de versão. Você pode visualizar o histórico, alternar entre versões, criar ramificações e enviar alterações. O download de um arquivo ZIP fornece apenas um instantâneo dos arquivos; ele não inclui a funcionalidade de controle de versão, portanto, não é possível realizar nenhuma operação do Git.
P: O que posso fazer se a clonagem de um repositório grande estiver demorando muito?
R: Você pode usar um clone superficial
--depth 1para baixar apenas os commits mais recentes, o que será muito mais rápido. Se precisar apenas de um branch específico, use a opção--single-branch. Além disso, você pode usar um site espelho nacional para acelerar o processo, como o espelho fastgit do GitHub.
P: Como faço para enviar para um repositório remoto após a clonagem?
R: Você precisa de permissões de envio. Repositórios públicos só podem ser clonados, não é possível enviar arquivos para eles. Para repositórios com permissões, você precisará inserir seu nome de usuário e token ao usar HTTPS, ou configurar uma chave SSH ao usar SSH. O comando de envio é
git push origin <分支名>.
P: Como faço para clonar um repositório privado?
R: Repositórios privados exigem autenticação. Para HTTPS, use seu nome de usuário e seu token de acesso pessoal; para SSH, use uma chave SSH configurada. Certifique-se de que sua conta tenha permissões de acesso; caso contrário, você verá a mensagem “Falha na autenticação”.
P: E se eu receber a mensagem “fatal: o caminho de destino já existe”?
R: O diretório de destino já existe. Você pode excluir o diretório existente e cloná-lo novamente, cloná-lo para um diretório diferente
git clone <地址> <新目录名>ou acessar o diretório existente e executargit pullpara atualizá-lo.
📖 Resumo
- A clonagem é o processo de obter uma cópia completa de um repositório a partir de uma fonte remota, incluindo todos os arquivos, o histórico e as informações das ramificações.
git clone <url>é um comando básico que permite especificar o nome do diretório de destino- O Shallow Clone
--depth 1é adequado para situações em que se precisa apenas do código mais recente; ele é rápido e ocupa pouco espaço. - Clonagem de um único branch
--single-branchbaixa apenas o branch especificado, reduzindo o tamanho do download - O protocolo HTTPS é simples e fácil de usar, enquanto o protocolo SSH oferece transferências de arquivos convenientes; cada um tem seus próprios casos de uso adequados.
- Após a clonagem, é criada automaticamente uma conexão remota com
origin, permitindo que você visualize informações e ramificações remotas. - A clonagem detecta apenas o branch padrão; os demais branches devem ser criados e acompanhados manualmente.
📝 Exercícios
-
Exercício básico: Clone o repositório Hello-World no GitHub, visualize as informações do repositório remoto e todos os branches e compreenda a estrutura de diretórios após a clonagem.
-
Exercício avançado: Compare um clone completo e um clone superficial
--depth 1de um projeto grande (como o React), compare o tempo de download e o tamanho do diretório .git e compreenda os casos de uso dos clones superficiais. -
Desafio: Pesquise como clonar um repositório localmente e, em seguida, enviá-lo para outro repositório remoto (por exemplo, clonar do GitHub e enviar para o GitLab), e compreenda o gerenciamento de repositórios remotos e as configurações com múltiplos repositórios remotos.