第一课:git十年十变化

1:条件包含(includeIf)

场景:为不同的仓库提供不一样的默认配置
例如:不同目录下仓库提交使用不一样的邮件配置(user.email)
实例:

  1. $ git config --global "includeIf.gitdir:~/work-alibaba/.path" alibaba.inc
  2. $ git config --global "includeIf.gitdir:~/work-oss/.path" oss.inc
  3. [includeIf "gitdir:~/work-alibaba/"]
  4. path = alibaba.inc
  5. [includeIf "gitdir:~/work-oss/"]
  6. path = oss.inc

2:大仓库克隆

稀疏检出:按需检出。

  1. $ git clone --sparse ...
  2. $ git sparse-checkout <init|add|reapply> ...

协议2.0:针对引用(分支等)多的仓库进行优化。

  1. $ git config protocol.version 2

部分克隆:只克隆元数据,按需获取文件内容等。

  1. $ git clone --filter=blob:none ...

3:多工作区

场景:同一个仓库(.git),不同分支检出到不同的工作区。
创建新工作区

  1. $ git worktree add -b topic-1 ../topic-1

如果切换至已检出到其他工作区的分支,报错

  1. $ git switch topic-1
  2. fatal:'topci-1' is already checked out at '../topic-1'

清理工作区删除后,残存的Git管理文件

  1. $ git worktree prune

4:使用watchman提升工作区扫描效率

场景:当仓库中包含数以万计的文件时,git status速度变慢
安装watchman
为仓库设置core.fsmonitor参数,指定一个可执行脚本

  1. $ git config core.fsmonitor .git/hooks/fsmonitor-watchman

安装脚本

  1. $ mv .git/hooks/fsmonitor-watchman.sample .git/hooks/fsmonitor-watchman

5:checkout命令拆分为两条新命令:switch和restore,降低复杂的checkout命令的学习成本

创建并切换到新分支

  1. $ git switch -c new-branch

将文件在暂存区中的版本检出到工作区

  1. $ git restore --file...

将文件在指定提交中的版本检出到工作区

  1. $ git restore -s v2.0.0 --file...

6:git-clean —interactive:采用交互式操作,清理本地未跟踪文件

故事:一个网友问我如何找回“git clean -f”误删除的文件。
交互式清理本地未跟踪的文件和目录

  1. $ git clean -i -d

交互式清理本地未跟踪的文件和目录,含忽略的文件

  1. $ git clean -idx

关于交互式操作,查看帮助中INTERACTIVE MODE小结内容

  1. $ git help clean

7:用git commit —fixup/—squash 以及git rebase -i -autosquash修改历史提交

修改历史提交通常使用git rebase -i,但并不方便。是否可以先提交,后改历史?
git commit —fixup=[amend:|reword:]创建的新提交提供对指定提交的修正/修补/修改说明。

  1. $ git commit --fixup <commit> #新提交的标题包含便于识别的前缀"fixuo!:"
  2. $ git commit --fixup=amend:<commit> #新提交的标题包含便于识别的前缀"amend!:"
  3. $ git commit --fixup=reword:<commit> #新提交的标题包含便于识别的前缀"amend!:",且无内容更改。
  4. $ git commit --squash=<commit> #新提交的标题包含便于识别的前缀"squash!"

git rebase -i —autosquash的交互式变基能够识别特殊点提交前缀,自动压合提交。
如果希望—autosquash成为默认值,设置rebase.autosquash为true。

8:git range-diff比较两个版本序列之间的差异

在Git项目的开源贡献中,经常使用此技术比较前后两个版本(reroll)多个提交之前的差异。

9:使用proc-receive挂钩和report-status-v2设计免特性分支的评审工作流(主干开发模式)

只读用户向仓库推送创建代码评审。

  1. $ git push origin HEAD:refs/for/master/<topic-name>

客户端工具:支持Android式多仓库模式(比git-submodule更好用的多仓模式)

  1. $ git repo init -u <manifest.git>

客户端工具:单仓库快捷操作。

  1. $ git pr
  2. $ git download ...

更多的服务端创新已在路上…

10:Git本地化

Git有一天突然说中文了!在始于2012年,九年的中文本地化工作。
不喜欢Git的中文翻译?参考“po/README.md”了解本地化流程,参与贡献。
作为Git本地化协调者,我是怎么管理多语种本地化的:
Git本地化的CI工具:https://github.com/git-110n/git-po-helper
和Git本地化流水线:.github/workflows/110n.yml
中文本地化Leader:周方易

第二课:深入浅出git对象和引用原理

阿里云-Git从入门到进阶 - 图1

第三课:2个命令,高效管理git子仓库

git-summodule
git-repo

第四课:git仓库文件揭秘,git存储空间优化不用愁

git中索引的是完整文件内容,而不是增量差异。
通过git gc或者自动gc,可以完成松散对象存储打包,减少磁盘占用。
git中通过判断objects/17目录下是否多余26个文件,来近似判断整体松散对象数量是否达到6700,我们也将该方法应用到类似的均匀分布的数据评估中哟。

执行git gc之后,时常会留存一些松散对象无法删除,这些对象为“草稿”,又称之为不可达对象。不可达对象默认保留14天,可以通过gc.pruneExpire进行修改。
执行git gc之后,生成的packfile小于原有的松散对象。松散对象使用的zlib的压缩级别为1,速度优先,最基础的压缩。packfile使用的压缩级别为-1,默认压缩级别,请求速度和压缩之间的默认折中(当前相当于6级)。可以通过core.compression、core.loosecompression、pack.compression来修改
可以通过设置repack.writebitmaps=1在执行git gc时创建bitmap,它将有效提升大型仓库的访问效率。

第五课:git交互协议详解

阿里云-Git从入门到进阶 - 图2
push.negotiate

第六课:git merge:10分钟掌握协同开发必备技能

阿里云-Git从入门到进阶 - 图3

三路合并是基线(common ancestor)、我(ours)、对方(theirs)三方做合并处理。
image.png

第七课:git rebase:人生无法重来,但代码可以

image.png

第八课:git commit:写好提交,做一个有品味的程序员