刚工作使用SVN的时候,基本没有考虑过文件的状态,以为无非是检出、提交、撤回,对版本控制理解的不够深入,其实SVN和Git一样,也有add相关操作。
Git文件状态的转换
Git下每个文件状态分为4个阶段:
- 未追踪(Untracked):未加入Git索引时的状态
- 暂存(Staged):文件的变更已进入暂存区,此时可提交到库中
- 已修改(Modfied):文件相较于上一次已提交时已被修改
- 已提交(Unmodfied):稳定态,所有变更已提交
通俗来说,一般工作场景下如不考虑撤回的情况,文件是这样变化的:
- 工作目录中新建了一个文件(未追踪)
- 加到索引(暂存)
- 提交(已提交,版本1)、
- 再次修改了内容文件并保存(已修改)、
- 再加到索引(暂存)、
- 再提交(已提交,版本2)。
要点:要提交先暂存!一切提交是以暂存态的变化为准的,修改后未暂存的内容是无法被提交生效的。而一般Git的可视化工具、插件在提交操作前,都已经默认帮我们完成暂存了,用户没有感知
Git以文件内容计算校验和,来索引文件,校验和机制是SHA-1 散列。每个提交都有自己的SHA-1码
状态迁移简图如下:
如果以文件a.txt为例,带上实际的操作命令,则如下图:
简要对图进行说明:
- 新建文件后暂存并提交:路径:2->10
- 撤回新建文件后的暂存:路径:2->3
- 已提交后,文件修改,再次提交:路径:1->5->10
- 针对上次的提交,重新提交(想重新写提交log,但文件内容不变):路径:12
- 修改文件后想撤销本次修改:4
- 暂存文件后想撤销到修改状态:6
- 暂存文件后想撤销修改:6->4
- 多次修改但一直不暂存:7
- 已在版本中的文件需要剔除:8或9->10
- 11、13、14的情况较特殊:已暂存后不提交,又修改了文件,此时如果不再次执行暂存,后来修改的内容是不会提交到版本中的。如果此时撤回修改,即13,则回到修改前的暂存状态。但如果此时放弃暂存,文件会回到已修改状态,且文件的变更内容是两次修改内容的和(不好理解,比较乱,后面文章详细说明)。