.git
git文件夹（.git）
  COMMIT_EDITMSG
    是 Git 在你准备提交代码时使用的临时文件，用于编辑提交信息（commit message）。具体来说，当你执行 git commit 命令时，如果没有通过 -m 选项提供提交信息，Git 会打开一个文本编辑器，让你在 COMMIT_EDITMSG 文件中输入提交信息。提交信息是描述你这次提交内容的重要部分，有助于其他开发者（或未来的自己）理解你所做的更改。
  FETCH_HEAD
    记录最近一次 git fetch 操作的结果，包括远程分支的最新提交。
  HEAD
    git symbolic-ref HEAD
    git symbolic-ref HEAD refs/heads/test
  MERGE_RR
  ORIG_HEAD
    记录最近一次重置操作之前的状态，方便撤销重置操作。
  config
  description
  hooks
  index
  info
    ref
      一个文件，通常位于 Git 仓库的 .git 目录下，用于列出所有引用及其对应的 SHA-1 哈希值。
  logs
    HEAD
    refs
  objects
    blob
    tree object
      tree 甚至可以自引用
      实际上来自于 index 的快照，add 操作 = update-index
    commit
  packed-refs
  refs
    heads 只是 refs 的一种
    heads
      master
      develop
      hotfix
    remotes
    tags
      轻量标签
        git update-ref refs/tags/v1.0 cac0cab538b970a37ea1e769cbbde608743bc96d
      附注标签
        git tag -a v1.1 1a410efbd13591db07496601ebc7a059dd55cfe9 -m 'test tag'
    stash
    提交 hash + 名字升级成引用
头引用升级成分支
大写 HEAD 只是对 heads 里众多带名字引用的一个别名（symbolic reference）而已
  rr-cache
  这三种对象都只有 hash 没有名字
    生成 commit 的四个步骤
      git hash-object 写入 kv，生成一个带 hash 的 blob
      git update-index 更新 index 区域
      使用 git write-tree 得到 tree object
        这个树对象是不是存在 index里存疑，应该不在
      git commit-tree 得到一个 commit
      git add
      git commit
  更新引用的方式是 update-ref，所有非只读引用都可以被更新，不只是 heads。
但只有 heads 可以被 update-ref 更新。
更新引用的比较好的方式还是使用高层 API，如 reset、commit（revert、merge、rebbase、cherry-pick本质上还是 commit）