深入了解Git

git基本命令还可以参考Pro Git;
以下是mac系统终端操作,常用命令可以参考http://www.jianshu.com/p/3291de46f3ff

** 附上方便操作的终端快捷键**

Command + K 清屏
Command + T 新建标签
Command +W 关闭当前标签页
Command + S 保存终端输出
Command + D 垂直分隔当前标签页
Command + Shift + D 水平分隔当前标签页
Command + shift + {或}向左/向右切换标签

git基本操作流程

  1. 创建测试文件夹,名字我命名为JHGit;
mkdir JHGit
目录下的文件

2.切换到JHGit文件夹下

cd JHGit

3.初始化git

git init
初始化后的文件夹目录

4.先查看下.git文件内容

vi .git   //或者  
cd .git
vim编辑器下的内容

也可以使用tree命令!
温馨提示:mac下默认是没有 tree命令!!!
下面几个方法可以试试

1.可以使用find命令模拟出tree命令的效果

find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'

2.手动alias一下,在你的.bash_profile或者.zshrc中添加:(前提你已经安装了oh-my-zash)

alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"

3.可以使用 homebrew 安装 tree 命令行:

brew install tree
Paste_Image.png

5.HEAD

当前所在分支

6.查看下config里面的东西:设置了一些默认的参数之类的

cat .git/config
config

7.description是描述文件

对当前库的描述

8.根据HEAD打印的路径提示找到refs/heads/下

HEAD路径

9.hooks(脚本文件夹),具体了解可以参考GIt Hooks

Paste_Image.png

10.info里面的exclude objects里面的info和pack目前都是空文件

11.和远程仓库建议联系

 git remote add origin https://github.com/Shenjinghao/JHGit

** 注意:连接简历后,可以正常git pull代码,但是如果不做修改,是无法git push提交代码,原因是此时的master的分支不指向任何commit。**

其实这里也可以通过git clone命令跳过和远程仓库连接这一步!

git clone https://github.com/Shenjinghao/JHGit.git

连接后config内容变为下图


连接后的config内容

12.使用touch命令创建个test1文件,工作区会提示,通过命令

git add test1

将test1添加到暂存区,也可以跳过add阶段,既跳过使用暂存区域,直接把已经跟踪的文件暂存起来一起提交。

git commit -am“xx”  ||   git commit -a -m“xx”
创建commit
添加暂存区
提交commit

然后此时的.git变化如下

变化后的.git
变化的.git

使用log命令可以看到最近的log日志

git log
git log
.git的新增内容
对应关系

从上面几幅图可以看出,提交的commit消息,最新的commit id和origin的commit id都会被保存

下面引入git的主要工作方式

三个区域
  • 工作区
  • 暂存区
  • git仓库
Three Sections
四种状态

已跟踪(tracked)已提交(commited) 已修改(modified) 已缓存(staged)

  • 在工作目录中修改某些文件

  • 对修改的文件做快照,并保存到暂存区

  • 提交更新,将保存在暂存区的文件快照储存到git目录中

  • changed but not updated:已跟踪文件内容发生改变,并没有放入缓存区

  • Changes to be committed:已存入缓存状态

  • Untracked files: git 不会自动将之纳入跟踪范围

Four States

git 原理工作图





暂存区index

index文件是个二进制文件,用cat命令是无法打开的

index 一堆乱码

使用

hexdump -C index 
index内部数据

具体数据代表的意义可以参考git index data format

总结

先打印log

git log

通过命令

git cat-file -p <commit id>
git cat-file

通过以上数据可以发现git所有功能都基于三棵树。
  • 第一棵树:所有提交的commit组成一棵树,分别指向不同版本的提交
  • 第二棵树:每个commit代表一棵树,里面包含所有指向子树的commit(tree),指向上一次的commit id(parent),每个tree里面有包含下一级的tree,blob文件的快照。
  • 第三课树:index暂存区

综上所述,git的实现都是通过比较遮三棵树而进行工作的。

References

  1. Git 官方文档
  2. Git man page
  3. A Little Of Git's Internals
  4. sed编辑二进制文件
  5. git index data format
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 以下笔记主要参考gitgot,大致了解git使用和原理。 第一部分我们从个人的视角去研究如何用好Git,并且揭示G...
    carolwhite阅读 7,036评论 0 1
  • 今天阅读了30分钟卡耐基的人性的弱点,相信很多人都读过。正如书中所说,人际交往或许是人类面临的最大问题。 现如今,...
    书眠阅读 1,274评论 1 1
  • 歌曲唱的 狂欢是一群人的孤单 每个人都是以单独的个体存在的 所以或多或少的都会感到孤单。 前段时间我22岁生日 有...
    一个人远航阅读 3,887评论 1 7
  • 玩微信这么久,也累积了不少好友,有一批人什么时候都能聊得起来,也有一批人寡言少语不怎么联系,人和人的感情,靠的不是...
    一点都不酷_67a1阅读 3,746评论 0 0