Git 学习指南(三)版本库与分支
- 五. 版本库
- 5.1 一种简单而高效的存储系统
- 5.2 存储目录:Blob与Tree
- 5.3 相同数据只存储一次
- 5.4 压缩相似内容
- 5.5 不同文件散列值相同的情况
- 5.6 提交对象
- 5.7 提交历史中的对象宠用
- 5.8 重命名、移动与复制
- 六. 分支
- 6.1 并行使开发
- 6.2 修复旧版本中的bug
- 6.3 分支
- 6.4 泳道
- 6.5 当前活跃分支
- 6.6 重置分支指针
- 6.7 删除分支
- 6.8 清理提交对象
- 七. 合并分支
- 7.1 合并过程中发生的事
- 7.2 冲突
- 7.3 编辑冲突
- 7.4 冲突标志
- 7.5 解决编制冲突
- 7.6 内容冲突
- 7.7 快进合并
- 7.8 第一父级提交历史
- 7.9 棘手的合并冲突
- 7.10 摆烂
读前须知: 本篇章内容取自《Git 学习指南》 P33~P56,如需更多详细内容请购买正版书籍
上一章节: 【书籍篇】Git 学习指南(二)提交与多次提交
下一章节:
五. 版本库
Git主要由两个层面构成: (1)顶层结构(瓷质命令)(2)底层结构(管道)
瓷质命令: 例如log、reset、commit等命令
管道: 一组带有少量选项的简单命令,瓷质命令的基础
5.1 一种简单而高效的存储系统
Git: 核心是一个对象数据库,可用来存储文本或二进制数据
命令 | 描述 |
---|---|
git hash-object -w dev.txt | 将文件里的记录插入到对象数据库中,返回一个键值 |
git cat-file -p [键值] | 从对象数据库中取出数据 |
5.2 存储目录:Blob与Tree
Git使用一种包含两个节点类型的简单树结构。
(1)文件内容将保持不变,并以blob对象的形式按字节被存储在对象数据库中
(2)目录则将用tree对象来表示
5.3 相同数据只存储一次
为了节省内存空间,Git对于相同数据将只存储一次。两个相同的文件返回的散列值相同
$ git hash-object -w dev.txt
9ef6c44f066c4a066cfd2df21a536b5a6958e724$ git hash-object -w dev-clone.txt
9ef6c44f066c4a066cfd2df21a536b5a6958e724
5.4 压缩相似内容
Git对与旧文件差别不大的新文件采用增量方法来存储这些文件
5.5 不同文件散列值相同的情况
(1)散列值的可能取值有2^160个
(2)运行了五年的linux内核项目也仅有2^21个对象
5.6 提交对象
tree: 描述该提交的内容
parent: 指的是它的上一次提交
author: 作者
committer: 提交者
提交注释
$ git cat-file -p db237a0
tree 0d4285779205fa3b297d7065640b29ad13c43de2
parent 5de4b2ffdfa84f7a4d9f16912ddebab8f4e593ad
author jieKaMi <l> 1700579541 +0800
committer jieKaMi <l> 1700579541 +0800first
5.7 提交历史中的对象宠用
一次提交往往只涉及项目中少数文件修改,而其它大部分文件和目录不会发生变化,所以Git尽可能多地重用前次提交中的相关对象
5.8 重命名、移动与复制
概念: 略。。。详细内容《Git 学习指南》 P37~P38
命令 | 描述 |
---|---|
git log --summary -M90% | grep -e “^ xxxx” | 获取一份摘要 |
git log --follow dev.txt | 跟踪被移动文件的历史 |
git log --summary -C90% grep -e “^ xxxx” | 跟踪被复制的数据 |
git config diff.renames true | 重命名检测配制成Git的默认选项 |
git blame -M -C -C -C dev.txt | 逐行打印源头信息 |
六. 分支
版本提交不能依次进行的原因:(1)有两个以上的开发者在对同一项目进行并行式开发 (2)为修复旧版本中的bug而必须要创建和发布新的版本
6.1~6.4 略。。。详细内容《Git 学习指南》 P41~P42
6.1 并行使开发
6.2 修复旧版本中的bug
6.3 分支
6.4 泳道
6.5 当前活跃分支
切换分支被拒绝
(1)提交修改:git commit -all
(2)放弃修改:git checkout --force A
(3)存储修改:git stash、git checkout A
命令 | 描述 |
---|---|
git branch A | 创建分支A |
git branch B [散列值] | 指定提交创建分支 |
git branch C A | 从现有分支中创建分支 |
git checkout A | 切换分支 |
git checkout -b D | 创建并切换分支 |
6.6 重置分支指针
重置分支指针: git reset --hard [散列值]
reset --hard命令会覆盖当前工作区和暂存区中的所有修改,所以最好执行前先用git stash命令存储一下这些修改
6.7 删除分支
命令 | 描述 |
---|---|
git branch -d A | 删除分支A |
git branch -D A | 强制删除分支A |
git branch A [散列值] | 在已知提交的散列值的情况下,恢复分支A |
git reflog | 找到需要恢复分支的提交散列值 |
git branch A HEAD@{1} | 恢复指定散列值的分支 |
6.8 清理提交对象
gc命令: 用于清理版本库,移除所有不属于当前分支的提交对象
七. 合并分支
略。。。详细内容《Git 学习指南》 P46~P56
7.1 合并过程中发生的事
7.2 冲突
冲突 | 描述 |
---|---|
编辑冲突 | 通常发生在两个开发者对同一行代码做了不同修改的时候 |
内容冲突 | 通常发生在连个开发者对某份代码的几个部分做出各自修改的时候 |