1. untracked 和 tracked 状态
Remember that each file in your working directory can be in one of two states: tracked or untracked. Tracked files are files that were in the last snapshot, as well as any newly staged files; they can be unmodified, modified, or staged. In short, tracked files are files that Git knows about.
对于一个本地的 git 仓库, 里面的文件无非是两种状态:tracked 和 untracked。 tracked 意思是被跟踪中, 是说在上一次 snapshot(快照)中已经出现了,当然它现在也可以被 stage。
对于 snapshot 的概念, pro git 在目前的章节还没有明确给出解释, gpt 给出的解释是:
当你进行一次提交时, git 会生成一个新的 commit 对象,记录当前项目的完整状态(快照)。每个提交都会保存一个新的项目状态, 而不是只保存变更。
换言之,有几个 commit 就可以认为有几个快照,下图有5次commit,有5个快照:
2. tracked 状态的细分
对于已经处于 tracked 状态的文件, 又可以细分为:
- unmodifled: checkout 出来后,文件没有被修改过
- modifed:checkout 出来后,修改了文件、但是没有执行
git add
- staged: checkout 出来后、修改了文件、并且执行了
git add
3. 检查文件当前状态
git status
# 或
git status -s
使用 git status
命令查询文件状态。 默认是按 long
格式输出,也就是给出比较容易让人读懂的提示。
也可以使用 git status -s
命令, 意思是以简短的形式来表达文件的状态。
4. git status -s
解读
git help status --web
给出了完整文档,里面写到:
也就是说, 每个文件的状态的short格式,通常由 XY PATH
来表述, PATH 是文件路径,XY
则根据不同情况有不同解释:
- 当出现merge并且merge是成功的,或者merge之外的情况下,X表示index的状态,Y表示working tree的状态
- 当出现merge冲突并且尚未解决,X和Y分别表示merge的每个head相对于公共祖先节点的变更
- 当文件是 untracked 状态时,X和Y总是相同的,因为它们没有被记录在 index 中,因此只显示
??
.
对于 tracking 状态的文件,使用如下字母来表示X和Y具体取值:
- ‘’ unmodifled
- M modified
- T 文件类型变了
- A 添加的
- D 删除了的
- R 重命名了的
- C 拷贝了的
- U 更新了但是没有被merge
5. gitk 中的文件状态
gitk 界面虽然不如 fork 那样好看,但是,git status
显示出的文件状态的变化,在 gitk 里面都是能看到的. 换言之, git status
+ git diff
+ git diff --cached
三个命令组合的得到的结果, 在 gitk 中用鼠标点选一下就能查看。
已经添加到索引但未提交的修改,相当于 git diff --cached
:
未添加到索引且未提交的修改:相当于 git diff
的结果:
这两种情况下, gitk 中的 sha1 都提示为 00000…00 (全0)。