- 第一课:git十年十变化
- 1:条件包含(includeIf)
- 2:大仓库克隆
- 3:多工作区
- 4:使用watchman提升工作区扫描效率
- 5:checkout命令拆分为两条新命令:switch和restore,降低复杂的checkout命令的学习成本
- 6:git-clean —interactive:采用交互式操作,清理本地未跟踪文件
- 7:用git commit —fixup/—squash 以及git rebase -i -autosquash修改历史提交
- 8:git range-diff比较两个版本序列之间的差异
- 9:使用proc-receive挂钩和report-status-v2设计免特性分支的评审工作流(主干开发模式)
- 10:Git本地化
- 第二课:深入浅出git对象和引用原理
- 第三课:2个命令,高效管理git子仓库
- 第四课:git仓库文件揭秘,git存储空间优化不用愁
- 第五课:git交互协议详解
- 第六课:git merge:10分钟掌握协同开发必备技能
- 第七课:git rebase:人生无法重来,但代码可以
- 第八课:git commit:写好提交,做一个有品味的程序员
第一课:git十年十变化
1:条件包含(includeIf)
场景:为不同的仓库提供不一样的默认配置
例如:不同目录下仓库提交使用不一样的邮件配置(user.email)
实例:
$ git config --global "includeIf.gitdir:~/work-alibaba/.path" alibaba.inc
$ git config --global "includeIf.gitdir:~/work-oss/.path" oss.inc
[includeIf "gitdir:~/work-alibaba/"]
path = alibaba.inc
[includeIf "gitdir:~/work-oss/"]
path = oss.inc
2:大仓库克隆
稀疏检出:按需检出。
$ git clone --sparse ...
$ git sparse-checkout <init|add|reapply> ...
协议2.0:针对引用(分支等)多的仓库进行优化。
$ git config protocol.version 2
部分克隆:只克隆元数据,按需获取文件内容等。
$ git clone --filter=blob:none ...
3:多工作区
场景:同一个仓库(.git),不同分支检出到不同的工作区。
创建新工作区
$ git worktree add -b topic-1 ../topic-1
如果切换至已检出到其他工作区的分支,报错
$ git switch topic-1
fatal:'topci-1' is already checked out at '../topic-1'
清理工作区删除后,残存的Git管理文件
$ git worktree prune
4:使用watchman提升工作区扫描效率
场景:当仓库中包含数以万计的文件时,git status速度变慢
安装watchman
为仓库设置core.fsmonitor参数,指定一个可执行脚本
$ git config core.fsmonitor .git/hooks/fsmonitor-watchman
安装脚本
$ mv .git/hooks/fsmonitor-watchman.sample .git/hooks/fsmonitor-watchman
5:checkout命令拆分为两条新命令:switch和restore,降低复杂的checkout命令的学习成本
创建并切换到新分支
$ git switch -c new-branch
将文件在暂存区中的版本检出到工作区
$ git restore --file...
将文件在指定提交中的版本检出到工作区
$ git restore -s v2.0.0 --file...
6:git-clean —interactive:采用交互式操作,清理本地未跟踪文件
故事:一个网友问我如何找回“git clean -f”误删除的文件。
交互式清理本地未跟踪的文件和目录
$ git clean -i -d
交互式清理本地未跟踪的文件和目录,含忽略的文件
$ git clean -idx
关于交互式操作,查看帮助中INTERACTIVE MODE小结内容
$ git help clean
7:用git commit —fixup/—squash 以及git rebase -i -autosquash修改历史提交
修改历史提交通常使用git rebase -i,但并不方便。是否可以先提交,后改历史?
git commit —fixup=[amend:|reword:]
$ git commit --fixup <commit> #新提交的标题包含便于识别的前缀"fixuo!:"
$ git commit --fixup=amend:<commit> #新提交的标题包含便于识别的前缀"amend!:"
$ git commit --fixup=reword:<commit> #新提交的标题包含便于识别的前缀"amend!:",且无内容更改。
$ 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设计免特性分支的评审工作流(主干开发模式)
只读用户向仓库推送创建代码评审。
$ git push origin HEAD:refs/for/master/<topic-name>
客户端工具:支持Android式多仓库模式(比git-submodule更好用的多仓模式)
$ git repo init -u <manifest.git>
客户端工具:单仓库快捷操作。
$ git pr
$ 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对象和引用原理
第三课:2个命令,高效管理git子仓库
第四课: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 merge:10分钟掌握协同开发必备技能
三路合并是基线(common ancestor)、我(ours)、对方(theirs)三方做合并处理。