写在前面:吃草学习总结,侵删,谢谢~
· 11 | 练习:数 tree 的个数:
· Question:新建的 Git 仓库,有且仅有 1 个 commit,仅包含 /doc/readme,有多少个 tree 和 blob?
· Answer:两个 tree 和一个 blob。
· 准备工作的注意点:
· 在目录中新建一个空文件夹,git 是不理会的,在里面添加文件后,git 才会管控
· 新建一个文件并写入内容的命令:echo "CONTENT" > FILE_NAME
· 查看文件夹下有无文件的命令:find .git/objects -type f,f 表示文件(file)
· 文件在工作区且还未添加至暂存区时,git 不会创建对象,但是加入至暂存区,就会创建一个 blob 对象
· 提交后,会生成四个对象(.git/objects 路径下生成四个文件),一个 commit,两个 tree,一个 blob
· 可以根据输出的哈希值查看对象的结构
· 记得哈希值的形成策略,去掉 /
· 12 | 分离头指针的注意事项:
· 分离头指针命令:git checkout COMMIT
· 分离过后继续产生 commit,不会影响其它分支
· 本质:工作在没有分支的情况下,由于产生的 commit 不和任何分支挂钩,所以一旦切换到某分支,分离时产生的 commit 将不会被保存
· 使用场景:做一些尝试性的变更
· vi 是修改了 style.css 文件
· git commit -am'DESCRIPTIONS’ 不推荐使用,因为直接跳过了暂存区
· 目前的 HEAD 没有指向任何一个分支,只是从一个 commit 分离了头指针
· 将分支切换至 master(或其它分支)时会有提示,若不关联(新建)分支就会丢失这个 commit(一次或多次 commit)
· gitk 中也确实看不到本例中 328c1ee 这次 commit
· 不与分支或 tag 绑定的 commit,Git 认为不重要,会被删除
· 此时新建一个分支,即将 commit 与分支绑定,gitk 中则会保留并显示此 commit
· 13 | 进一步理解 HEAD 和 branch:
· 一开始 HEAD 指向 master 分支,新建一个 fix_readme 分支后,HEAD 指向了新的分支,.git/HEAD 中也引用到 fix_readme 分支上
· git checkout -b NEW_BRANCH_NAME BRANCH_NAME/COMMIT(新建一个分支,可以基于某个分支,也可以基于某个 commit)
· gitk 中也能看出(黄点表示当前 HEAD 指向的地方)
· HEAD (指向的分支)最终还是会落脚于某个 commit:
· HEAD 的一些小技巧:
· 比较差异的命令:git diff COMMIT_ONE_HASH COMMIT_TWO_HASH
· HEAD 可表示当前 HEAD 指向的 commit,HEAD~1,HEAD^,HEAD^1 都可用以表示 HEAD 的 Parent
· HEAD 的 Parent 的 Parent 可以使用 HEAD^^,HEAD~2,HEAD~1^1,HEAD^1~1 表示
· ^ 与 ~ 都表示父节点,跟随数字时,^2 表示第二个父节点,~2 表示父节点的父节点(个人认为区别不大)