# 前言
和大家一起学习探讨下 Git 的内部原理,Git 基本操作,Git的版本管理策略, 最后会和大家通过一些场景问题,学习 Git 的常用黑科技, 例如:cherry-pick,patch,reset vs revert。
# Git项目管理源码地址
PS: 查看隐藏文件夹 .git
# 一句话理解Git(面试专用)
Git 的每个分支的管理类似于链表,每次提交都会产生一个 SHA1 的唯一标识符,此唯一标识符是引用的指针,后续的增删改查操作都可以基于这个指针进行索引操作。
关键字:分布式,四个分区,链表,SHA1指针
# 通过本章读者可以学习了解到什么?
- git 的核心原理,四个分区差异,代码的不同状态在四个分区流转的规则。
- 如何修改 git 的基本信息, 用户名,远端仓库地址
- 如何删除及忽略 git 已经提交的资源
- git reset 和 git revert 的区别
- git pull 和 git pull --rebase 的区别
- git 版本管理策略模型
# 认识Git
# Git简史
同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。
Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。 到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
# 版本管理策略

master分支: 一般会以此分支为主分支(发布分支)。主分支的意思是说开发者不会在主分支上开发, 主分支只接受外分支的合并。合并完之后,验证通过,打 tag 上线。
develop分支: 作为日常开发分支,同时会有多人在上面提交代码,为了保证提交不冲突,尽量保证模块拆解合理,开发过程中没有多位开发者同时修改同一文件的情况。
feture_a 到 feture_n分支: 这些分支是发布之后的 bug 修复分支,不同开发者产生的 bug,会不同分支上修复 bug,最终合并到 master 分支上上线。
# Git核心概念及原理
Git 是分布式版本控制系统,SVN 是集中化版本控制系统。 Git 取代了 SVN 作为当前最好的版本管理工具。
SVN缺点: SVN 集中化版本控制系统虽然能够令多个团队成员一起协作开发,但有时如果中央服务器宕机的话,谁也无法在宕机期间提交更新和协同开发。甚至有时,中央服务器磁盘故障,恰巧又没有做备份或备份没及时,那就可能有丢失数据的风险。
# Git 四个工作区
Git 的文件操作原理都是基于 Workspace (工作区),Index / Stage (暂存区), Repository (仓库区) 和 Remote(远程仓库)四个工作区来进行流转。

Workspace工作区: 平时存放编辑项目代码的空间
Index / Stage暂存区: 用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository仓库区(或版本库): 就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中 HEAD 指向最新放入仓库的版本
Remote远程仓库: 托管代码的服务器。例如 Github 的代码远端代码托管服务器
# 操作说明
pull操作,Git 会从 远端仓库 到 工作区fetch/clone操作,Git 会从 远端仓库 到 版本仓库add操作,Git 会从 工作区 到 暂存区commit操作,Git 会从 暂存区 到 版本仓库
例如我们一次完整的提交 add --> commit --> push 经历的工作区变化就是
工作区 --> 缓存区 --> 本地仓库区 --> 远端仓库
# Git内部构造
要理解 Git 内部构造的核心,我们应理解三个东西:实体(objects)、引用(refs)、索引(index)。,这些都会在 Git 的 .git 文件结构目录下找到对应的目录。

实体: 提交到一个 Git 代码仓库中的所有文件,包括每个提交的说明信息(the commit info)都在目录 .git/objects/ 中存储为实体。一个实体以一个 40 字符长度的字符串(该实体内容的 SHA1 哈希值)来标识。
引用: Git 中,一个分支(branch)、远程分支(remote branch)或一个标签(tag)(也称为轻量标签)仅是指向一个实体的一个指针,这里的实体通常是一个 commit 实体。这些引用以文本文件的形式存储在目录 .git/refs/ 中。
索引: 索引是一个暂存区,以二进制文件的形式存储为文件 .git/index。当 git add 一个文件,Git 将该文件的信息添加到索引中。当 git commit,Git 仅提交索引文件中列出的文件。
# Git初始化
# Git授权SSH
大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。在 Github 或者 Gitlab 上提交代码,我们需要把 SSH 公钥复制托管到Github的
