什么是 Git 的文件状态?(Untracked、Modified、Staged、Unmodified)
在 Git 中,理解文件的状态是掌握 Git 工作流的核心。Git 管理下的工作目录中的文件,其生命周期主要分为两大类:未跟踪(Untracked) 和 已跟踪(Tracked)。
而“已跟踪”的文件又分为三种状态:Unmodified(未修改)、Modified(已修改)、Staged(已暂存)。
为了方便理解,我们可以用“拍照”来打比方:
- Untracked:镜头外的路人(Git 不管他)。
- Modified:镜头里的人换了衣服,但还没摆好姿势(改了,但还没准备好拍照)。
- Staged:摆好姿势,准备按下快门(放进暂存区,马上要保存了)。
- Unmodified:照片已经拍好并洗出来了(已经存入版本库,且没有新变化)。
下面为你详细解释这四种状态:
1. Untracked(未跟踪)
- 含义:这是文件刚被创建时的默认状态。它存在于你的项目文件夹中,但 Git 并不知道它的存在,也没有把它纳入版本控制。也就是说,它既没有在之前的快照(Commit)中,也没有被放入暂存区。
- 常见场景:你刚刚新建了一个文件(如
new_file.txt),还没有执行过git add。 - Git Status 表现:红色字体,显示在
Untracked files:下方。 - 状态转换:使用
git add <文件名>命令,文件就会被 Git 纳入管理,状态变为 Staged(已暂存)。
2. Unmodified(未修改 / 已提交)
- 含义:文件已经被 Git 跟踪,并且当前的内容与上一次提交(Commit)时的内容完全一致。Git 认为这是一个“干净”的文件。
- 常见场景:你刚刚完成了一次
git commit,此时工作目录里所有被跟踪的文件都是 Unmodified 状态;或者你刚从远程仓库 clone 下来一个项目,没有任何改动。 - Git Status 表现:不会显示在
git status中(终端会提示nothing to commit, working tree clean)。 - 状态转换:
- 如果你修改了它,它就会变成 Modified(已修改)。
- 如果你删除了它,Git 会记录这个删除动作。
3. Modified(已修改)
- 含义:文件已经被 Git 跟踪(原本是 Unmodified 状态),但你对它进行了修改,且还没有把这些修改保存到暂存区。
- 常见场景:你打开了一个已经存在于版本库中的代码文件,加了两行代码,然后保存了。
- Git Status 表现:红色字体,显示在
Changes not staged for commit:下方。 - 状态转换:
- 使用
git add <文件名>,状态变为 Staged(已暂存)。 - 使用
git checkout -- <文件名>或git restore <文件名>,会撤销修改,退回 Unmodified(未修改) 状态。
- 使用
4. Staged(已暂存)
- 含义:文件被修改或新建后,你告诉 Git:“这个文件的当前版本我已经确认了,请把它放进下一次提交的候车室(暂存区)里”。
- 常见场景:你修改完代码并执行了
git add,但还没有执行git commit。 - Git Status 表现:绿色字体,显示在
Changes to be committed:下方。 - 状态转换:
- 执行
git commit后,暂存区里的内容会被永久保存到 Git 仓库,文件状态变回 Unmodified(未修改)。 - 如果你此时再次修改这个 Staged 文件,它会同时拥有 Staged 和 Modified 两个状态(意味着你需要再次
git add把新的修改也放入暂存区)。
- 执行
💡 总结:Git 文件的生命周期流转图
你可以通过下面这个流程,清晰地看到平时敲的代码是如何在这四种状态之间流转的:
plaintext
新建文件
│
▼
【Untracked (未跟踪)】
│
│ git add (添加)
▼
【Staged (已暂存)】 ────────┐
│ │
│ git commit (提交) │
▼ │
【Unmodified (未修改)】 │ git add (添加)
│ │
│ 修改文件 │
▼ │
【Modified (已修改)】 ────────┘