github 进阶说明

前言

我们可以什么都不管,照搬命令来完成我们大部分git工作,但是如果想要进一步,就要深入理解git的实现原理,和底层机制。

三个目录树

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

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

状态一:初始情况是三者相同。

状态二:当你编辑了工作目录下的内容,工作目录和暂存区就不同。git status会提示你git add相关文件。

状态三:git add 之后,暂存区和仓库又不相同了,git status 提示你git commit,当你git commit之后,回到状态一,仓库就增加了一个新的版本,当前分支指针移动到新版本之上。

周而复始。

重置 git reset

但总有需要重置的时候:

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

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

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

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

增加路径的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/

github 进阶说明的更多相关文章

  1. GitHub进阶之利用Git远程仓库篇

    #在上一篇文章,相信大家对GitHub已经有了一个基础的理解 接下来我们来学习一下如何利用git来远程仓库 一,git是什么 git:一个免费的开源版本控制软件 用途:利用Git管理GitHub上的代 ...

  2. 搜刮一些开源项目的APP

    iOS完整App资源收集 <iOS完整app资源收集>  <GitHub 上有哪些完整的 iOS-App 源码值得参考?> <GitHub 上有哪些完整的 iOS-App ...

  3. github+hexo搭建自己的博客网站(六)进阶配置(搜索引擎收录,优化你的url)

    详细的可以查看hexo博客的演示:https://saucxs.github.io/ 绑定了域名: http://www.chengxinsong.cn hexo+github博客网站源码(可以clo ...

  4. 服务端技术进阶(八)GitHub入门篇

    服务端技术进阶(八)GitHub入门篇 前言 在投递简历的过程中,发现有的公司会要求填写自己的GitHub地址,而自己却还没有GitHub帐号,准确点说是自己还不太会使用GitHub.(貌似开源社区中 ...

  5. 使用Hexo+Github搭建属于自己的博客(进阶)

    主题的配置:这里以NexT主题作为题材 1.安装NexT,在其文件夹中鼠标右键,点击Git Base Here.输入命令:git clone https://github.com/iissnan/he ...

  6. 从0开始学习 GITHUB 系列之「GIT 进阶」【转】

    本文转载自:http://stormzhang.com/github/2016/06/16/learn-github-from-zero5/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...

  7. 转 从红帽、GitHub和Docker看开源商业模式的进阶

    从红帽.GitHub和Docker看开源商业模式的进阶 发表于2014-12-16 10:26| 7594次阅读| 来源http://stratechery.com/| 0 条评论| 作者Ben Th ...

  8. 从0开始学习 GitHub 系列之「05.Git 进阶」

    关于 Git 相信大家看了之前一系列的文章已经初步会使用了, 但是关于Git还有很多知识与技巧是你不知道的,今天就来给大家介绍下一些 Git 进阶的知识. 1. 用户名和邮箱 我们知道我们进行的每一次 ...

  9. OkHttp使用进阶 译自OkHttp Github官方教程

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/3997368.html 没有使用过OkHttp的,可以先看Ok ...

随机推荐

  1. JVM配置参数详解(目前不够完善)

    最近看了有关虚拟机的书籍,发现有很多虚拟机配置参数不知道,特来记录一下, -XX: MaxDirectMemorySize--->设置直接内存,不设置与Java堆内存最大值一致 -XX:Perm ...

  2. Vlan 原理

    VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN所指的LAN特指使用路由 ...

  3. 为什么我离开Mac for Windows:苹果已经放弃了[译]

    为什么我离开Mac for Windows:苹果已经放弃了[译] 如果你问任何知道我的人,我可能是他们知道的最大的苹果粉丝.要求提供什么电脑可以获得的建议,我几乎肯定会告诉你MacBook Pro,还 ...

  4. windows远程桌面到linux

    centos:  http://lovesoo.org/xmanager-to-connect-to-the-remote-desktop-centos.html redhat:  http://ww ...

  5. CentOS-7修改主机名

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=589 方法一(修改静态主机名): vi /etc/hostname 注:由于静态主机名是系统初始化时从/etc/ho ...

  6. Ubuntu 18.04 on Windows 10 更改 Oh-My-Zsh agnoster 主题下的目录背景色

    题外话 我的 MacBook Pro 已经使用了6年多的时间,尽管作为一个 .NET 程序员绝大部分时间都是在 Windows 下工作,直到 .NET Core 的逐步成熟.要说 Mac OS,最满意 ...

  7. bootgrid

    编写bootgrid前提条件  有关bootgrid的.css和.js库文件 参数:ajax:   必须设置为true  post:   传递给Java的参数  url:   与java连接的方法名  ...

  8. jmeter利用自身代理录制电脑脚本(一)

    在利用代理录制脚本时一定要安装java jdk,不然不能录制的. 没有安装过java jdk安装jmeter后打开时会提示安装jdk,但是mac系统中直接打开提示安装jdk页面后下载的java并不是j ...

  9. 译MassTransit 消息契约

    消息契约 在MassTransit中,使用.NET .NET系统定义消息契约.消息可以使用类和接口来定义,但是,建议类型使用只读属性而不使用行为. 注意:强烈建议使用消息接口的接口,基于多年的经验,具 ...

  10. transform-origin

    transform-origin:改变原点中心位置 transform-origin是变形原点,也就是该元素围绕着那个点变形或旋转,transform-origin并不是transform中的属性值, ...