版本控制git
git版本控制概念
现代软件工程存在多人协作&版本管理的需求。由于软件体量较大,通常现代软件的工作量不是单人可完成的,需要多人协作。那么如何分工,如何将大家的修改统一管理、统一控制就成了比较关键的需求。git本质就是为了满足这些需求。本文主要记录git的底层实现,并尝试梳理这种底层实现的设计语言在实现版本控制需求中的优点。
git版本控制数据结构
主要分为blob和tree两种结构,blob指示文件,tree指示文件夹。tree的数据结构里包含tree和blob,代表文件夹内的子文件夹和文件本体。
Blob 和 tree 的内容,共同组成了某次版本的快照(snapshot),git使用有向无环图来对历史版本建模。
blob:array
tree:array[union[blob, tree]]
以下root 目录文件结构为例:
提交修改后,snapshot之间的前后关系会由git记录,并且不同人修改的分支最终能合并在一起。如果出现了共同修改的地方,合并式会上报冲突,由程序员自己确定合并规则。
git中基本的数据结构整理:
Git基本命令使用
Git add --将修改添加至暂存区,准备commit到snapshot中;
Git commit --将暂存区中的修改提交,生成一次commit 哈希值,这个哈希值对应该次snapshot,会和tree的修改哈希对应,tree里再包括blob的哈希修改。这些索引可以用git cat-file一层层查到。
Git status --显示当前提交和暂存区的状态
Git log --显示历史提交信息
Git checkout --将当前目录切换到其他git历史状态,如切换branch,切换commitID等