有这么一个段子...
老杨一推代码, 所有的开发同事便都看著他笑, 有的叫道, 「 老杨, 你又把代码合丢了!」 他不回答, 对产品说, 「 追加两个需求, 只做性能优化。」 便排出一台MacBook Pro。 他们又故意的高声嚷道, 「 你推错分支了!」 老杨睁大眼睛说, 「 你怎么这样凭空污人清白……」, 「 什么清白? 我前天亲眼见你写Bug把流水线搞挂, 又改崩生产代码「。 老杨便涨红了脸, 额上的青筋条条绽出, 争辩道, 「 流水线报错不算错, 合代码挂掉的事能叫Bug吗?」 接连便是难懂的话, 什么「 Merge大法好, GitFlow卍解」, 什么「 拉代码不需要Rebase」 之类, 引得众人都哄笑起来: 店内外充满了快活的空气。
用 git 的, 谁没合丢过代码呢? (反正我是合丢过...)
好, 痛定思痛, 我决定从原理上理解Git, 所以决定写下这篇文章(才不会说是因为buddy叫我准备一场针对 git 的 session).
PS: git官网上有看都看不完的长篇大论, 甚至有人专门为理解git的一种workflow出书...这些都说明"看这篇文章就想把git搞透彻是不可能的"(因为写文章的人都没有把git搞透彻(再次苦笑)).
So: 这篇文章不会是一个体系完善的Git教程, 只会针对性地从原理上理解一些我们常用的Git命令, 最终目标就是能够在基本的多人合作的场景下正常工作, 同时对于复杂的场景能有用于检索资料的先验知识.
目录
- 目录
- Git的那些概念
- Git的本质是什么?
- Git中存储的对象
- 1. blob对象
- 2. tree对象
- 3. commit对象
- ref(引用)
- Git的那些常用操作
- file-level
- commit/branch-level
- repo-level
- Git的那些冲突
- 出现冲突的可能情形
- 规避冲突的优选操作
- 其他的奇技淫巧
Git的那些概念
Git的本质是什么?
Git的本质其实是复读机一个内容定址(content-addressable)文件系统, 它的核心部分是一个简单的键值对资料库。我们可以向该资料库写入值(object), 它会返回一个键(object的引用地址, SHA-1字元串), 通过该键可以在任意时刻再次检索值. 我们所操作的版本控制, 其实就是不断地向这个文件系统写入操作日志.
那么这些被写入的操作日志是什么呢?
Git中存储的对象
1. blob对象
对应的值是单个文件内容的快照, 这个快照不包括文件名。