(三)工作目录、暂存区与提交快照
1. 建立第一次提交
先运行程序,再选择要保存的文件。starter 同时提供 .gitignore 和 .gitattributes,分别约定忽略的文件与文本格式,第五节会结合实际差异展开:
# 本章使用前文已经选定的 Python 3.12 环境。
python reading.py
python check_reading.py
# 显式选择程序和文档;-- 后面按路径解释参数。
git add -- reading.py check_reading.py README.md .gitignore .gitattributes
git diff --cached
git commit -m "保存阅读统计程序和检查"
git log --oneline -1
程序输出 2,检查输出 阅读统计检查通过。-m 后面的文字是提交说明。第一次提交记录一份选定文件的快照、作者、说明和提交关系;终端显示的短哈希用于识别它。下面用 A 表示这个提交,图里的字母是便于跟踪的标记,实际操作使用 Git 显示的哈希或分支名。
git status --short 用两列表示变化:第一列比较暂存区与当前提交,第二列比较工作目录与暂存区。?? 表示还没有被跟踪的新文件。
| 显示 | 当前文件状态 |
|---|---|
M README.md |
只有工作目录比暂存区有修改 |
M README.md |
修改已暂存,工作目录与暂存区一致 |
MM README.md |
暂存后又编辑过,两个位置保存了不同修改 |
A notes.md |
新文件已经暂存 |
2. 暂存之后再次编辑
把 README 的 30 改成 35,保存并暂存;随后又把同一处改成 40,只保存文件:
# README 已从 30 改为 35 并保存,此时把 35 的版本放进暂存区。
git add -- README.md
# 再在编辑器中把 35 改为 40 并保存,然后分别查看两个差异。
git status --short
git diff -- README.md
git diff --cached -- README.md
此时显示 MM README.md。git diff 显示工作目录中的 35 → 40;git diff --cached 显示提交 A 到暂存区的 30 → 35。直接 commit 会保存 35,因为 commit 使用暂存区,不会自动重新读取编辑器里的 40。Git 的暂存过程
这次实际想保存 35。下面从暂存区恢复工作目录中的 README,40 的这次编辑被替换,再提交已经暂存的修改:
# 把工作目录中的 README 恢复成暂存区的 35,暂存区本身不变。
git restore --worktree -- README.md
git diff --cached -- README.md
git commit -m "把默认目标说明修正为35分钟"
得到提交 B:README 与程序中的目标一致。提交之后 git status 应显示干净,含义是已跟踪文件没有待暂存或待提交的变化,不代表代码已经通过所有测试。restore 的来源与目标