github 进阶说明

github 进阶说明

前言

咱们能够什么都无论,照搬命令来完成咱们大部分git工做,可是若是想要进一步,就要深刻理解git的实现原理,和底层机制。github

三个目录树

  1. HEAD 仓库指针
  2. index file 暂存区
  3. Working Directory 工做目录

默认状况,头指针会指向当前分支,当前分支指向当前目录树。所谓目录树简而言之就是一个commit对象,保存了某个提交时刻的工做目录内容的镜像。而工做目录就是当前文件内容。bash

状态一:初始状况是三者相同。
状态二:当你编辑了工做目录下的内容,工做目录和暂存区就不一样。git status会提示你git add相关文件。
状态三:git add 以后,暂存区和仓库又不相同了,git status 提示你git commit,当你git commit以后,回到状态一,仓库就增长了一个新的版本,当前分支指针移动到新版本之上。服务器

周而复始。ui

重置 git reset

但总有须要重置的时候:指针

git reset移动当前分支指针(即间接改变HEAD)。code

手段一:git reset --soft HEAD~移动HEAD指针到HEAD~,这时仓库和暂存区不一样,暂存区和工做目录相同,即状态三。简而言之,就是“撤销”了上次的提交。对象

手段二:git reset --mixed HEAD~ 移动HEAD指针到HEAD~,并重置暂存区。这时仓库和暂存区相同,工做区和暂存区不一样,即进入状态二。--mixed是默认参数。索引

手段三:git reset --hard HEAD~ 移动HEAD指针到HEAD~,并重置暂存区和工做区到当前HEAD版本。即状态一。这是一条危险操做,由于你可能会丢失当前正在编辑而没提交的全部内容。但这条命令也是真正彻底的实现了跳跃版本,不会残留任何一点当前版本的信息。ip

增长路径的reset

reset能够增长路径,这时的表现就是重置某个文件而已。并不会改动HEAD指针

git reset -- file.txt 重置暂存区file.txt文件状态。简而言之,就是git add的反向操做。

你还能指定暂存区重置到哪一个版本git reset 234b file.txt

检出 checkout

checkout和reset命令很类似,也是操控三个目录树。差异是checkout 改变HEAD自己,reset是改变当前被HEAD指向的分支。务必理解这个二重指针的结构。

好比HEAD 指向master,reset 会改变master,HEAD不变。而checkout 会直接改变HEAD,master不变。虽然表面现象上来讲不少时候表现是差很少的,由于当前用户可能只会观察到三棵树的变化,而没有留意指针的变化。

git checkout develop 从master分支切换到develop分支,并重置工做区和暂存区,进入状态一。

带路径的checkout

相似带路径的reset,并不会改变HEAD,不一样点它重置暂存区,同时也重置工做区。

git checkout -- file.txt 用当前HEAD指向的目录树中的file.txt镜像重置暂存区和工做区。

仓库

  1. 纯仓库。git init --bare 建立一个纯仓库,只是用来存储仓库数据而不是用来工做的。好比用来作服务器远端仓库,本地仓库的备份。
  2. 空仓库。git init 建立一个空仓库

仓库内容:ls -F1 .git

branches/      #分支
COMMIT_EDITMSG
COMMIT_EDITMSG.save
config      #设置
description  #GitWeb使用
FETCH_HEAD
gitk.cache
HEAD #头指针
hooks/ #钩子
index #暂存区
info/ #全局排除模式,相似.gitignore
logs/
objects/ #数据
ORIG_HEAD
refs/ #各类commit 指针

数据对象

  1. git hash-object 任何对象均可以用哈希值加入仓库索引
  2. git cat-file 用哈希值搜索仓库内对象
  3. git update-index --add --cachinfo 100644 更新暂存区对象
  4. git write-tree 将暂存区写入树对象
  5. git read-tree --prefix=dir 加入子树,前缀dir
  6. git commit-tree c03ca4 用树对象生成提交对象
  7. git log --stat 查看提交对象历史信息
  8. git fsck --full 查看没有引用的对象
  9. git gc 压缩对象库
  10. git count-objects -v 查看空间暂用统计
  11. git prune --expire now 当即清除全部不被引用的对象(由于试验,生成了错误的对象,可是要清理很是很是麻烦,最后靠这条命令成功清理了)
  12. git reflog expire --expire-unreachable=0 --all 清理操做记录,这是对象有可能被引用的地方

其余

  1. git config core.autocrlf true 自动转换换行格式。

资料

git社区参考书:http://gitbook.liuhui998.com/

相关文章
相关标签/搜索