一、文件状态的生命周期
Git 将工作目录中的每个文件分为两种状态:
Untracked(未跟踪):未纳入上一次提交,也未加入暂存区。
Tracked(已跟踪):已纳入上一次提交或已通过
git add
加入暂存区,可处于:- Modified(已修改):工作目录中有改动,但尚未暂存。
- Staged(已暂存):改动已加入暂存区,准备提交。
Untracked → git add → Staged → git commit → Tracked & Unmodified
Tracked & Unmodified → 编辑 → Tracked & Modified → git add → Staged → git commit …
二、检查文件状态:git status
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
- Untracked files:未跟踪的新文件
- Changes not staged for commit:已跟踪文件的改动,未暂存
- Changes to be committed:已暂存,等待提交
简洁模式:
$ git status -s
M README.md # 已暂存修改(左列 M),工作区未变更(右列空格)
M main.go # 工作区已修改(右列 M),未暂存
?? temp.log # 新文件,未跟踪
三、跟踪新文件:git add
新建文件后,Git 默认不跟踪,需手动加入暂存区:
$ echo '项目说明' > README.md
$ git status
Untracked files:
README.md
$ git add README.md
$ git status
Changes to be committed:
new file: README.md
git add <路径>
:文件或目录均可,目录会递归添加所有内容。- 每次
git add
,Git 会将当时文件的完整快照存入暂存区。
四、暂存已修改文件
编辑已跟踪文件后,状态变为“未暂存”:
$ vim CONTRIBUTING.md
$ git status
Changes not staged for commit:
modified: CONTRIBUTING.md
再次执行 git add
即可将最新改动暂存:
$ git add CONTRIBUTING.md
$ git status
Changes to be committed:
modified: CONTRIBUTING.md
注意:若在
git add
后继续编辑,暂存区仍保留上次版本,需重新执行git add
。
五、提交改动:git commit
确认暂存区内容无误后提交:
# 交互式输入提交信息
$ git commit
# 或直接指定
$ git commit -m "新增 README.md 并更新贡献指南"
- 提交后生成唯一 SHA-1 校验值。
- 未暂存的改动不会包含在本次提交中。
5.1 跳过暂存区
若只需提交所有已跟踪文件的改动,无需手动 git add
,可用:
$ git commit -a -m "更新所有已跟踪文件"
警告:
-a
仅针对已跟踪文件,新文件仍需git add
。
六、忽略不必要的文件:.gitignore
在项目根目录创建 .gitignore
,列出无需纳入版本库的文件/目录模式:
# 忽略编译产物
*.[oa]
# 忽略编辑器临时文件
*~
# 忽略构建目录
build/
# 但保留 lib.a
!lib.a
- 支持通配符
*
、?
、字符集[abc]
、递归匹配**
。 - 可在子目录添加独立
.gitignore
,仅对本目录及子目录生效。
七、查看差异:git diff
- 未暂存改动:
git diff
- 已暂存改动:
git diff --staged
(或--cached
)
$ git diff CONTRIBUTING.md # 未暂存部分
$ git diff --staged README.md # 已暂存部分
想用可视化工具查看差异,可执行:
$ git difftool
八、删除与重命名文件
8.1 删除文件
# 删除并暂存
$ git rm obsolete.txt
# 仅取消跟踪,保留工作区
$ git rm --cached temp.log
8.2 重命名/移动文件
# 推荐
$ git mv old.txt new.txt
# 等价于
$ mv old.txt new.txt && git rm old.txt && git add new.txt
Git 会在后续合并和比较时智能检测重命名。
九、实践建议
- 频繁提交:保持小颗粒度的提交,便于回溯与审查。
- 合理摘取:利用暂存区,分组提交相关改动,保持提交日志清晰。
- 撰写规范:提交信息应包含“动词+目的”,并简要说明为何改动。
- 监控状态:提交前务必
git status
、git diff
,确保无漏网改动。
结语
本文全面覆盖了 Git 提交流程中「状态检查 → 跟踪/暂存 → 提交」的各个环节,并辅以跳过暂存区、忽略文件、查看差异、文件删除与重命名等实用操作。掌握这些基础命令后,您即可更高效地管理版本历史、规范团队协作,也为后续深入学习分支管理与冲突解决打下坚实基础。下一篇,我们将带您探索 Git 分支模型与多分支协作实战。