基本概念
工作区:我的项目中本地文件被批改的区域。
暂存区:工作区中本地文件的改变通过 ”git add” 放入暂存区。
本地仓库:最初暂存区的批改通过 ”git commit” 放入本地仓库。
存储
暂存区:
- 通过 ”git add” 把工作区内容退出暂存区。
- 通过 ”ls -l .git/index” 看到.git/index 的更新工夫和大小都变了阐明该文件和暂存区无关。
- 间接关上.git/index 发现是乱码,因为是二进制内容。git 提供了 ”git ls-files” 显示暂存区的文件内容。
- 文件内容包含 40 位的字符(hash)和文件在我的项目中的门路,还是没有批改文件的具体内容。
- .git/objects 中能够找到.git/index 中 hash 对应的文件,同样间接关上是二进制。
- 通过 ”git cat-file -p hash” 查看具体的内容,展现了刚退出暂存区的文件内容。
本地仓库:
- 本地仓库最根本的是分支,分支上有提交,提交有提交信息,能追溯到上一次提交
- .git/HEAD 中存储着以后援用的分支文件的门路,指向了.git/refs/head 中的文件,文件内容是 40 的字符 hash, 正是 ”git log” 最近一次的 commitID
- 通过 ”git cat-file -t hash” 查看这个 hash 是个 commit。
- 同样通过 ”git cat-file -p hash” 查看 commit 对应的二进制文件,包含 tree、parent、author、commit 日志等。
- 这个 parent 正是 ”git log” 中以后 commit 的上一次 commit,这就是 commit 能链式追溯的起因。
- 而通过 ”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
常见利用:
- “git reset –hard HEAD”,把暂存区和开发区的更新都去掉。
- “git reset –soft commitID”,把间断几次的 commit 合并到一个。
- “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} 来执行。