Git学习笔记——2、文件状态

刚工作使用SVN的时候,基本没有考虑过文件的状态,以为无非是检出、提交、撤回,对版本控制理解的不够深入,其实SVN和Git一样,也有add相关操作。

Git文件状态的转换

Git下每个文件状态分为4个阶段:

  1. 未追踪(Untracked):未加入Git索引时的状态
  2. 暂存(Staged):文件的变更已进入暂存区,此时可提交到库中
  3. 已修改(Modfied):文件相较于上一次已提交时已被修改
  4. 已提交(Unmodfied):稳定态,所有变更已提交

通俗来说,一般工作场景下如不考虑撤回的情况,文件是这样变化的:

  1. 工作目录中新建了一个文件(未追踪)
  2. 加到索引(暂存)
  3. 提交(已提交,版本1)、
  4. 再次修改了内容文件并保存(已修改)、
  5. 再加到索引(暂存)、
  6. 再提交(已提交,版本2)。

要点:要提交先暂存!一切提交是以暂存态的变化为准的,修改后未暂存的内容是无法被提交生效的。而一般Git的可视化工具、插件在提交操作前,都已经默认帮我们完成暂存了,用户没有感知

Git以文件内容计算校验和,来索引文件,校验和机制是SHA-1 散列。每个提交都有自己的SHA-1码

状态迁移简图如下:
Git学习笔记——2、文件状态
如果以文件a.txt为例,带上实际的操作命令,则如下图:
Git学习笔记——2、文件状态
简要对图进行说明:

  • 新建文件后暂存并提交:路径:2->10
  • 撤回新建文件后的暂存:路径:2->3
  • 已提交后,文件修改,再次提交:路径:1->5->10
  • 针对上次的提交,重新提交(想重新写提交log,但文件内容不变):路径:12
  • 修改文件后想撤销本次修改:4
  • 暂存文件后想撤销到修改状态:6
  • 暂存文件后想撤销修改:6->4
  • 多次修改但一直不暂存:7
  • 已在版本中的文件需要剔除:8或9->10
  • 11、13、14的情况较特殊:已暂存后不提交,又修改了文件,此时如果不再次执行暂存,后来修改的内容是不会提交到版本中的。如果此时撤回修改,即13,则回到修改前的暂存状态。但如果此时放弃暂存,文件会回到已修改状态,且文件的变更内容是两次修改内容的和(不好理解,比较乱,后面文章详细说明)。