Pro Git 第2版 笔记

起步

直接记录快照,而非差异比较

  • 其它系统保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
  • Git 像是把数据看作是对小型文件系统的一组快照。

每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 如果文件没有修改,Git 只保留一个链接指向之前存储的文件。

优势

  • 近乎所有操作都是本地执行。
  • 所有数据在存储前都计算校验和(SHA-1 散列),然后以校验和来引用。可以保证完整性。
  • 只添加数据,操作可逆。

对于任何一个文件,在 Git 内部都只有三种状态:

  • 已提交 committed - 保存在本地数据库中
  • 已修改 modified - 修改了,但还没保存到本地数据库
  • 已暂存 staged - 已修改的文件放做了标记,包含在下次提交的快照中

文件流转的三个工作区域:

  • Git 的本地数据目录 - 每个项目都有一个 .git 目录,它是 Git 用来保存元数据和对象数据库的地方。每次克隆仓库的时候,实际拷贝的就是这个目录里面的数据。
  • 工作目录 - 从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件实际上都是从 .git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。
  • 暂存区 - 是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。

基础

fetch 命令只是将远端的数据拉到本地数据库,并不自动合并到当前工作分支,你需要手工合并。

分支

暂存操作会对每一个文件计算 校验和 也就是 SHA1 字符串,然后把当前版本的文件快照保存到 Git 仓库中(Git使用 blob 类型的对象存储这些快照),并将 校验和 加入暂存区域。

Git 的分支本质上一个指向 commit 对象的可变指针。它包含所指对象校验和 40个字符长度 SHA1 字串的文件,创建和销毁一个分支就很廉价。说白了,新建一个分支就是想一个文件写入 41 个字节外加一个换行符,当然很快了。

Commit Object 除了包含指向暂存内容快照的指针,还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针。首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象,而由多个分支合并产生的提交对象有多个父对象。

Git 保存一个名为 HEAD 的特别指针,用来标记你在哪个分支上工作。

转换分支的时候最好保持一个清洁的工作区域。

git branch -v # 查看各分支最后一次 commit 信息
git branch -merged # 查看哪些分支已经被合并
git branch --no-merged # 查看尚未合并的工作

当你在使用分支及合并时,一切都在自己本地的 Git 仓库中进行,完全不涉及与服务器的交互。

跟踪分支 tracking branch,是一种和远程分支有直接联系的本地分支。在跟踪分支里输入 git push 会自行推断应该向哪个远程服务器的哪个分支推送数据。

git rebase --onto master server client

检出 client 分支,找出 client 分支和 server 分支的共同祖先之后的变化,然后把它们在 master 上重演一遍。

可以直接把 server 分支变基到 master 而不用手工转到 server 分支再 rebase。git rebase <主分支> <特性分支> 会先检出特性分支 server,然后在 master 上重演。

在线阅读

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Apr 16, 2018

奉献爱心