Git 学习笔记整理

Git起步

Git是什么?

Git是一个免费的开源分布式版本控制系统,旨在快速,高效地处理从小型到大型项目的所有事务。

集中式与分布式的区别:
《Git 学习笔记整理》

《Git 学习笔记整理》

Git几个特性

  • 直接记录快照,而非差异比较

    git会对当时的全部文件制作一个快照并保存这个快照的索引。git对待数据更像是一个 快照流

  • 几乎所有操作都是本地执行
  • Git保证完整性

    git中所有数据存储前都计算校验和,然后用校验和来引用。git用以计算校验和的机制叫做SHA-1 hash。是一个由40个十六进制字符组成的字符串。实际上,git数据库中保存的信息都是以文件内容的哈希值来索引,而非文件名。

  • Git一般只添加数据

三种状态

git有三种状态:已提交(数据已经保存在本地仓库中)、已修改(已修改文件,但是还未保存到仓库中)、已暂存(对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中)。

由此引出三个工作区域的概念:Git仓库、工作目录、暂存区域。
《Git 学习笔记整理》

Git内部原理

首先我们来看一个新的 .git 目录的结构

HEAD
config*
description
hooks/
info/
objects/
refs/

description文件仅供GitWeb程序使用,我们无需关心。

config文件包含项目特有的配置选项。
info目录包含一个全局性排除(global exclude)文件,用以放置那些不希望被记录在.gitignore 文件中的忽略模式(ignored patterns)。
hooks目录包含客户端或服务端的钩子脚本(hook scripts)。

剩下的四个条目很重要:

HEAD文件、(尚待创建的)index文件,和 objects目录refs目录。 这些条目是 Git 的核心组成部分。
objects目录存储所有数据内容;refs目录存储指向数据(分支)的提交对象的指针;HEAD文件指示目前被检出的分支;index 文件保存暂存区信息。

Git对象

Git是一个内容寻址文件系统,它的核心部分是一个简单的键值对数据库。

数据对象(blob object)

是一块二进制数据,没有其他任何指向或任何属性,甚至连文件名都没有。

git会根据文件内容计算出一个hash值,以hash值作为文件索引存储在Git文件系统中

树对象(tree object)

《Git 学习笔记整理》

提交对象(commit object)

提交对象是用来保存提交的作者、时间、说明这些信息的,commit-tree除了要指定提交的树对象,也要提供提交说明,至于提交的作者和时间,则是根据环境变量自动生成,并不需要指定。

我们运行 git add 和 git commit 命令时, Git 所做的实质工作——将被改写的文件保存为数据对象,更新暂存区,记录树对象,最后创建一个指明了顶层树对象和父提交的提交对象。这三种主要的 Git 对象——数据对象、树对象、提交对象——最初均以单独文件的形式保存在 .git/objects 目录下。

《Git 学习笔记整理》

Git引用

我们可以借助类似于git log 1a410e 这样的命令来浏览完整的提交历史,但为了能遍历那段历史从而找到所有相关对象,你仍须记住 1a410e 是最后一个提交。我们需要一个文件来保存 SHA-1 值,并给文件起一个简单的名字,然后用这个名字指针来替代原始的 SHA-1 值。

在 Git 里,这样的文件被称为 引用(references,或缩写为 refs)。你可以在 .git/refs 目录下找到这类含有 SHA-1 值的文件。
《Git 学习笔记整理》

代码回滚的选择

git reset、git checkout、git revert的选择

附上感觉讲的不错的一篇文章

回滚的选择

git reset [type] HEAD

git reset用于撤销未被提交到remote的改动,即撤销local的修改。除了移动当前分支的HEAD(提交记录),还可以更改workspace(工作目录)和index(暂存区):

  • –soft:修改HEAD,不修改index和workspace。
  • –mixed:修改HEAD和index,不修改workspace。默认行为。
  • –hard:修改HEAD、index、workspace。

git revert

通过新建一个commit来撤销一次commit所做的修改,是一种安全的方式,并没有修改commit history

总结:

命令作用域常用场景
git reset提交层面在私有分支上舍弃一些没有提交的更改
git reset文件层面将文件从缓存区中移除
git checkout提交层面切换分支或查看旧版本
git checkout文件层面舍弃工作目录中的更改
git revert提交层面在公共分支上回滚更改
git revert文件层面

Git Flow

git flow介绍

Git Flow常用的分支

  • Production 分支

    也就是我们经常使用的Master分支,这个分支最近发布到生产环境的代码,最近发布的Release, 这个分支只能从其他分支合并,不能在这个分支直接修改

  • Develop 分支

    这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature分支

  • Feature 分支

    这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release

  • Release分支

    当你需要一个发布一个新Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支

  • Hotfix分支

    当我们在Production发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release

图解:
《Git 学习笔记整理》

附录

Git常用命令

百度云 密码:7ze2
《Git 学习笔记整理》

Git提交规范

  • git commit

    • feat:新功能(feature)
    • fix:修补bug
    • docs:文档(documentation)
    • style: 格式(不影响代码运行的变动)
    • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
    • test:增加测试
    • chore:构建过程或辅助工具的变动
    原文作者:夙梦流尘
    原文地址: https://segmentfault.com/a/1190000017941479
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞