基本概念

工作区:我的项目中本地文件被批改的区域。
暂存区:工作区中本地文件的改变通过"git add"放入暂存区。
本地仓库:最初暂存区的批改通过"git commit"放入本地仓库。

存储

暂存区:

  1. 通过"git add"把工作区内容退出暂存区。
  2. 通过"ls -l .git/index"看到.git/index的更新工夫和大小都变了阐明该文件和暂存区无关。
  3. 间接关上.git/index发现是乱码,因为是二进制内容。git提供了"git ls-files"显示暂存区的文件内容。
  4. 文件内容包含40位的字符(hash)和文件在我的项目中的门路,还是没有批改文件的具体内容。
  5. .git/objects中能够找到.git/index中hash对应的文件,同样间接关上是二进制。
  6. 通过"git cat-file -p hash"查看具体的内容,展现了刚退出暂存区的文件内容。

本地仓库:

  1. 本地仓库最根本的是分支,分支上有提交,提交有提交信息,能追溯到上一次提交
  2. .git/HEAD中存储着以后援用的分支文件的门路,指向了.git/refs/head中的文件,文件内容是40的字符hash,正是"git log"最近一次的commitID
  3. 通过"git cat-file -t hash"查看这个hash是个commit。
  4. 同样通过"git cat-file -p hash"查看commit对应的二进制文件,包含tree、parent、author、commit日志等。
  5. 这个parent正是"git log"中以后commit的上一次commit,这就是commit能链式追溯的起因。
  6. 而通过"git cat-file -p hash"查看tree,内容就是蕴含本次批改的文件的门路和hash列表,具体的文件内容能够在.git/objects的文件中找到。

思考:
暂存区的意义:一个是通过"git add -i"让开发区的局部文件增加到开发区,另一个是git merge过程中没抵触的文件合并文件间接增加到暂存区。

reset

git reset --hard | --mixed | --soft commitID

--hard 把开发区、暂存区、本地仓库都还原到某个commit
--mixed 把暂存区、本地仓库还原到某个commit
--soft 把本地仓库还原到某个commit
常见利用:

  1. "git reset --hard HEAD",把暂存区和开发区的更新都去掉。
  2. "git reset --soft commitID",把间断几次的commit合并到一个。
  3. "git reset --mixed HEAD filename",用本地仓库的最近提交的某个文件还原暂存区,相当于"git checkout filename"把增加到暂存区的某个文件撤销。

本地仓库被重置记录在.git/refs/head/master中,默认是最近提交,.git/refs/head/master是commit链的终点。有时commit在"git log"中找不到了,能够查看"git reflog",而这个操作查看的.git/logs/HEAD,对reflog中的操作能够通过head@{n}来执行。

checkout