Git暂存区
git log查看提交日志,--stat参数可以看到每次提交的文件变更统计:
$ cd /d/GitRoot/workspace/demo
$ git log --stat
查看修改后的文件与版本库中的文件(实际比较的是一个中间状态的文件)的差异:
$ git diff
显示精简格式的状态输出:
$ git status -s
对修改的文件执行git add命令,将修改的文件添加到“提交任务”中才能提交。
$ echo "Nice to meet you." >> welcome.txt
$ git diff #查看刚修改的文件与原的差异
$ git commit -m "Append a nice line." #提交不成功
$ git log --pretty=oneline
$ git status -s
$ git add welcome.txt #需要先进行这一步才能提交成功
此时与HEAD(当前版本库的头指针)或master(当前工作分支)进行比较,就会发现差异:
$ git diff HEAD # git diff master
在使用git add前的git status -s命令输出的M位于第二列,含义是:工作区当前的文件与中间状态中(提交暂存区)的
文件相比有改动。在git add之后使用git status -s命令输出的M位于第一列,含义是:版本库中的文件~~~
此时若执行命令:
$ echo "Bye" >> welcome.txt
$ git status #or git status -s 输出会有两个M
#Git状态输出的含义是:版本库中最新提交的文件与处于中间状态的提交暂存区(因为还没有commit)中的文件相比有改动,
并且工作区当前的文件与提交暂存区中的文件相比也有改动。
不带参数的git diff显示工作区与提交暂存区的最新差异,git diff HEAD会看到更多差异。
查看提交暂存区和版本库中文件的差异:
$ git diff --cached #or git diff --staged
好啦,提交:
$ git commit -m "which version checked in?"
如何证明提交成功:
1) $ git log --pretty=oneline #或
2) $ git status -s #第一个绿色的M被提交了,所以只剩下第二个红色的M
查看被提交的welcome.txt是哪个版本:
$ git diff # or git diff HEAD #会在最后提交添加的字符前显示+
撤销工作区中welcom.txt尚未提交的修改:
$ git checkout -- welcome.txt
查看.git/index文件时间信息:
ls --full-time .git/index
git status/git diff命令会查看.git/index中的时间戳、长度等判断工作区文件是否改变,若改变了,
若改变了,将该文件新的时间戳记录到.git/index中,高效!
.git/index是一个包含文件索引的目录树,记录了文件名及其状态信息,文件内容存在Git对象库.git/objects目录中,
文件索引建立了文件和对象库中对象实体间的对应。
重点:
* 当对工作区中被修改的文件执行git add时,暂存区中的目录将被更新,同时工作区被修改的文件内容会被写入到对象库中的
一个新的对象中,新对象的ID被记录在暂存区的文件索引中。
* git commit时,暂存区的目录树会写到版本库(对象库)中,master分支会做相应更新,即master最新指向的目录树就是
提交时原暂存区的目录树
* git reset HEAD时,暂存区的目录树会被重写,会被master分支指向的目录树替换,但是工作区不受影响。
* git rm --cashed <file>或git checkout -- <file>时,会用暂存区全部的文件或指定的文件替换工作区的文件!!
* git checkout HEAD或git checkout HEAD <file>会用HEAD指向的master分支中的全部或相应文件替换暂存区和工作区中的文件。
当进行提交时,实际上是将暂存区的内容提交到版本库中。。。