首先要了解的是,所有新创建或添加到工作目录(working dirctory)的文件,都是未被跟踪的,也就是说此时Git认为他们并不是自己所管理的文件
我们在Git仓库中新建一个文件,然后使用 git status
命令,可以要确定哪些文件当前处于什么状态。
可以看到此时新建文件并没有被Git追踪(Untracked)
git add fileName
我们需要使用以上命令将文件添加到Git的暂存区(staging area),这时候文件就开始被Git追踪,也就是说文件以后的变化会被Git发现并指出,文件也就可以被保存到Git版本库中(以快照的形式)。
可以看到此时新建的文件已经被追踪(未被提交状态)
也就是说,git add
命令将文件添加进了暂存区后,文件就已经被Git追踪了。
已经被Git追踪的文件,我们就可以查看它在Git内部的状态
可以看到我新建了文件newFile2
,然后使用git add
命令将其添加进暂存区,此时Git已经对其开始追踪,然后再使用git status
查看文件状态,发现它处于修改(modified)状态。
使用git status
命令查看文件状态,发现有修改后没有存入暂存区的文件(也就是说工作目录和暂存区存在不一致文件)
我们可以使用git add fileName
将更新后的文件添加进暂存区
现在的暂存区域已经准备妥当可以提交了。在此之前,请一定要确认还有什么修改过的或新建的文件还没有 git add
过,否则提交的时候不会记录这些还没暂存起来的变化。所以,每次准备提交前,先用 git status
看下,是不是都已暂存起来了,然后再运行提交命令 git commit
:
$ git commit
这种方式会启动文本编辑器以便输入本次提交的说明。默认会启用 shell
的环境变量 $EDITOR
所指定的软件,一般都是 vim 或 emacs。
可以看到,默认的提交消息包含最后一次运行 git status
的输出,放在注释行里,另外开头还有一空行,供你输入提交说明。你完全可以去掉这些注释行,不过留着也没关系,多少能帮你回想起这次更新的内容有哪些。(如果觉得这还不够,可以用 -v 选项将修改差异的每一行都包含到注释中来。)退出编辑器时,Git 会丢掉注释行,将说明内容和本次更新提交到仓库。
另外也可以用 -m
参数后跟提交说明的方式,在一行命令中提交更新:
记住,提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。
使用git commit
命令以后,Git就会把暂存区的文件全部提交到Git版本仓库(Repository)
我们使用:
git log
可以查看commit
以后的版本更新信息
可以看到commit -m
的信息被记录下来,其中包括版本快照的校验和,发布者信息和提交更新的时间。
最后我想补充一下Git中快照存储模型(看不懂也没关系,不影响Git的使用)
当使用 git commit
新建一个提交对象前,Git 会先计算每一个子目录(本例中就是项目根目录)的校验和,然后在 Git 仓库中将这些目录保存为树(tree)对象。之后 Git 创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。
我们在 git log
中看到的e27……就是指向树对象(tree)的一个版本快照对象(commit)的校验和,而版本中每个文件(目录)也会被记录成一个blob对象,然后树对象(tree)的指针指向这些对象,实现文件的快照存储。