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:

100%
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:


2. Adicionar processo

(1) Sintaxe básica

BASH
# 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

100%
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:

▶ Exemplo: Adicionando um único arquivo

BASH
# 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

BASH
# 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:

BASH
# 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:

BASH
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

BASH
# 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

BASH
# 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:

100%
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:

(3) Sobrescrever a área de armazenamento temporário

Repetir git add sobrescreverá o conteúdo da área de transferência:

BASH
# 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

BASH
# 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:

BASH
# 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:

(3) Revogar x Descartar

Certifique-se de distinguir entre essas duas operações:

100%
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

BASH
# 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

BASH
# 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 . e git 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 -A processa 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 add para 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 --staged ou git diff --cached para 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, use git show :filename para visualizar os arquivos na área de preparação.

P: O git add sobrescreve o conteúdo que já foi preparado?

R: Sim. Executar o git add novamente 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 -p para 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


📝 Exercícios

  1. Exercício básico: Crie um repositório Git, adicione vários arquivos à área de preparação, use git diff --staged para visualizar o conteúdo preparado e, em seguida, faça o commit. Observe as mudanças no status a cada etapa.

  2. 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 -p para adicionar apenas uma parte das alterações à área de preparação.

  3. 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.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%