git学习记录(一)——git工作原理


随着对git不断使用,逐步进行学习和理解,现把学习整理成一系列基础内容,供大家参考和讨论。主要包括:
1、git工作原理
2、开展git项目
3、多人合作git操作(代码拉取,回滚和撤销,合并代码)
4、其他一些辅助工具

本节对git的工作原理进行介绍:

一、git是什么

1、git是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。 ——维基百科

2、从定义可知:

  • 功能:版本控制
    • 项目开发时,进行代码多版本管理
      eg:多版本分支,代码共享,提示冲突等
    • 一些场景下,将版本回溯到之前某个时间点的版本
      eg:代码回滚等
  • 特点:分布式
    • 每个客户端代码可以提交到本地仓库,并可本地查看提交历史记录
    • 提交远程服务器端不是必须的(与svn区别)

3、优点:

  • 免费,开源
  • 速度更快:一切的操作基本上在本地上完成
  • 分布式:服务器异常后,可继续工作

二、工作原理:

1、工作原理图,来自此处

2、工作原理图简介:
1)有四个储存概念(除远程仓库在服务端,其他都在本地存储):

  • workspace:工作目录,本地操作的文件
  • index:暂存区,记录各个文件的索引
  • local repository:本地仓库
  • remote repository:远程仓库

2)常用场景:提交变更和同步/下载代码

提交变更
  • git工作目录中,在一个分支下(branch name),进行变更操作(增删改)
  • 将变更提交到index暂存区(git add [fileName])
  • 再提交到本地仓库 (git commit -m [commit info])
  • 最后提交到远程仓库(git push origin [branch name])
同步/下载代码

对应上面提交变更步骤,可从三处同步代码:

  • index暂存区(git checkout -b [ branch Name])
  • 本地仓库(git checkout HEAD)
  • 远程仓库(两种场景:git clone url [local directory] / git pull )
冲突

在提交和同步时,都要进行合并(merge),或手动或git自动合并,可能引起的冲突
(冲突:即同一文件同一位置代码不一致,git不能判断最终应该以那个为准)

  • 在同步git pull出现冲突,手动解决掉提示的冲突文件,然后再次提交,类似与下图的冲突:
  • 提交时,可能有多种冲突情况,建议先从服务器端获取最新代码解决冲突,在本地运行通过,再提交

3、git版本控制的相关信息存储——所有git的操作内容都放在.git文件夹
1).git是隐藏状态,在项目根目录,使用“ll -a”可查看
2)下图是本地项目的.git文件夹下内容:

3) 查看可用官网帮组:git help gitrepository-layout

  • 下面总结的具体内容简介:
    • COMMIT_EDITMSG——最后一次commit提交的msg信息
      备注:如果 git commit时,没有加-m信息,就会进入COMMIT_EDITMSG进行信息编辑,打开此文件与编辑保存时一致

    • FETCH_HEAD,记录在本地,从远程的更新所有分支最新提交信息(可使用“git fetch”更新远程所有的分支提交信息),查看文件,eg:

    • HEAD,当前指向的当前所在的分支(一个标记)
      eg:文件内容:ref: refs/heads/branch1,是指现在指向名“branch1”的分支

    • ORIG_HEAD,记录一些危险操作(pull,push或者reset等)前的一个head操作指针,发生错误时候可以恢复到ORIG_HEAD指向操作

    • config,git的一些配置文件,远程仓库的相关一些配置信息(只针对当前所在的仓库),和git的全局配置文件

    • description,供GitWeb(git的图形界面的web浏览)使用,不用关心

    • hooks,包含挂钩脚本文件,类似与监听器,在执行了某些操作(eg:push,commit等)后,就会触发执行
      1)git hooks应用有具体的用法
      2)定制些开发中自动化执行的流程,eg:代码规范检查,提交git规范交叉,代码提交后周知或者打包等等

    • index,对应上面原理图中index,是一个二进制文件,是操作文件的所有快照(索引)(eg:git add后就向文件写入索引)
      1)不实际存储内容,只是一个内容的索引(具体内容存储在objects中),可使用特定软件打开,参考官网说明
      2)也可使用git ls-files --stage查看索引和工作区中文件信息,

      上图中,第二列即是指向objects的索引

    • /info,存储不希望在.gitignore(包含不被git管理的文件或目录)中忽略中全局可执行的文件

    • logs,项目中所有的每次提交信息

    • objects,具体上面index指向的实际的变更内容,包括文件内容,以及内容的tree对象和提交信息

    • packed-refs,为节省空间和提高效率,对多个松散对象打包时,把.git/refs内容移动到此文件中,手动运行git gc可查看到refs内容清空,文件记录eg:

    • refs,存储本地和远程仓库,各分支最后一次提交信息的索引

4、git通过对.git文件下内容操作,进行版本控制的,下面以提交为例可查看到如何实现:

git是一套内容寻址文件系统,存储相关的键值对,然后通过键值对,对内容操作

1)在工作目录内容改变,首先进行提交(git add),实际进行了下列操作

  • 将修改文件内容快照存储(在.git/objects)
  • index文件中更新修改文件内容的索引
  • 多层路径会存储修改内容的tree对象

    ps:使用“git ls-files --stage ”查看index内容,eg:

2)在提交(git commit)后,生成commit对象

  • 存储文件内容的快照(包括tree和上一次提交信息),操作时间,操作人和提交信息
  • commit信息,保存在.git/objects中
  • 使用“git cat-file -p [commit的指针]”,eg:
  • commit的指针,可使用git log获取,eg下图中commit后的索引值:

3)对于其他同步,回滚等操作,都是通过键值对不断对object中文件内容操作
tips:键值对通过哈希算法SHA-1计算,git对象存储的键值对通过文件头+文件内容进行SHA-1计算,详细请参考此处

此文章参考内容:
1.https://zh.wikipedia.org/wiki/Git
2.https://git-scm.com/book/zh/v1/Git-%E5%86%85%E9%83%A8%E5%8E%9F%E7%90%86-Git-%E5%AF%B9%E8%B1%A1
3.http://gityuan.com/2015/06/27/git-notes/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容