共计 2468 个字符,预计需要花费 7 分钟才能阅读完成。
Git 起步
Git 是什么?
Git 是一个免费的开源分布式版本控制系统,旨在快速,高效地处理从小型到大型项目的所有事务。
集中式与分布式的区别:
Git 几个特性
直接记录快照,而非差异比较 git 会对当时的全部文件制作一个快照并保存这个快照的索引。git 对待数据更像是一个 快照流
几乎所有操作都是本地执行
Git 保证完整性 git 中所有数据存储前都计算校验和,然后用校验和来引用。git 用以计算校验和的机制叫做 SHA-1 hash。是一个由 40 个十六进制字符组成的字符串。实际上,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)
提交对象(commit object)
提交对象是用来保存提交的作者、时间、说明这些信息的,commit-tree 除了要指定提交的树对象,也要提供提交说明,至于提交的作者和时间,则是根据环境变量自动生成,并不需要指定。
我们运行 git add 和 git commit 命令时,Git 所做的实质工作——将被改写的文件保存为数据对象,更新暂存区,记录树对象,最后创建一个指明了顶层树对象和父提交的提交对象。这三种主要的 Git 对象——数据对象、树对象、提交对象——最初均以单独文件的形式保存在 .git/objects 目录下。
Git 引用
我们可以借助类似于 git log 1a410e 这样的命令来浏览完整的提交历史,但为了能遍历那段历史从而找到所有相关对象,你仍须记住 1a410e 是最后一个提交。我们需要一个文件来保存 SHA-1 值,并给文件起一个简单的名字,然后用这个名字指针来替代原始的 SHA-1 值。
在 Git 里,这样的文件被称为 引用(references,或缩写为 refs)。你可以在 .git/refs 目录下找到这类含有 SHA-1 值的文件。
代码回滚的选择
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 常用命令
百度云 密码:7ze2
Git 提交规范
git commit
feat:新功能(feature)
fix:修补 bug
docs:文档(documentation)
style:格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动