用了这么久的git
, 可以毫不谦虚地说对git
是一无所知. 每天用来用去的就是commit
, add
, merge
等几个有限的命令, 这不符合我这刨根问底的性格啊. 不行, 得研究研究, 从哪里下手呢? 别的咱先不说, 所有 git 项目都有这么一个文件夹.git
, 不如就从它入手 ? 那咱就看看这个文件夹下都有些什么妖魔鬼怪.
先来想一想, .git
文件夹下保存了git
仓库的所有信息, 那么就包括:
好, 来看一看都有些什么:
内容都在这了, 好, 那就对这些文件依次看一下吧.
先来说一下我目前对这个测试项目的操作.
; 创建文件提交
touch readme.md
git add readme.md
git commit -m 'add readme'
; 修改文件提交
echo test > readme.md
git add readme.md
git commit -m 'change readme'
; 创建分支
git checkout -b master_test
仅做了两次提交操作, 这是为了保持.git
文件夹最初的状态, 好方便查看.
此文件保存了最后一次commit
的信息. 没搞懂存这玩意有啥用, 我直接 git log
看不就行了么.
保存当前使用的分支.
另外, 直接修改这个文件, 就可以达到git checkout
命令的目的. (可以切换分支, 但是不能创建分支哦)
再另外, 从这个文件内容中, 可以推断出, refs
文件夹是用来保存分支信息的, 不过这个先记到小本本上, 接着往后看.
不用说, 看名字也知道, 是用来保存配置信息的.
我们加一条本地配置信息看一下: git config --local user.name 'git_test'
如果不出所料, 远程地址也保存在这里, 加一下: git remote add origin http://test.com/aa/bb
不多说了, 上图, 看文件描述是用来填写项目的描述信息的.
存放项目的各个钩子函数, 就是在各种操作的前后添加自己的执行逻辑. 这个之前倒是一直没有用过. 文件夹下有样例文件, 直接将.sample
后缀删除即可使用. (下面只列举了常用的几个, 并不是全部)
等等, 具体信息可到官网文档查看
可以看到, 此文件夹用来对工作流程进行自动化管理的.
用来保存本地暂存区中的内容. 二进制文件, 不可直接查看. 可通过命令: git ls-files --stage
来查看当前暂存区内容.
路径下目前只有一个文件: exclude
. 此文件用来在git
中忽略某些文件. 与.gitignore
不同的是, 此文件不会进行提交. 也就是用来忽略一些仅你本地使用的文件.
用来记录所有的操作记录. 看一下我本地这几个文件的内容.
HEAD
文件记录的是所有的操作, 而对应refs
文件夹下, 则记录的时候各个分支中的操作.
同时, 可以通过git reflog
命令来进行查看, 当出现误操作的时候, 通过git reset --hard {id}
来后悔.
这个文件保存的就是所有 git 历史变动了, 具体文件的保存结构就留待日后研究. 这里先不深究.
可通过git gc
来减少文件体积.
保存本地的分支和标签. 文件内容也很简单, 就是一个 commit id.
另外, gc
之后, 会多出来一个: .git/packed-refs
文件. 此文件包含refs
下的所有信息, 同时refs
下的文件会被清空.
用来保存远程分支信息
在执行如merge
, reset
, rebase
等操作时, 对 "HEAD"文件内容进行备份.
当使用sourcetree
对项目进行管理时, 用来保存sourcetree
中的配置信息.
将.git
文件夹下的内容过了一遍, 基本保存的位置都找到了, 剩下保存内容的二进制文件了还整不明白.
过下来之后, 倒也发现了一些能够帮到我的内容, 比如本地的 ignore, 之前的处理是在路径下添加.gitignore
同时将.gitignore
文件本身也忽略. 后面可以直接修改.git/info/exclude
这个文件.