git基本操作深入

基本概念
工作区:项目中本地文件被修改的区域。
暂存区:工作区中本地文件的改动通过"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基本操作深入】思考:
暂存区的意义:一个是通过"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

    推荐阅读