>> >> >> Reference << << << <<<<<<Ref>>>>>>
add
Modified: 2025-12-31 | Author:ljf12825

git add的作用是将新增或已更改文件的内容添加到index中,作为下次commit的内容
在一次commit之前,可以执行多次add,一次add就是一次拍照,内容是当前的新增或更改内容,如果后续对内容进行修改且希望提交,需要再次add
默认情况下,add不会添加忽略文件,使用--force可强制添加。如果不使用--force,命令会失败并返回忽略的文件列表

语义及设计理念

git add的作用不是“添加文件”,而是把工作区中的文件内容,写入Git对象数据库,并更新index中对应路径指向的对象

Working Tree(工作区)
        ↓ git add
Index / Staging Area(暂存区)
        ↓ git commit
Repository(对象库 + 提交历史)

git add只负责从工作区读取文件内容,生成(或复用)blob对象,更新index,它不产生commit,也不更改HEAD

底层行为

Git不关心文件,只关心内容

当执行

git add a.txt 

Git做的事情是

路径名 -> blob hash + 文件模式

如果文件内容没变,git add不会生成新对象,这就是Git去重能力极强的根本原因

index

index存储下一次commit的完整快照草稿,index中的每一条记录包含

设计哲学

git add是Git的核心设计之一

支持部分提交

假设改了一个文件

// main.c 
修了 bug 
加了日志
写了一半新功能(未完成)

可以

git add -p main.c 

只把bug修复,日志加入index,而把未完成的新功能留在工作区
Git的单位不是文件,是”内容块(hunk)“

index的设计

index是缓冲层,如果没有git add,每次commit只能提交工作区的全部状态,无法构建干净、可回溯的历史

OPTIONS

交互式add

# 启动交互式暂存界面
git add -i

# 或使用完整命令
git add --interactive

# 简写模式(更新版本)
git add -p # 补丁模式,最常用

启动后显示菜单

           staged     unstaged path
  1:    unchanged       +12/-0 README.md
  2:    unchanged       +20/-4 src/main.py
  3:    unchanged        +3/-0 newfile.txt

*** Commands ***
  1: status       2: update       3: revert       4: add untracked
  5: patch        6: diff         7: quit         8: help
What now>
  1. status(状态)

显示当前更改的摘要信息

What now> 1
# 显示哪些文件已暂存、未暂存
  1. update(更新)

将整个文件的更改添加到暂存区

What now> 2
           staged     unstaged path
  1:    unchanged       +12/-0 README.md
  2:    unchanged       +20/-4 src/main.py
Update>>
# 输入文件编号(如 1,2 或 1-3)
Update>> 1,2
# 暂存选中文件的全部更改
  1. revert(恢复)

从暂存区移除已暂存的文件

What now> 3
           staged     unstaged path
  1:        +12/-0    unchanged README.md
Revert>>
# 输入要取消暂存的文件编号
  1. add untracked(添加未跟踪文件)

添加新文件到暂存区

What now> 4
           staged     unstaged path
  1:    unchanged        +3/-0 newfile.txt
Add untracked>>
  1. patch(补丁模式)

逐块暂存更改-这是交互式add的核心功能

What now> 5
# 或直接使用补丁模式
git add -p
git add --patch
  1. diff(查看差异)

显示暂存区与工作区的差异

What now> 6
           staged     unstaged path
  1:        +12/-0     +4/-2 README.md
Diff>>
# 输入文件编号查看具体差异
  1. quit(退出)

退出交互式界面

  1. help(帮助)

显示命令帮助信息

补丁模式

启动补丁模式

# 对特定文件使用补丁模式
git add -p filename.py

# 对所有更改文件使用
git add -p

# 等价于
git add --patch

补丁模式的工作流程

  1. Git逐块显示更改
  2. 每个块前显示选项提示
  3. 用户选择如何操作该块
  4. 继续处理下一个块

选项

当Git显示一个代码块时,会提示

Stage this hunk [y,n,q,a,d,j,J,g,/,s,e,?]?

常用选项

s(split) 分割大块

当Git显示的块太大,包含多个逻辑更改时

@@ -10,7 +10,10 @@ def calculate_total(items)
    total = 0
    for item in items:
        total += item.price
-   return total
+
+   # 添加折扣计算
+   # discount = total * 0.1
+   return total - discount

# 另一个不相关的函数
def validate_input(data):

输入s后,Git会尝试将大块分割成更小的逻辑块

e(edit) 手动编辑

输入e后进入编辑界面

# Manual hunk edit mode -- see bottom for a quick guide.
@@ -10,7 +10,10 @@ def calculate_total(items):
     total = 0
     for item in items:
         total += item.price
-    return total
+    
+    # 添加折扣计算
+    discount = total * 0.1
+    return total - discount
 
# ---
# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.

编辑规则

Hunk

在Git中,Hunk是diff输出的一个基本单位,代表文件中一组连续的更改行。一个hunk包含