Git: Git状态查看与文件状态管理
git status是Git中最常用的命令之一,它帮助你了解当前工作区的状态,查看哪些文件被修改、哪些已暂存、哪些未被跟踪。
1. git status概述
(1) 为什么需要查看状态?
在Git工作流中,你需要时刻了解:
- 哪些文件被修改了:工作区有哪些变化
- 哪些文件已暂存:准备提交的内容
- 哪些文件未跟踪:新创建还未管理的文件
- 当前所在分支:在哪个分支上工作
- 与远程的关系:是否与远程同步
git status提供了所有这些信息,是Git工作流的"仪表盘"。
(2) 基本用法
BASH
# 查看完整状态
git status
# 查看简洁状态
git status -s
# 或
git status --short
(3) 状态信息的价值
状态信息帮助你:
- 决定下一步操作:是添加、提交还是推送
- 避免遗漏文件:确保所有修改都被提交
- 检查工作进度:了解当前工作状态
- 发现意外修改:及时发现不应修改的文件
2. 文件状态
(1) 四种文件状态
Git中的文件有四种主要状态:
stateDiagram-v2
[*] --> Untracked: 创建新文件
Untracked --> Staged: git add
Untracked --> Untracked: 编辑
Staged --> Committed: git commit
Committed --> Modified: 编辑文件
Modified --> Staged: git add
Staged --> Modified: 编辑暂存文件
Committed --> Committed: git commit
(2) 状态详解
| 状态 | 英文名 | 说明 | 显示颜色 | 操作建议 |
|---|---|---|---|---|
| 未跟踪 | Untracked | 新文件,未被Git管理 | 红色 | 需要git add |
| 已修改 | Modified | 已修改但未暂存 | 红色 | 需要git add |
| 已暂存 | Staged | 已添加到暂存区 | 绿色 | 可以git commit |
| 已提交 | Committed | 已提交到版本库 | 无显示 | 工作干净 |
(3) 状态转换流程
理解状态转换是掌握Git的关键:
graph TB
A[创建新文件] -->|Untracked| B[未跟踪状态]
B -->|git add| C[已暂存状态]
C -->|git commit| D[已提交状态]
D -->|编辑文件| E[已修改状态]
E -->|git add| C
C -->|编辑暂存文件| F[部分暂存<br/>MM状态]
F -->|git add| C
style B fill:#f8d7da
style C fill:#d4edda
style D fill:#c3e6cb
style E fill:#fff3cd
style F fill:#e2e3e5
▶ 示例:观察状态变化
BASH
# 初始化仓库
mkdir status-demo && cd status-demo
git init
# 创建新文件
echo "# Demo Project" > README.md
echo "console.log('Hello');" > app.js
# 查看状态 - 未跟踪
git status
# On branch main
#
# No commits yet
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# README.md
# app.js
#
# nothing added to commit but untracked files present
# 添加一个文件到暂存区
git add README.md
# 查看状态 - 部分暂存
git status
# On branch main
#
# No commits yet
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
# new file: README.md
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
# app.js
3. 状态输出详解
(1) 输出结构
git status的输出分为几个部分:
TEXT
📖 仅展示
On branch main ← 当前分支
Your branch is up to date with 'origin/main'. ← 与远程关系
Changes to be committed: ← 已暂存的修改(绿色)
(use "git restore --staged <file>..." to unstage)
modified: file1.txt
new file: file2.txt
Changes not staged for commit: ← 未暂存的修改(红色)
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: file3.txt
Untracked files: ← 未跟踪的文件(红色)
(use "git add <file>..." to include in what will be committed)
file4.txt
no changes added to commit ← 总结信息
(2) 理解各部分含义
分支信息:
On branch main:当前在main分支Your branch is ahead of 'origin/main' by 2 commits:本地领先远程2个提交Your branch is behind 'origin/main' by 3 commits:本地落后远程3个提交
已暂存区域:
- 这些修改会在下次
git commit时提交 - 显示为绿色(在支持颜色的终端)
- 包括新文件、修改的文件、删除的文件
未暂存区域:
- 文件已修改但未添加到暂存区
- 显示为红色
- 需要使用
git add才能提交
未跟踪文件:
- Git不知道的新文件
- 显示为红色
- 需要使用
git add才能管理
▶ 示例:完整状态输出分析
BASH
# 创建复杂场景
git init
echo "# Project" > README.md
git add README.md
git commit -m "Initial commit"
# 创建各种状态的文件
echo "new file" > new.txt # 未跟踪
echo "change" >> README.md # 已修改未暂存
echo "staged" > staged.txt
git add staged.txt # 已暂存的新文件
echo "more" >> staged.txt # 暂存后又修改
# 查看完整状态
git status
# On branch main
# Changes to be committed:
# new file: staged.txt
#
# Changes not staged for commit:
# modified: README.md
# modified: staged.txt
#
# Untracked files:
# new.txt
4. 状态简览
(1) 简洁输出格式
使用-s或--short选项可以获得简洁输出:
BASH
git status -s
输出格式为两列标记+文件名:
TEXT
📖 仅展示
XY filename
(2) 状态标记含义
| 标记 | X列(暂存区) | Y列(工作区) | 说明 |
|---|---|---|---|
?? |
- | - | 未跟踪文件 |
A |
Added | - | 新添加到暂存区 |
M |
Modified | - | 已修改并暂存 |
M |
- | Modified | 已修改但未暂存 |
MM |
Modified | Modified | 暂存后又修改 |
D |
Deleted | - | 已删除并暂存 |
D |
- | Deleted | 已删除但未暂存 |
AD |
Added | Deleted | 新添加后在工作区删除 |
R |
Renamed | - | 已重命名并暂存 |
C |
Copied | - | 已复制并暂存 |
(3) 简洁输出的优势
- 快速浏览:一目了然看到所有状态
- 脚本友好:易于解析和处理
- 节省空间:输出紧凑,适合终端
- 颜色编码:保留颜色提示(绿色暂存,红色未暂存)
▶ 示例:对比详细与简洁输出
BASH
# 创建多种状态
echo "untracked" > file1.txt
echo "content" > file2.txt
git add file2.txt
echo "more" >> file2.txt
echo "tracked" > file3.txt
git add file3.txt
git commit -m "Add files"
echo "modified" >> file3.txt
# 详细输出
git status
# On branch main
# Changes to be committed:
# new file: file2.txt
#
# Changes not staged for commit:
# modified: file3.txt
#
# Untracked files:
# file1.txt
# 简洁输出
git status -s
# A file2.txt
# M file3.txt
# ?? file1.txt
5. 状态变化追踪
(1) 典型工作流状态变化
让我们追踪一个完整的Git工作流:
sequenceDiagram
participant W as 工作区
participant S as 暂存区
participant R as 版本库
Note over W: 1. 创建新文件
W->>W: 状态: Untracked
Note over W,S: 2. git add
W->>S: 移动到暂存区
S->>S: 状态: Staged
Note over S,R: 3. git commit
S->>R: 提交到版本库
R->>R: 状态: Committed
Note over W: 4. 编辑文件
W->>W: 状态: Modified
Note over W,S: 5. git add
W->>S: 更新暂存区
S->>S: 状态: Staged
Note over S,R: 6. git commit
S->>R: 提交修改
R->>R: 状态: Committed
(2) 特殊状态:部分暂存
当文件已暂存,但工作区又有新修改时,会出现特殊状态:
BASH
# 创建并暂存文件
echo "version 1" > file.txt
git add file.txt
git status -s
# A file.txt
# 继续编辑文件
echo "version 2" >> file.txt
git status -s
# AM file.txt
# A表示已暂存(version 1)
# M表示工作区有新修改(version 2)
# 再次添加
git add file.txt
git status -s
# A file.txt
# 现在暂存区是version 2
(3) 状态与Git命令的关系
| 当前状态 | 可用命令 | 结果 |
|---|---|---|
| Untracked | git add |
变为Staged |
| Untracked | git clean |
删除文件 |
| Modified | git add |
变为Staged |
| Modified | git restore |
撤销修改,变为Committed |
| Staged | git commit |
变为Committed |
| Staged | git restore --staged |
撤销暂存,变为Modified或Untracked |
| Committed | 编辑文件 | 变为Modified |
▶ 示例:完整工作流追踪
BASH
# 初始化
git init status-workflow
cd status-workflow
# 步骤1:创建文件(Untracked)
echo "# Project" > README.md
git status -s
# ?? README.md
# 步骤2:添加到暂存区(Staged)
git add README.md
git status -s
# A README.md
# 步骤3:提交(Committed)
git commit -m "Add README"
git status
# nothing to commit, working tree clean
# 步骤4:修改文件(Modified)
echo "## Features" >> README.md
git status -s
# M README.md
# 步骤5:暂存修改(Staged)
git add README.md
git status -s
# M README.md
# 步骤6:再次修改(部分暂存)
echo "## Usage" >> README.md
git status -s
# MM README.md
# 步骤7:提交暂存内容
git commit -m "Add features"
git status -s
# M README.md (工作区还有修改)
# 步骤8:提交剩余修改
git add README.md
git commit -m "Add usage"
git status
# nothing to commit, working tree clean
❓ 常见问题
Q 为什么git status显示的文件有红色和绿色?
A 颜色表示文件状态。绿色表示已暂存(Staged),这些文件会在下次commit时提交。红色表示未暂存(Modified或Untracked),需要先git add才能提交。
Q "working tree clean"是什么意思?
A 表示工作区干净,没有未提交的修改。所有修改都已提交到版本库,没有未跟踪、未暂存或已暂存未提交的文件。这是理想的工作状态。
Q 如何只查看已暂存的文件?
A 使用
git diff --staged或git diff --cached可以查看已暂存的修改内容。如果想看文件列表,可以结合git status -s,只看左侧有标记的文件。Q git status很慢怎么办?
A 大型仓库可能因为文件太多导致git status变慢。可以使用
git status -s简洁输出,或配置git config core.ignoreStat true忽略文件状态检查。也可以使用git status --untracked-files=no忽略未跟踪文件。Q 如何忽略某些文件不让git status显示?
A 在项目根目录创建
.gitignore文件,列出要忽略的文件模式。例如*.log忽略所有日志文件,node_modules/忽略依赖目录。被忽略的文件不会出现在git status中。📖 小节
git status是最常用的Git命令,帮助了解当前工作区状态- 文件有四种状态:Untracked(未跟踪)、Modified(已修改)、Staged(已暂存)、Committed(已提交)
- 状态输出分为三部分:已暂存、未暂存、未跟踪,颜色区分绿色暂存和红色未暂存
- 简洁输出
git status -s用两列标记表示状态,快速浏览适合脚本处理 - 状态标记XY中,X列表示暂存区状态,Y列表示工作区状态
- 理解状态转换是掌握Git工作流的关键,每个状态对应不同的可用命令
- 部分暂存(MM状态)表示文件已暂存但工作区又有新修改
📝 作业
-
基础题:创建一个Git仓库,依次创建文件、添加、提交、修改、再添加、再提交,每步都用
git status观察状态变化,记录状态转换过程。 -
进阶题:创建多种状态的文件(未跟踪、已修改、已暂存、部分暂存),对比
git status详细输出和git status -s简洁输出,理解状态标记的含义。 -
挑战题:编写一个脚本,解析
git status -s的输出,统计各种状态的文件数量(未跟踪、已暂存、已修改等),用于自动化检查仓库状态。