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中的文件有四种主要状态:

100%
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的关键:

100%
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) 理解各部分含义

分支信息

已暂存区域

未暂存区域

未跟踪文件

▶ 示例:完整状态输出分析

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工作流:

100%
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 --stagedgit 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中。

📖 小节


📝 作业

  1. 基础题:创建一个Git仓库,依次创建文件、添加、提交、修改、再添加、再提交,每步都用git status观察状态变化,记录状态转换过程。

  2. 进阶题:创建多种状态的文件(未跟踪、已修改、已暂存、部分暂存),对比git status详细输出和git status -s简洁输出,理解状态标记的含义。

  3. 挑战题:编写一个脚本,解析git status -s的输出,统计各种状态的文件数量(未跟踪、已暂存、已修改等),用于自动化检查仓库状态。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏