技术分享 · Git 协作入门

Git 不是魔法,
先看懂
==历史怎么走==

从对象和指针,走到分支与合并。

main feature OBJECTS → POINTERS → HISTORY

一 · 对象

四种对象,各管一件事

01 · 文件内容

blob

保存内容,不保存文件名。

02 · 目录结构

tree

记录名字、模式与对象引用。

03 · 一次快照

commit

关联根 tree、父提交与元数据。

04 · 附注标签

tag

保存目标、说明与打标者信息。

概念依据:Pro Git · Git Objects;轻量标签只是引用,不创建 tag 对象。

快照

提交指向快照,差异按需计算

commit tree blob hello.txt

文件名写在 tree 里;内容没有变化,就能复用同一个 blob。

关系示意,省略父提交与元数据;依据:Pro Git · Git Objects。

二 · 指针

新建分支,只增加一个指针

两个分支可以指向同一次提交。
分支名不同,文件不必复制一份。

git switch -c feature

正常附着状态下,HEAD 指向当前分支。

A B main feature HEAD →

A、B 为合成提交标识;依据:Pro Git · Branches in a Nutshell。

三 · 整合

分叉之后,merge 保留两条来路

A B C D main feature M main

M 同时引用 C 和 D,已有提交保持不变。

连线表示历史关系,时间从左到右;演示非 fast-forward 的双分支合并。

重放

rebase 重放改动,形成新的提交

A B C main D D′ feature

D 的改动应用到 C 之后,得到 D′;父提交改变,标识随之改变。

关系为合成示意;原 D 仍可能由 reflog 等引用保留,不会因重放立即消失。

协作选择

先约定历史,再选择整合方式

需要保留什么 可选方式 先检查什么
分支整合的来路 merge 是否已分叉、是否需要合并节点
线性的个人提交 rebase 是否有人依赖这段历史

两条路径可能得到相同文件内容;冲突处理不同,结果也可能不同。

依据:Pro Git · Basic Branching and Merging / Rebasing。

下次敲命令之前

它新增了什么对象,
又把哪个指针
==移到了哪里?==

用对象图解释一次提交,再解释一次合并。

talk-in-slides · 公开教学示例← / → 翻页 · M 总览 · S 备注
Git 不是魔法
talk-in-slides · 教学示例
返回主题画廊