Git: Um guia detalhado sobre como adicionar arquivos à área…
A área de preparação é um conceito exclusivo do Git; ela fica entre o diretório de trabalho e o repositório, permitindo que você controle com precisão o conteúdo de cada commit. O comando git add adiciona as alterações à área de preparação.
1. Visão geral do git add
(1) O que é uma área de armazenamento temporário?
A área de preparação é um componente essencial do modelo de três zonas do Git:
graph TB
subgraph GitThe Three-Zone Model
W[Workspace<br/>Working Directory<br/>Files Actually Edited]
S[Buffer<br/>Staging Area<br/>Changes Ready to Be Submitted]
R[Repository<br/>Repository<br/>All Commit History]
end
W -->|git add| S
S -->|git commit| R
R -->|git checkout| W
style W fill:#fff3cd
style S fill:#d4edda
style R fill:#c3e6cb
(2) Por que é necessário um buffer?
A área de preparação oferece um controle detalhado sobre os commits:
| Vantagem | Descrição | Exemplo |
|---|---|---|
| Confirmações seletivas | Nem todas as alterações precisam ser confirmadas | Confirme apenas os arquivos que corrigem bugs; não confirme código experimental |
| Enviar em lotes | Enviar alterações diferentes separadamente | Enviar o Recurso A e o Recurso B separadamente |
| Revisão de alterações | Verificações antes do commit | Verificar se as alterações preparadas estão corretas |
| Desfazer alterações | Desfazer uma alteração marcada não afeta o diretório de trabalho | É possível desfazer alterações feitas em um arquivo marcado |
(3) O objetivo do git add
O comando git add copia as alterações do diretório de trabalho para a área de preparação:
- Novo arquivo: Um novo arquivo adicionado à área de preparação e marcado como pronto para ser confirmado
- Modificar arquivo: Adicionar a versão modificada à área de preparação
- Excluir arquivo: Adicionar a operação de exclusão à área de preparação
2. Adicionar processo
(1) Sintaxe básica
# Add a Single File
git add <File Name>
# Add Multiple Files
git add <Documents1> <Documents2> <Documents3>
# Add all files in the directory
git add <Directory Name>
# Add all files in the current directory
git add .
(2) Explicação detalhada do processo de adição
sequenceDiagram
participant W as Workspace
participant S as Buffer
participant R as Repository
Note over W: Document Status: Modified/Untracked
W->>S: git add <file>
Note over S: Copy the file to the temporary storage area<br/>CalculationSHA-1Hash<br/>Update Index
Note over S: Document Status: Staged
S->>R: git commit
Note over R: Document Status: Committed
(3) Alterações após a adição
Depois de adicionar um arquivo à área de preparação:
- Área de trabalho: Os arquivos permanecem inalterados e podem continuar sendo editados
- Armazenamento temporário: salva um instantâneo do arquivo no momento em que ele foi adicionado
- Alteração de status: O arquivo passa de “Não rastreado/Modificado” para “Preparado”
▶ Exemplo: Adicionando um único arquivo
# Create a New File
echo "# My Project" > README.md
# View Status(Not tracked)
git status
# Untracked files:
# README.md
# Add to Stash
git add README.md
# View Status(Saved)
git status
# Changes to be committed:
# new file: README.md
# View the contents of the staging area
git diff --staged
# diff --git a/README.md b/README.md
# new file mode 100644
# index 0000000..e69de29
# --- /dev/null
# +++ b/README.md
# @@ -0,0 +1 @@
# +# My Project
▶ Exemplo: Adicionando vários arquivos
# Create Multiple Files
echo "console.log('app');" > app.js
echo "console.log('test');" > test.js
echo "node_modules/" > .gitignore
# Add Multiple Files
git add app.js test.js .gitignore
# View Status
git status -s
# A .gitignore
# A app.js
# A test.js
# Or add them one by one
git add app.js
git add test.js
git add .gitignore
# The results are the same
3. Adicionar opções
(1) Método de adição em lote
O Git oferece várias maneiras de adicionar arquivos em lote:
# Add all files in the current directory(Excludes deletions)
git add .
# Add all modifications and deletions to tracked files
git add -u
# Add All Files (Including new files, Edit, Delete)
git add -A
# Or
git add --all
# Interactive Addition(Verify one by one)
git add -p
(2) Comparação das opções
| Comando | Arquivos novos | Modificados | Excluídos | Escopo |
|---|---|---|---|---|
git add <文件> |
✅ | ✅ | ✅ | Especificar arquivo |
git add . |
✅ | ✅ | ❌ | Diretório atual |
git add -u |
❌ | ✅ | ✅ | Repositório inteiro |
git add -A |
✅ | ✅ | ✅ | Repositório completo |
(3) Adição interativa
git add -p (modo patch) permite que você analise cada bloco de modificação, um por um:
git add -p
# Show Modified Blocks,Ask if you want to save a draft
# Stage this hunk [y,n,q,a,d,e,?]?
# y - yes,Temporarily store this block
# n - no,Do not cache
# q - quit,Exit
# a - all,Cache all blocks in this file
# d - discard,Do not cache any blocks from this file
# e - edit,Edit this block manually
# ? - help,Show Help
▶ Exemplo: Adicionando comparações em massa
# Create a Scene
echo "new file" > new.txt # New Document
echo "content" > tracked.txt
git add tracked.txt
git commit -m "Add tracked"
echo "modified" >> tracked.txt # Modified
git rm tracked.txt # Delete(Simulation)
# Usage git add .
git add .
git status -s
# A new.txt
# (Do not process deletion)
# Reset
git reset
# Usage git add -u
git add -u
git status -s
# D tracked.txt
# (Process only modifications and deletions to tracked files)
# Reset
git reset
# Usage git add -A
git add -A
git status -s
# A new.txt
# D tracked.txt
# (Process all)
4. Gerenciamento de buffer
(1) Visualizar o conteúdo da área de preparação
# View Staged Changes
git diff --staged
# Or
git diff --cached
# View the differences between the staging area and the repository
git diff --staged HEAD
# View the list of files in the staging area
git status
(2) Características do tampão
Principais características do Buffer:
graph TB
A[Workspace Files] -->|git add| B[Swap Area Snapshot]
B -->|git commit| C[Repository Commit]
A -->|Continue editing| D[New Version of the Workspace]
D -->|git add| E[Update the temporary storage area]
B -.->|Different Versions| D
style B fill:#d4edda
style D fill:#fff3cd
Pontos-chave:
- A área de armazenamento temporário salva um instantâneo do momento da adição, e não uma referência
- Após adicionar, continue editando; haverá versões diferentes na área de trabalho e na área de preparação
- Você precisa executar o
git addnovamente para atualizar a área de preparação
(3) Sobrescrever a área de armazenamento temporário
Repetir git add sobrescreverá o conteúdo da área de transferência:
# First time adding
echo "version 1" > file.txt
git add file.txt
# Buffer:version 1
# Edit File
echo "version 2" > file.txt
# Workspace:version 2
# Buffer:version 1(Unchanged)
# Add Again
git add file.txt
# Buffer:version 2(Updated)
▶ Exemplo: Separando a área de preparação da área de trabalho
# Create and Add Files
echo "Line 1" > file.txt
git add file.txt
# View the contents of the staging area
git diff --staged
# +Line 1
# Continue editing the file
echo "Line 2" >> file.txt
# View the differences between the workspace and the staging area
git diff
# +Line 2
# View Status
git status -s
# AM file.txt
# A:The temporary storage area contains data(Line 1)
# M:There are new changes in the workspace(Line 2)
# Update the temporary storage area
git add file.txt
# The staging area currently contains all changes.
git diff --staged
# +Line 1
# +Line 2
5. Desfazer adição
(1) Desfazer Stash
Se você tiver marcado o arquivo errado, é possível desmarcá-lo:
# Undo Staging for a Single File(New Grammar)
git restore --staged <File Name>
# Undo Staging for a Single File(Old Syntax)
git reset HEAD <File Name>
# Uncheck all checkboxes
git restore --staged .
# Or
git reset
(2) Situação após a revogação
Após reverter a configuração de teste:
- Em espera: Os arquivos foram removidos
- Área de trabalho: Os arquivos permanecem inalterados
- Mudanças de estado:
- Novo arquivo: alterado de “Staged” para “Untracked”
- Modificado: Alterado de “Em fase” para “Modificado”
(3) Revogar x Descartar
Certifique-se de distinguir entre essas duas operações:
graph TB
A[Saved Files] -->|git restore --staged| B[Undo Temporary Save<br/>Workspace Retained]
A -->|git restore| C[Discard Changes<br/>Revert to the version in the staging area]
B --> D[Status: Untracked/Modified]
C --> E[Status: Staged]
style B fill:#d4edda
style C fill:#f8d7da
▶ Exemplo: Desfazendo uma operação de preparação
# Create and Add Files
echo "test content" > test.txt
git add test.txt
git status -s
# A test.txt
# Undo Temporary Save
git restore --staged test.txt
git status -s
# ?? test.txt
# The file has reverted to an untracked state
# Undo for Tracked Files
echo "# Project" > README.md
git add README.md
git commit -m "Add README"
echo "new content" >> README.md
git add README.md
git status -s
# M README.md
# Undo Temporary Save
git restore --staged README.md
git status -s
# M README.md
# The file reverts to its modified state,Changes Retained
▶ Exemplo: Adicionando uma cena de forma interativa
# Create a file containing multiple changes
cat > app.js << 'EOF'
function oldFunction() {
console.log('old');
}
function newFeature() {
console.log('new feature');
}
function debugCode() {
console.log('debug'); // Temporary Debugging Code
}
EOF
git add app.js
git commit -m "Add app"
# Edit File:Includes feature improvements and debugging code
cat > app.js << 'EOF'
function oldFunction() {
console.log('old');
console.log('improved'); // Feature Improvements
}
function newFeature() {
console.log('new feature');
console.log('enhanced'); // Feature Enhancements
}
function debugCode() {
console.log('debug'); // Temporary Debugging Code
}
EOF
# Use Interactive Add,Improvements to the Temporary Storage Feature
git add -p
# Confirm each modification block one by one
# y - Improvements to the Temporary Storage Feature
# n - Do not cache debug code
# Submit Feature Improvements
git commit -m "Improve features"
# The debugging code is still in the workspace,Not submitted
❓ Perguntas Frequentes
P: Qual é a diferença entre
git add .egit add -A?R:
git add .processa apenas os arquivos no diretório atual e em seus subdiretórios; não inclui exclusões de outros diretórios.git add -Aprocessa todos os arquivos em todo o repositório, incluindo adições, modificações e exclusões em todos os diretórios. Os dois comandos têm o mesmo efeito no diretório raiz do repositório, mas há uma diferença quando usados em subdiretórios.
P: O que acontece se eu continuar editando o arquivo depois de colocá-lo na área de preparação?
R: O arquivo aparecerá tanto na área de preparação quanto no diretório de trabalho, mas seus conteúdos serão diferentes. A área de preparação contém a versão tal como estava no momento em que foi adicionada, enquanto o diretório de trabalho contém a nova versão após a edição. O status será exibido como AM ou MM. Você precisa usar
git addpara atualizar a área de preparação novamente ou fazer o commit do conteúdo da área de preparação antes de adicionar novas alterações.
P: Como faço para ver o conteúdo da área de transferência?
R: Use
git diff --stagedougit diff --cachedpara visualizar as alterações na área de preparação. Isso mostrará as diferenças entre a área de preparação e o último commit. Se você quiser visualizar o conteúdo de arquivos específicos, usegit show :filenamepara visualizar os arquivos na área de preparação.
P: O
git addsobrescreve o conteúdo que já foi preparado?R: Sim. Executar o
git addnovamente no mesmo arquivo atualizará o conteúdo da área de preparação para a versão mais recente. Essa é a maneira normal de atualizar a área de preparação; não se trata de um problema, mas de um recurso.
P: Como posso aplicar apenas algumas das alterações a um arquivo?
R: Use
git add -ppara entrar no modo interativo. O Git exibirá as alterações um bloco por vez, e você poderá escolher “y” para marcar para o stage, “n” para pular ou “e” para editar manualmente. Isso permite que você controle com precisão quais alterações serão marcadas para o stage, possibilitando que você faça commits separados de diferentes alterações em um único arquivo.
📖 Resumo
- A área de preparação funciona como um buffer entre o espaço de trabalho e o repositório, proporcionando um controle preciso sobre os commits
git add <file>Adicionar arquivos especificados; permite adicionar vários arquivos e diretórios- Existem três maneiras de adicionar arquivos em lote:
.Diretório atual,-uArquivos monitorados,-ATodos os arquivos - O recurso interativo
git add -ppermite que você revise e confirme as alterações bloco por bloco, possibilitando commits parciais. - A área de transferência armazena uma cópia do item no momento em que ele foi adicionado; se você editá-lo depois de adicioná-lo, precisará adicioná-lo novamente.
- Use
git restore --stagedpara descartar a área de preparação; os arquivos na área de trabalho permanecem inalterados - Entender como funciona a área de preparação é fundamental para dominar o fluxo de trabalho do Git
📝 Exercícios
-
Exercício básico: Crie um repositório Git, adicione vários arquivos à área de preparação, use
git diff --stagedpara visualizar o conteúdo preparado e, em seguida, faça o commit. Observe as mudanças no status a cada etapa. -
Exercício avançado: Crie um arquivo, adicione-o à área de preparação e continue editando-o. Observe as diferenças entre o diretório de trabalho e a área de preparação. Tente usar o comando interativo
git add -ppara adicionar apenas uma parte das alterações à área de preparação. -
Desafio: Simule uma situação real: você corrigiu dois bugs, adicionou um novo recurso e escreveu um código temporário de depuração. Use commits interativos e vários commits para manter as diferentes alterações separadas e preservar um histórico de commits claro.