Git与Github的简要分享

  1. 之前的一次组会上,给组内小伙伴分享了 GitGithub 有关的基础概念与原理,介绍了使用 Github 进行协作开发的流程。
  2. 本篇博客会总结材料的主要内容,并提供材料的 PPTPDF 文件下载连接。
  3. 现在 Github 网站改版了,PPT 是基于改版前的排版而制作的。
  4. 本次分享的是基础使用教程,不涉及复杂的git命令讲解。
  5. 文档只提供了大纲,很多细节没有体现在文档中,欢迎与我探讨。
注意
本次分享不会详细介绍如何使用 Git。如果你需要学习 Git 的使用,可以访问互联网上的 Git 使用教程进行学习。本次分享中,我侧重于描述 Git 的设计原理、设计哲学等,并会详细介绍使用 Github 协作开发的流程。

版本控制系统

基本概念

版本控制系统(Version Control System)是一种记录文件内容变化的系统,可以在文件被修改时,将这些修改记录下来,以便将来可以查阅特定版本的文件内容。总结为一句话就是:随着时间的推移,使用版本控制系统记录项目的迭代过程。

版本控制系统的主要作用归纳如下:

  • 追踪文件修改
  • 比较版本差异
  • 回滚历史版本
  • 支持协同开发
  • 提高开发效率
  • 增强代码质量

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-3.jpg

发展历史

根据 Version Control by Example 的有关介绍,归纳出版本控制系统的发展历程经历了三个阶段:

  • 本地式版本控制系统:典型代表 RCS
  • 集中式版本控制系统:典型代表 SVN
  • 分布式版本控制系统:典型代表 GIT

其中,本地式版本控制系统只能在本地存储版本,不支持协作共享;集中式版本控制系统集中存储版本,但容易受到单点故障的影响;分布式版本控制系统分布式存储版本,支持本地离线开发,非常灵活与强大。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_9.jpg

Git 介绍

Git 的诞生

Git 诞生的背后有一些有趣的故事。故事来源于 这里,读完这个故事我的感受是大佬解决问题的方式简单而又直接。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_10.jpg

Git 设计哲学

要谈论 Git 的设计哲学,必然绕不开 Linux 的设计哲学,毕竟他俩都出自同一人之手。我在这里简单总结了 Linux 的设计哲学和 Git 的设计哲学。

  • Linux 设计哲学
    • 一切皆文件(抽象的力量)
    • 简洁至上(小而美)
    • 每个程序只做一件事(但做到极致)
    • 提供机制而非策略
  • Git 的设计哲学
    • 一切皆对象
    • 设计多个子命令
    • 每个命令只做一件事
    • 提供丰富的扩展

总的来说,以上的设计哲学可以归纳为:

  • 抽象
  • 组合
  • 接口

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_11.jpg

抽象就是把现实世界中的实体与计算机世界中的对象互相映射,可以说抽象是计算机设计的灵魂;组合是为了降低系统各个组件之间的耦合程度;接口则可以提升系统的扩展能力。

而从https://grahamlopez.org/git/git_philosophy.html的文章,其总结了 git 的五大哲学:

  1. snapshot, not deltas
  2. History is only for humans
  3. Branching is free
  4. Ignore the index
  5. There are no server repositories

关于这五条,我也在旁边做了注解。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_12.jpg

基本概念

Git 的存储区域有工作去、暂存区、版本库和远程库四个概念,使用 Git 进行版本管理就是使用不同的命令在这四个存储区域中切换。这里仅仅只是列举出了几个简单的命令,详细的命令需要去官网查询。

事实上,Git 还设计了其他的存储区,例如使用 git stash 命令的临时区域,这个区域是独立于分支外的。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_13.jpg

分支管理

Git 的分支设计非常有趣,在不同的分支之间切换几乎不会耗费太多时间,这得益于 Git 优秀的存储与索引机制设计。我使用了一个小例子来展示 Git 是如何做版本管理的。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/Git-github-2023-07-11-img-27.gif

只要经过了 git commit 保存,你可以在不同的时间节点上任意穿梭。

因此,在进行远程操作的时候,一定要用 git status 命令检查一下自己的工作区和暂存区。如果只把文件存储到了暂存区,仍然会存在文件丢失的风险。

Git 切换分支之所以很快,是因为只是修改了指针的指向。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_20.jpg

除了分支管理之外,Git 还支持标签管理。在项目的重要节点,如发布、重要更新等,可以使用 git tag 打上标签。标签是不可变的,且在所有的分支均可见。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_21.jpg

文件忽略

有些敏感文件、隐藏文件、临时文件、非文本文件等不应该被 git 管理,此时可以使用 .gitignore 文件,告诉 Git 要忽略哪些文件。可以设置黑名单,也可以设置白名单。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_22.jpg

提交规范

为了方面与他人协作,快速回溯之前的某次修改,建议提交 commit 的时候遵循统一的格式规范,主流的格式规范如下所示。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_23.jpg

Git 工作流

使用 Git 开发需要遵循规范的工作流,需要引入分支管理、标签管理等策略,合理地推动开发进度。当代码越来越大的时候,仍保证 git tree 清晰可读。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_24.jpg

Github 介绍

主要介绍网站的主界面和仓库的主界面内容。Github 主界面经历了一次改版,但是主体内容与之前相差不大。

网站主界面

网站主界面如下,主界面非常丰富。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_25.jpg

仓库主界面

这里只列举了部分的仓库主界面。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_26.jpg

远程仓库

Git 支持关联多个远程仓库,只要仓库实现了 git 协议。一般来说,有两种方式:

  • 完全从无到有克隆远程仓库
  • 将本地的仓库和远程仓库关联起来

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_1.jpg

Git 会在本地维护一个远程仓库的文件夹,存储远程仓库各个分支的指针信息。

协作方式

基于 Github 协作开发有两种方式,一种是基于团队,一种是基于 fork+pr 的方式。

如果是基于团队的话,直接给开发人员设置权限,然后开发人员可以使用 git push 提交代码;而 fork+pr 的方式相对麻烦一点。事实上,开发人员较多的时候,不同的开发人员角色不同,需要将这两种方式结合起来,给代码仓设置团队的权限,然后在团队中有 committercoder 等角色,负责审阅代码和提交代码。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_2.jpg

Github 工作流

下面的图和右边的示例代码给出了 github 的工作流,这也是开源社区广泛采用的一种流程。

划重点:push 之前一定要同步上游仓库。同步命令我喜欢用 git fetech + git rebase

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_3.jpg

可视化工具

工欲善其事,必先利其器。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_4.jpg

分享总结

最后一页是总结。

https://lynne-markdown.oss-cn-hangzhou.aliyuncs.com/img/2023-07-11-img_5.jpg

下载链接

提供了由我制作的PPT和由此PPT导出的PDF,按需下载即可。个人的PPT制作水平一般,还请见谅~

📃 PDF下载链接

📃 PPT下载链接

☕ 如果本文帮助到你,可以点击下方的赞赏按钮请我喝杯咖啡~

参考引用

[1] https://ericsink.com/vcbe/html/bk01-toc.html

[2] https://www.liaoxuefeng.com/wiki/896043488029600

[3] https://git-scm.com/

[4] https://github.com/

[5] https://grahamlopez.org/git/git_philosophy.html

Buy me a coffee~
roderick 支付宝支付宝
roderick 微信微信
0%