├── lecture10 ├── imgs │ ├── diff.png │ ├── colla.png │ └── merge.png └── README.md ├── lecture07 ├── git-commit.png ├── git-hooks-demo.png └── README.md ├── lecture08 ├── imgs │ ├── pr-tab.png │ ├── watch.png │ ├── draft-pr.png │ ├── homepage.png │ ├── issue-tab.png │ ├── new-repo.png │ ├── repo-page.png │ ├── shortcuts.png │ ├── trending.png │ ├── create-repo.png │ ├── discussion.png │ ├── issue-template.png │ ├── advanced-search.png │ ├── gitee-import-repo.png │ └── new-repo-button.png └── README.md ├── lecture03 ├── figures │ ├── merge.png │ ├── branches.png │ ├── mergetool.png │ ├── branch_file.png │ ├── merge_error.png │ └── brach_message.png └── README.md ├── lecture05 ├── imgs │ └── objects_1.jpg └── README.md ├── lecture09 ├── Assets │ ├── tgit_1.png │ ├── tgit_10.png │ ├── tgit_11.png │ ├── tgit_12.png │ ├── tgit_13.png │ ├── tgit_14.png │ ├── tgit_15.png │ ├── tgit_16.png │ ├── tgit_17.png │ ├── tgit_18.png │ ├── tgit_19.png │ ├── tgit_2.png │ ├── tgit_20.png │ ├── tgit_21.png │ ├── tgit_22.png │ ├── tgit_3.png │ ├── tgit_4.png │ ├── tgit_5.png │ ├── tgit_6.png │ ├── tgit_7.png │ ├── tgit_8.png │ ├── tgit_9.png │ ├── vsgit_1.png │ ├── vsgit_2.png │ ├── vsgit_3.png │ ├── github_desktop.png │ ├── github_desktop_1.png │ ├── github_desktop_10.png │ ├── github_desktop_11.png │ ├── github_desktop_12.png │ ├── github_desktop_2.png │ ├── github_desktop_3.png │ ├── github_desktop_4.png │ ├── github_desktop_5.png │ ├── github_desktop_6.png │ ├── github_desktop_7.png │ ├── github_desktop_8.png │ └── github_desktop_9.png └── README.md ├── lecture01 ├── figures │ ├── Git_gui.png │ ├── centralized.png │ └── distributed.png └── README.md ├── lecture06 ├── imgs │ └── gitflow示意图.png └── README.md ├── .gitignore ├── README.md ├── LICENSE ├── lecture04 └── README.md └── lecture02 └── README.md /lecture10/imgs/diff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture10/imgs/diff.png -------------------------------------------------------------------------------- /lecture07/git-commit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture07/git-commit.png -------------------------------------------------------------------------------- /lecture08/imgs/pr-tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/pr-tab.png -------------------------------------------------------------------------------- /lecture08/imgs/watch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/watch.png -------------------------------------------------------------------------------- /lecture10/imgs/colla.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture10/imgs/colla.png -------------------------------------------------------------------------------- /lecture10/imgs/merge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture10/imgs/merge.png -------------------------------------------------------------------------------- /lecture03/figures/merge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture03/figures/merge.png -------------------------------------------------------------------------------- /lecture05/imgs/objects_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture05/imgs/objects_1.jpg -------------------------------------------------------------------------------- /lecture07/git-hooks-demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture07/git-hooks-demo.png -------------------------------------------------------------------------------- /lecture08/imgs/draft-pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/draft-pr.png -------------------------------------------------------------------------------- /lecture08/imgs/homepage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/homepage.png -------------------------------------------------------------------------------- /lecture08/imgs/issue-tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/issue-tab.png -------------------------------------------------------------------------------- /lecture08/imgs/new-repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/new-repo.png -------------------------------------------------------------------------------- /lecture08/imgs/repo-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/repo-page.png -------------------------------------------------------------------------------- /lecture08/imgs/shortcuts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/shortcuts.png -------------------------------------------------------------------------------- /lecture08/imgs/trending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/trending.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_1.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_10.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_11.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_12.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_13.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_14.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_15.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_16.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_17.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_18.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_19.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_2.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_20.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_21.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_22.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_3.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_4.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_5.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_6.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_7.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_8.png -------------------------------------------------------------------------------- /lecture09/Assets/tgit_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/tgit_9.png -------------------------------------------------------------------------------- /lecture09/Assets/vsgit_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/vsgit_1.png -------------------------------------------------------------------------------- /lecture09/Assets/vsgit_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/vsgit_2.png -------------------------------------------------------------------------------- /lecture09/Assets/vsgit_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/vsgit_3.png -------------------------------------------------------------------------------- /lecture01/figures/Git_gui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture01/figures/Git_gui.png -------------------------------------------------------------------------------- /lecture03/figures/branches.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture03/figures/branches.png -------------------------------------------------------------------------------- /lecture03/figures/mergetool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture03/figures/mergetool.png -------------------------------------------------------------------------------- /lecture06/imgs/gitflow示意图.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture06/imgs/gitflow示意图.png -------------------------------------------------------------------------------- /lecture08/imgs/create-repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/create-repo.png -------------------------------------------------------------------------------- /lecture08/imgs/discussion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/discussion.png -------------------------------------------------------------------------------- /lecture01/figures/centralized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture01/figures/centralized.png -------------------------------------------------------------------------------- /lecture01/figures/distributed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture01/figures/distributed.png -------------------------------------------------------------------------------- /lecture03/figures/branch_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture03/figures/branch_file.png -------------------------------------------------------------------------------- /lecture03/figures/merge_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture03/figures/merge_error.png -------------------------------------------------------------------------------- /lecture08/imgs/issue-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/issue-template.png -------------------------------------------------------------------------------- /lecture03/figures/brach_message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture03/figures/brach_message.png -------------------------------------------------------------------------------- /lecture08/imgs/advanced-search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/advanced-search.png -------------------------------------------------------------------------------- /lecture08/imgs/gitee-import-repo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/gitee-import-repo.png -------------------------------------------------------------------------------- /lecture08/imgs/new-repo-button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture08/imgs/new-repo-button.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_1.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_10.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_11.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_12.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_2.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_3.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_4.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_5.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_6.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_7.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_8.png -------------------------------------------------------------------------------- /lecture09/Assets/github_desktop_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/datawhalechina/faster-git/HEAD/lecture09/Assets/github_desktop_9.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # General 2 | .DS_Store 3 | 4 | # Thumbnails 5 | ._* 6 | 7 | # Windows 8 | Thumbs.db 9 | 10 | *~ 11 | 12 | # Vim Swap 13 | [._]*.sw[a-p] 14 | 15 | .vscode/* 16 | -------------------------------------------------------------------------------- /lecture01/README.md: -------------------------------------------------------------------------------- 1 | # 第一章 Git简介 2 | ## 1.1 版本控制 3 | ### 1.1.1 什么是版本控制系统? 4 | 大家平常有没有遇到这种情况: 5 | 我们的初始代码能跑通,但是随着我们加新的功能时,加着加着发现代码出现了问题。有些同学可能会疯狂ctrl+z进行回退,这种方法太过麻烦。于是,我们想有没有一种系统,可以帮助我们记录我们对代码的变化,并且可以恢复到指定的某个版本的代码。 6 | 7 | 这种系统其实就是版本控制系统,有了它我们就可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,我们可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。使用版本控制系统通常还意味着,就算我们乱来一气把整个项目中的文件改的改删的删,我们也照样可以轻松恢复到原先的样子。但额外增加的工作量却微乎其微。 8 | 9 | ### 1.1.2 集中式版本控制vs分布式版本控制系统 10 | 现有的版本控制系统主要有两种形式:集中式和分布式。 11 | 12 | 集中式版本控制系统:集中式版本库集中存放于一个单一的中央服务器的,保存所有文件的修订版本。在协同工作时,人们需要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。因此,集中式版本控制系统需要在联网的情况下才能工作。 13 | 14 | ![](./figures/centralized.png) 15 | 16 | 集中式版本控制有一个很致命的缺点就是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 17 | 18 | 分布式版本控制系统: 19 | 分布式版本控制系统根本没有“中央服务器”, 20 | 我们每次是把代码仓库完整地镜像下来,包括完整的历史记录。这使得每个人的电脑上都是一个完整的版本库。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。同时,我们也不需要像联网就可以进行工作。每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。 21 | 22 | 但是在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能我们不在一个局域网内,两台电脑互相访问不了。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑或者服务器,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。这也是我们在GitHub建立repo的原因。 23 | 24 | ![](./figures/distributed.png) 25 | 26 | 27 | ## 1.2 Git简介和历史 28 | 29 | 说到Git的诞生,我们就不得不提一下Linux之父 Linus Torvalds和Linux。Linux 内核开源项目有着为数众多的参与者。 绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到2002年,整个项目组开始启用一个专有的分布式版本控制系统BitKeeper来管理和维护代码。 30 | 31 | 但是到了2005年,开发BitKeeper的商业公司认为Linux开发者内部有人对BitKeeper内部使用的协议进行逆向工程,因此他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。 这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。 他们对新的系统制订了若干目标: 32 | 33 | - 速度 34 | 35 | - 简单的设计 36 | 37 | - 对非线性开发模式的强力支持(允许成千上万个并行开发的分支) 38 | 39 | - 完全分布式 40 | 41 | - 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量) 42 | 43 | 于是在Linux之父Linus Torvalds的带领下用了10天编写出了第一个Git版本。自诞生以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。 它的速度飞快,极其适合管理大项目,有着令人难以置信的非线性分支管理系统(参见 Git 分支)。 44 | 45 | ## 1.3 Git的安装 46 | 关于Git的安装,我们可以访问Git book所给的下载教程进行下载,我们在下面的几部分也是仅做简要叙述。具体链接 --> [安装 Git](https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git) 47 | ### 1.3.1 Linux 48 | 我们可以在terminal输入`git`命令查看系统有没有安装git。如果没有安装的话,我们可以访问git关于linux和unix的安装页面,输入对应的安装命令。网页链接 --> [Download for Linux and Unix](https://git-scm.com/download/linux) 49 | 对于常见的Debian和Ubuntu Linux,我们可以通过 50 | ```bash 51 | sudo apt-get install git 52 | ``` 53 | 就可以直接完成Git的安装。 54 | ### 1.3.2 Windows 55 | 在 Windows 上安装 Git 也有几种安装方法。 我们也可以打开 https://git-scm.com/downloads 进行下载安装。安装好后我们可以打开Git bash。 56 | ![](./figures/Git_gui.png) 57 | 另一个简单的方法是安装 GitHub Desktop。 该安装程序包含图形化和命令行版本的 Git。 它也能支持 Powershell,提供了稳定的凭证缓存和健全的换行设置。 58 | ### 1.3.3 macOS 59 | 在 Mac 上安装 Git 有多种方式。 最简单的方法是安装 Xcode Command Line Tools。 Mavericks (10.9) 或更高版本的系统中,在 Terminal 里尝试首次运行 git 命令即可。 60 | ```bash 61 | git --version 62 | ``` 63 | 如果没有我们安装过命令行开发者工具,terminal也会提示你安装。 64 | 65 | 如果我们想安装更新的版本,可以使用二进制安装程序。 官方维护的 macOS Git 安装程序可以在 Git 官方网站下载,网址为 https://git-scm.com/download/mac。 66 | ### 1.3.4 初次运行Git的配置 67 | 当我们安装好Git后,还需要在Git bash或者terminal进行一些相关设置,以下设置仅需设置一次即可。 68 | ```bash 69 | git config --global user.name "Your Name" 70 | git config --global user.email "email@example.com" 71 | ``` 72 | 除此之外,Git还有很多设置,包括常用编辑器等,大家可以键入以下命令查看自己的设置并进行修改。 73 | ```bash 74 | git config --list 75 | ``` 76 | ## 1.4 相关学习资源 77 | 在这里给大家推荐几个学习Git的资源,希望可以帮助大家在未来对Git有着更深的了解。 78 | 79 | - [Git Book](https://git-scm.com/book/zh/v2) 80 | - [廖雪峰Git教程](https://www.liaoxuefeng.com/wiki/896043488029600) 81 | - [Git权威指南](https://gotgit.readthedocs.io/en/latest/index.html) 82 | - [freenode](https://freenode.net/) 83 | - [Github-cheat-sheet](https://github.com/tiimgreen/github-cheat-sheet) 84 | - [动手学Git](https://www.freeaihub.com/git/index.html) 85 | - [learn git branching](https://learngitbranching.js.org/?locale=zh_CN) 86 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # faster-git 2 | 3 | 课程内容: 4 | 5 | 1. [第一章 Git简介](lecture01/README.md) 6 | 1. [第二章 Git基础命令](lecture02/README.md) 7 | 1. [第三章 Git分支管理](lecture03/README.md) 8 | 1. [第四章 Git工具](lecture04/README.md) 9 | 1. [第五章 Git内部原理](lecture05/README.md) 10 | 1. [第六章 GitFlow工作流实战](lecture06/README.md) 11 | 1. [第七章 Git提交规范](lecture07/README.md) 12 | 1. [第八章 Github/Gitee使用说明](lecture08/README.md) 13 | 1. [第九章 Git可视化工具下载](lecture09/README.md) 14 | 1. [第十章 Git团队协作以及合并时的diff工具](lecture10/README.md) 15 | 16 | 课程安排: 17 | | 任务信息 | 18 | |-------------------------------------------------------------| 19 | | Task01:Git基础:第一、二章(2天) | 20 | | Task02:Git分支管理及工具使用:第三、四章(2天) | 21 | | Task03:Git内部原理及工作流实战:第五、六章(3天) | 22 | | Task04:Git提交规范及Github/Gitee的使用:第七、八章(3天) | 23 | | Task05:Git可视化工具下载和团队协作:第九、十章(3天) | 24 | 25 | 课程贡献人员:(排名不分先后,按章节顺序排序) 26 | | 成员  | 个人简介 | 负责章节| 27 | | --------------- | --------------------------------------------------- |-------| 28 | | 牛志康 | Datawhale成员,西安电子科技大学本科生 | lecture01,lecture03| 29 | |朱松青| Datawhale成员,上海交通大学研究生|lecture02| 30 | |徐祥军|在职,互联网金融、后端开发|lecture04| 31 | |李碧涵|Datawhale成员,在职|lecture05| 32 | | 宋泽山 | Datawhale成员,算法开发 | lecture06| 33 | |王晓亮|Datawhale成员,在职|lecture07| 34 | |张翔宇|华东师范大学研究生|lecture08| 35 | | 沈豪 | Datawhale成员,复旦大学网安博士在读 |lecture09| 36 | | 夏峻 | Datawhale成员,上海交通大学研究生 |lecture10| 37 | 38 | # Contributing 39 | 40 | 主分支为`main` 41 | ## Workflow 42 | 43 | 关于本项目中出现的问题或者其他补充材料,我们鼓励大家提出pr和issue,我们将在短时间内进行解答。本项目使用`Forking`工作流,具体参考[atlassian文档](https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow) 44 | 45 | 大致步骤如下: 46 | 47 | 1. 在GitHub上Fork本仓库 48 | 1. Clone Fork后的个人仓库 49 | 1. 设置`upstream`仓库地址,并禁用`push` 50 | 1. 使用分支开发,课程分支名为`lecture{#NO}`,`#NO`保持两位,如`lecture07`,对应课程目录 51 | 1. PR之前保持与原始仓库的同步,之后发起PR请求 52 | 53 | 命令示例: 54 | 55 | ```shell 56 | # fork 57 | # clone 58 | git clone git@github.com:USERNAME/faster-git.git 59 | 60 | # set upstream 61 | git remote add upstream git@github.com:datawhalechina/faster-git.git 62 | # disable upstream push 63 | git remote set-url --push upstream DISABLE 64 | # verify 65 | git remote -v 66 | # some sample output: 67 | # origin git@github.com:tomowang/faster-git.git (fetch) 68 | # origin git@github.com:tomowang/faster-git.git (push) 69 | # upstream git@github.com:datawhalechina/faster-git.git (fetch) 70 | # upstream DISABLE (push) 71 | 72 | # do your work 73 | git checkout -b lecture07 74 | # edit and commit and push your changes 75 | git push -u origin lecture07 76 | 77 | # keep your fork up to date 78 | ## fetch upstream main and merge with forked main branch 79 | git fetch upstream 80 | git checkout main 81 | git merge upstream/main 82 | ## rebase brach and force push 83 | git checkout lecture07 84 | git rebase main 85 | git push -f 86 | ``` 87 | 88 | ## Commit Message 89 | 90 | 提交信息使用如下格式:`: ` 91 | 92 | ``` 93 | : 94 | │ │ 95 | │ └─⫸ Summary in present tense. Not capitalized. No period at the end. 96 | │ 97 | └─⫸ Commit Type: lecture{#NO}|others 98 | ``` 99 | 100 | `others`包括非课程相关的改动,如本`README.md`中的变动,`.gitignore`的调整等。 101 | 102 | ## 关注我们 103 |
Datawhale是一个专注AI领域的开源组织,以“for the learner,和学习者一起成长”为愿景,构建对学习者最有价值的开源学习社区。关注我们,一起学习成长。
104 | 105 | ## LICENSE 106 | 知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 107 | 108 | -------------------------------------------------------------------------------- /lecture10/README.md: -------------------------------------------------------------------------------- 1 | # 第十章 Git团队协作以及合并时的diff工具 2 | 3 | > Author:JunXia 4 | 5 | ## 10.0 引言 6 | 7 | 在许多的多人组队(编程)任务、尤其是需要进行交叉修改代码中部分段落的时候,Git这样一个分布式版本控制系统的优势就体现出来,或许这也是一些人开始接触和使用Git的原因。(笔者也是如此!) 8 | 9 | 实际上本项目也是通过这样团队协作的形式来完成的。在本项目的最后,我们也简单介绍一下Git团队协作通常的“打开方式”。 10 | 11 | [//]: # "在实际项目开发工作中,常常会有自测、联调、提测、线上紧急修复等多工作环节,对应可能需要本地、内测、开发、测试、生产等多环境部署代码的需求,对应每个环节会产生不同的分支;本⽂将从Git-Flow模型原理出发,通过命令行演示实际可操作⼿段并进⾏总结,最终希望Git-Flow在实际项⽬中应⽤起来,从⽽⾼效完成代码开发、版本管理等实际⼯作。" 12 | 13 | [//]: # 14 | [//]: # "(注:不同的公司或者不同的项目的GitFlow工作流模型标准也不同,具体以实际应用为准;本文提供的为常用模板,较为全面和通用,建议多加练习,达到熟练掌握的程度)" 15 | 16 | 17 | 18 | ## 10.1 代码(提交)推送到远程仓库的一般方式 19 | 20 | [//]: # "仍以此前在第三章所提到的liaoxf?" 21 | 22 | ### 10.1.1 粗放式的提交:加入仓库协作者,即可获得直接push的权限(优点:更方便&快捷) 23 | 以Github为例,首先,仓库管理员(一般是仓库的创建者或者拥有者)先在Github上仓库的Settings页面中点击下图的`Add People`按钮,添加合作者: 24 | ![](./imgs/colla.png) 25 | 26 | 约定大致的Commit Message(提交信息)的格式,有fix,update,merge等词语放在提交消息的开头,来大致表示这次提交的大致内容。 27 | 28 | ### 10.1.2 标准式的提交与合并:运用Pull Requests(优点:更严谨&利于把控每个版本的质量。例如Forking 工作流) 29 | (Pull Requests的基本介绍可以参阅第八章的Pull Requests和提交PR词条。) 30 | 31 | 本项目采取的正是这种方式,更具体一些来说,使用的是Forking 工作流,也就是先把仓库Fork到个人账号,(为了避免误操作影响主分支,往往还需设置禁用向主仓库直接push,也就是禁用前一节所述的粗放式提交),然后再用PR请求的方式将fork的修改提交给仓库管理员审核,审核通过之后再合并入主分支;可以参考[atlassian文档](https://www.atlassian.com/git/tutorials/comparing-workflows/forking-workflow) 32 | 33 | 此外,这类比较正式的工作流也往往需要更加严谨的提交信息格式,例如本项目提交信息采用如下格式: 34 | 提交信息使用如下格式:`: ` 35 | 36 | ``` 37 | : 38 | │ │ 39 | │ └─⫸ Summary in present tense. Not capitalized. No period at the end. 40 | │ 41 | └─⫸ Commit Type: lecture{#NO}|others 42 | ``` 43 | 44 | `others`包括非课程相关的改动,如本`README.md`中的变动,`.gitignore`的调整等。 45 | 46 | 47 | 实际上一些更大型的项目或者企业,可能会涉及到统筹配置多个仓库及其参与者的权限,因此会用到Projects以及Organization等功能。 48 | 49 | ## 10.2 代码比较与冲突处理 50 | 51 | 与团队协作相伴的往往就是修改冲突(Conflit)的问题了,第三章中已经提到了一些处理冲突的一般方法(例如手动修改和暂时终止Merge进行排查),这里介绍一个著名的用于进行代码比较的软件——Beyond Compare(或者简称bc,其官网为https://www.scootersoftware.com/download.php ,下文中所使用的版本为4.4,其他版本可能略有差异,比如对一些路径中含有的版本号数字可能需要微调,但主要功能基本一致)。 52 | 53 | 将bc用作代码比较工具可以较为方便地在git中进行配置,且拥有较成熟的图形化界面(对 不同系统的换行符CR、lF,也能较为合理地自动处理),相比与手动解决冲突的效率还是会好许多。 54 | 55 | ### 10.2.1 配置bc 56 | 在bc完成安装之后: 57 | #### 直接用git命令配置 58 | 其中`C:/Program Files (x86)/Beyond Compare 4`为(32位版本的)bc4的默认安装位置,如果安装时自定义了位置,需要相应地修改。(此外,因代码中有若干个带`\ `的转义字符,请注意不要因手滑而删除之。) 59 | (这里是直接做了git的全局配置,如果只想让它在某个代码仓库生效可以将下面这段中的global都改为local。) 60 | ```shell 61 | $ git config --global diff.tool bc4 62 | $ git config --global difftool.bc4.cmd "\"C:/Program Files (x86)/Beyond Compare 4/BComp.exe\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\"" 63 | $ git config --global difftool.bc4.trustExitCode true 64 | 65 | $ git config --global merge.tool bc4 66 | $ git config --global mergetool.bc4.cmd "\"C:/Program Files (x86)/Beyond Compare 4/BComp.exe\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\"" 67 | $ git config --global mergetool.bc4.trustExitCode true 68 | ``` 69 | 70 | 如果输入命令后均无报错,则可跳过下面带括号的这个小节。 71 | 72 | #### (或者修改配置文件 73 | 打开global(全局)或者local(某个项目)的配置文件,全局配置文件一般在用户文件夹下,可用如下命令打开 74 | ```shell 75 | $ cd ~ 76 | $ vim .gitconfig 77 | ``` 78 | 而local的配置文件则是在本地代码仓库文件夹的.git目录下的config文件。当然,在local中修改就不会在其他代码仓库文件夹里共用这个配置了。 79 | 80 | 在文件尾部新建一行,追加如下配置代码 并保存: 81 | ``` 82 | [diff] 83 | tool = bc4 84 | [difftool "bc4"] 85 | cmd = \"C:/Program Files (x86)/Beyond Compare 4/BComp.exe\" \"$LOCAL\" \"$REMOTE\" 86 | [merge] 87 | tool = bc4 88 | [mergetool "bc4"] 89 | cmd = \"C:/Program Files (x86)/Beyond Compare 4/BComp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\" 90 | trustExitCode = true 91 | ``` 92 | ) 93 | 94 | ### 10.2.2 使用bc 95 | #### 情形1:在merge中使用 96 | 97 | [//]: # "," 98 | 也就是在第三章所提到的“融合到主分支上时就会发生冲突。如下图所示:”(此时分支名右侧往往还会出现MERGING的高亮提示。) 99 | ![](../lecture03/figures/merge_error.png) 100 | 101 | 此时直接用命令: 102 | 103 | ``` 104 | $ git mergetool 105 | ``` 106 | 即可直接bc的界面: 107 | ![](./imgs/merge.png) 108 | bc较好的功能之一正是在于将"<<<<<<","=======",">>>>>>"等分割线转换为更直观的三个完整的小窗口显示,并用色块来标记并可以直接点击选择保留哪些部分,可以直接点击`Next Section`以及 `Prev Section`在各个差异区段间切换,中间小窗口(文件名中一般会加入BASE)的是差异版本的最近共同祖先,左右分别是冲突的两个版本,修改合并后的完成效果显示在屏幕下半区的大窗口中。最终对比和修改完成并保存后可直接关闭窗口,如有大于一个有差异的文件,bc会自动打开后续需对比的文件。 109 | 110 | 保存完成,继续到git bash进行commit以及push就可以愉快地完工啦!! 111 | 112 | #### 情形2:作为替换diff命令的一个较直观的图形化界面 113 | 在一般情况下可以直接将第三章的diff 命令直接替换为difftool,即可在bc的界面看到diff状态的内容,如下图: 114 | ![](./imgs/diff.png) 115 | 仍可以类似地点击`Next Section`以及 `Prev Section`在各个差异区段间切换,并进行其他修改操作。 116 | 117 | -------------------------------------------------------------------------------- /lecture03/README.md: -------------------------------------------------------------------------------- 1 | # 第三章 Git分支管理 2 | ## 3.1 分支的简介 3 | Git最重要的运用场景是多人协同开发,但是如何能保证每个人之间的开发不影响其他人的开发进程,Git 分支的出现就是解决了这个问题,使得每个人之间的开发是独立的,互不影响的。 4 | 5 | 有的人将 Git 的分支模型称为它的“必杀技特性”,也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出。 为何 Git 的分支模型如此出众呢? 因为Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。 与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。 理解和精通这一特性,你便会意识到 Git 是如此的强大而又独特,并且从此真正改变你的开发方式。 6 | 7 | ## 3.2 分支的相关操作 8 | ### 3.2.1 分支的创建 9 | Git分支的创建十分简单,我们可以使用`git branch`来查看现有的分支或创建新的分支。当不带任何命令参数时,输入`git branch`可以帮助我们查看当前项目所拥有的全部分支。并且Git会使用*来标明我们当前所处的分支上。 10 | ```bash 11 | git branch 12 | ``` 13 | ```bash 14 | * master 15 | ``` 16 | 当我们想要新增加新的分支时,只需要在`git branch`命令后面加上我们想要新建的分支的名称即可。 17 | ```bash 18 | # 创建issue102的分支 19 | git branch issue102 20 | # 查看现有的所有分支 21 | git branch 22 | ``` 23 | ```bash 24 | # 现有的分支 25 | issue102 26 | *master 27 | ``` 28 | 我们可以发现虽然创建了`issue102`的分支,但是当前分支还是在master上。我们可以通过`git checkout`命令来进行切换分支。 29 | ### 3.2.2 分支的切换 30 | 在上面的例子中我们发现虽然创建了新的分支,但是当前分支还是在`master`分支上,我们需要通过`git checkout`命令切换到新建的`issue102`分支上,来进行后续的开发操作。 31 | ```bash 32 | git checkout issue102 33 | ``` 34 | ```bash 35 | Switched to branch 'issue102' 36 | ``` 37 | 这是我们可以在查看下当前分支的状态,我们可以发现当前分支已经转换到了`issue102`分支上。 38 | ```bash 39 | git branch 40 | * issue102 41 | master 42 | ``` 43 | 切换分支后,我们就可以进行自己的开发。分支上的文件状态是不同的。我们可以通过下面的例子有着更深入的了解。 44 | ```bash 45 | # 切换分支 46 | git checkout issue102 47 | 48 | # 在分支上创建下新的文件 49 | touch issue102.md 50 | git add issue102.md 51 | git commit -m "update issue102.md" 52 | 53 | touch issue102.html 54 | git add issue102.html 55 | git commit -m "update issue102.html" 56 | ``` 57 | 在完成上述命令后,我们可以通过`git log --oneline`检查下当前Git的记录。 58 | ```bash 59 | cd836b0 (HEAD -> issue102) update issue102.html 60 | 7575f02 update issue102.md 61 | 242c407 (master) update hello.md 62 | ``` 63 | 我们可以发现issue102分支上的记录与master的记录间隔开了。除此之外,当我们切换回主分支后,我们还会发现master分支下没有新建的issue102.md和issue102.html两个文件。正如下图所示: 64 | ![](./figures/branch_file.png) 65 | ### 3.2.3 分支的合并 66 | 当我们在分支上完成来开发工作后,我们需要将我们在当前分支进行的工作合并到主分支上。首先我们需要切回需要合并到的分支上,此处以`issue102`合并到`master`上为例子进行演示。 67 | ```bash 68 | # 切换回主分支 69 | git checkout master 70 | # 使用git merge 进行合并 71 | git merge issue102 72 | # git branch --no-merged 73 | # 查看所有未合并工作的分支 74 | ``` 75 | ![](./figures/merge.png) 76 | 我们可以发现原来在`issue102`分支上的文件已经合并到了主分支上了,并且`issue102`分支还存在。大家可以根据实际的需求进行分支的保留与删除。 77 | 78 | 79 | 有时候分支的合并不会一番顺利,当我们在两个分支中对同一个文件的同一个部分进行了不同的修改,Git就没有办法顺利的合并他们,会在合并的时候产生合并冲突。比如我们在`issue102`分支和`master`分支下对`issue102.md`文件进行了修改,当我们将issue102分支融合到主分支上时就会发生冲突。如下图所示: 80 | ![](./figures/merge_error.png) 81 | 82 | 我们也可以通过`git status`查看命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件。当出现矛盾后,合并的文件内容将会出现"<<<<<<","=======",">>>>>>"等分割线来进行标记。如下图所示: 83 | 84 | ![](./figures/brach_message.png) 85 | 86 | 当出现了矛盾时,我们需要进行手动解决或者放弃合并。 87 | - 手动合并 88 | 89 | 手动合并的方法很简单,就是我们选择我们要保留的代码,然后再把>>>>>, ======, <<<<<<这些提示行给去掉。最后重新进行add commit的操作即可。 90 | - 放弃合并 91 | 92 | 当我们发现冲突所导致的改动量很大时,我们可以选择放弃该次的合并。我们可以使用`git merge --abort`放弃此次的融合。如果我们在运行了git merge之后又进行了一些人为的改动,那么在abort之后,所进行的改动也会被回滚掉。 93 | 94 | - mergetool 95 | 96 | 除了手动合并以及放弃合并之外,我们还有一些其他的合并工具。git官方开发了一个专门用来合并的工具,叫做git mergetool(下图所示),它会将找到一份两个分支的祖先代码作为base(基准),然后再将两个分支的改动都列举出来作为对比,让我们在git编辑器当中决定要留下什么。在此处,我们不做过多的阐述,感兴趣的同学可以点击下方链接进行查看。 97 | 98 | 1. [Use vimdiff as git mergetool](https://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/) 99 | 2. [使用vimdiff作为git mergetool](https://kinboyw.github.io/2018/10/09/Use-Vimdiff-As-Git-Mergetool/) 100 | 3. [git-mergetool](https://www.lhsz.xyz/read/git-doc-zh/docs-16.md) 101 | 102 | ![](./figures/mergetool.png) 103 | 104 | ### 3.2.4 分支推送到远程 105 | 在很多情况下,我们都需要将分支推送到远程,在这一部分,我们将讲一些远程的相关操作。 106 | 首先,我们可以使用`git remote -v`查看远程库的详细信息。会显示我们可以抓取或推送的origin地址。 107 | ```bash 108 | $ git remote -v 109 | origin git@github.com:ProjectOwner/ProjectName.git (fetch) 110 | origin git@github.com:ProjectOwner/ProjectName.git (push) 111 | ``` 112 | 当我们需要推送本地分支到远程时,需要指定具体的本地分支。 113 | ```bash 114 | # 推送本地的master分支到远程 115 | git push origin master 116 | # 推送本地的issue102分支到远程 117 | git push origin issue102 118 | ``` 119 | 但是当我们多人协作进行开发的时候,可能会出现远程分支比我们本地更新的情况,这时,我们就需要使用`git pull`的命令来试图合并。如果合并出现冲突时,我们需要解决冲突再提交。在这部分,推荐大家可以看下廖雪峰老师的Git教程中的 120 | [多人协作](https://www.liaoxuefeng.com/wiki/896043488029600/900375748016320),如有侵权,请联系告知。 121 | ### 3.2.5 分支的删除 122 | 在Git中没有什么分支是不可以删除的(除了当前所在的分支不能删除),包括`master`分支也是可以进行删除。 123 | Git的分支删除可以分为删除本地分支和远程分支。 124 | - 删除本地分支 125 | ```bash 126 | # branchName 是需要删除的本地分支名字 127 | git branch -d branchName 128 | ``` 129 | 当我们想强行删除分支时,只需要将参数d改为D即可。 130 | - 删除远程分支 131 | ```bash 132 | # origin 是远程的主机名 133 | # branch 需要删除的远程分支 134 | git push origin --delete branch 135 | ``` 136 | ### 3.2.6 分支的重命名 137 | 当我们需要重命名分支的名称时,我们可以使用`git branch`命令来进行,具体方式如下: 138 | ```bash 139 | # oldBranchName: 旧分支名 140 | # newBranchName :新分支名 141 | git branch -m oldBranchName newBranchName 142 | ``` 143 | 当我们想要将改名后的分支推送到远程时,我们需要进行如下操作: 144 | ```bash 145 | git branch -m oldBranchName newBranchName # 将本地的分支进行重命名 146 | git push origin newBranchName # 将新的分支推送到远程 147 | git push --delete origin oldBranchName # 删除远程的旧的分支 148 | ``` 149 | ## 3.3 分支开发工作流 150 | 当我们已经了解了分支的操作后,我们应该考虑使用一种怎样的方式使我们最大化的使用分支操作的优点。在接下来的这部分中,我们将会介绍一些常见的分支开发工作流程。而正是由于分支管理的便捷,才衍生出这些典型的工作模式,我们以后可以根据项目实际情况进行使用。 151 | 152 | ### 3.3.1 长期分支 153 | 在整个项目开发周期的不同阶段,我们可以同时拥有多个分支;然后我们可以定期地把某些主题分支合并入其他分支中。许多使用 Git 的开发者都喜欢使用这种方式来工作,比如只在 master 分支上保留完全稳定的代码——有可能仅仅是已经发布或即将发布的代码。 他们还有一些名为 develop 或者 next 的平行分支,被用来做后续开发或者测试稳定性——这些分支不必保持绝对稳定,但是一旦达到稳定状态,它们就可以被合并入 master 分支了。这样,在确保这些已完成的主题分支(短期分支,比如之前的 issue102 分支)能够通过所有测试,并且不会引入更多 bug 之后,就可以合并入主干分支中,等待下一次的发布。 154 | ![](./figures/branches.png) 155 | 156 | ### 3.3.2 短期分支 157 | 短期分支也可以叫做主题分支,它的作用是用来实现某一种特性或者相关工作(修复bug,开发产品新特性)。比如当我们的产品出现了bug时,我们应该新建一个分支并起名为bug分支,并在该分支上进行bug的修复,等我们的代码确定不会引起其他bug时,我们就可以合并到主分支上进行修复。当我们看见issue时,我们也可以使用同样的方式来解决issue的问题。常见的短期分支还有上面提到的develop,topic分支。在实际开发中,我们应该按照以下几个基本原则进行分支开发工作流程 158 | 159 | 1. master分支应该是最稳定的,也就是仅用来发布新版本,平时不能直接在上面进行操作,应该保存在远程。 160 | 2. 短期分支是我们干活的分支,短期分支可以不用上传到远程,当我们完成了bug的修复,新功能的开发时才需要合并到主分支上。 161 | 3. 多使用分支来进行开发工作。 162 | 163 | -------------------------------------------------------------------------------- /lecture09/README.md: -------------------------------------------------------------------------------- 1 | # 第九章 Git 图形工具 2 | 3 | > Author:shenhao 4 | 5 | ## 9.0 前言:为什么要使用 Git GUI ? 6 | 7 | Git 虽然作为一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,但在实际项目研发过程中,开发人员通常只会使用几个常见的命令进行协同工作。从之前的章节,我们已经深入了解到了 Git 的基本原理和众多命令,有些命令由于不常使用,较难记忆。因此,对于多数项目开发者而言,在终端上运行的纯文本命令并不是最佳的选择;有时候可视化图形界面更符合用户的习惯。Git GUI 为用户提供了一个可视化的图形界面,允许项目开发者通过简单的点击便捷地使用Git,从而不需要在终端上手动输入繁多的文本命令。这样一来,开发者能够更高效、更便捷地进行项目版本管理。 8 | 9 | 本章将介绍以下三种主流的 Git GUI 图形化工具,帮助开发者能更为轻松、高效的利用 Git 进行项目版本管理。 10 | 11 | - **GitHub Desktop** 12 | - **TortoiseGit** 13 | - **Vscode Git** 14 | 15 | 在本教程中,只介绍了部分Git GUI 图形客户端, 更多详细内容可以查看✅[ Git 官网](https://git-scm.com/downloads/guis/)。 16 | 17 | ## 9.1 GitHub Desktop 18 | 19 | [GitHub Desktop](https://desktop.github.com/) 可能是所有 Git 可视化应用中最著名的方案。几乎所有开发人员都熟悉 GitHub ,而 Github Desktop 正是 Github 推出的开源 Git GUI 图形客户端。可以在Windows和Macos平台上进行使用,目前暂不支持Linux平台。 20 | 21 | ### 9.1.1 基本使用 22 | 23 | 首先进入官网,根据不同的系统,下载并安装对应版本的 [GitHub Desktop](https://desktop.github.com/) 。 24 | 25 | 26 | 27 | #### 9.1.1.1 登录 28 | 29 | 完成下载后,第一次打开软件会直接要求登录个人 Github 账户进行授权,并配置用户名和邮箱(识别个人创建的commits提交)。 30 | 31 | 如果没有找到让你登录 GitHub 账号的地方,你需要在 File -> Options -> Accounts -> Sign in 登录。 32 | 33 | 在完成基本配置后,会出现如下界面: 34 | 35 | 36 | 37 | #### 9.1.1.2 建立首个仓库 38 | 39 | 初次登陆会看到三个选项,也就是建立自己的第一个repository。 40 | 41 | 建立一个repo可以通过三个方式: 42 | 43 | - clone a repository:克隆一个repo 44 | 45 | - create new repository:建立一个新的repo 46 | - add a local repository:添加一个本地的repo 47 | 48 | 我们先选择从URL中克隆 [faster-git](https://github.com/datawhalechina/faster-git) 仓库,如下图,需要修改的地方为URL链接以及本地存储的路径。 49 | 50 | 51 | 52 | #### 9.1.1.3 提交Pull Request 53 | 54 | ##### fork 55 | 56 | 由于在实际开源项目贡献的过程中,开发者往往并没有直接修改仓库内容的权限,因此需要先对目标仓库进行fork操作,再通过提交PR的方式进行代码的贡献。在下图中,可以通过左下角的warning标志⚠,判断用户是否有目标仓库的权限。如果没有写入权限,点击create a fork,将目标仓库复刻为自己的仓库,进行随意的修改。 57 | 58 | 59 | 60 | 61 | 62 | 在 Github Desktop 中完成fork后,登录 Github 网页就可以在个人仓库中看到目标仓库的复刻版,如下所示。 63 | 64 | 65 | 66 | ##### commit & push 67 | 68 | 在完成了fork后,当前仓库就会索引到用户个人的复刻仓库,对应于本地指定目录下的文件。此时,用户拥有复刻仓库的所有权限,包括修改,删除,更改可视状态等等。接下来,就可以对本地分支中的代码进行修改,更新而当操作,再push到用户个人的复刻仓库中。 69 | 70 | 71 | 72 | 73 | 74 | 此时,登录 Github 网页版就会发现本地修改的代码已经上传到云端,个人复刻仓库进行了本地同步。 75 | 76 | 77 | 78 | ##### PR 79 | 80 | 在完成个人仓库的代码更新后,还要注意个人仓库的分支和目标分支的先后情况,如果目标分支领先于fork分支,需要先通过fetch upstream操作进行更新后,再提交PR。 81 | 82 | > **upstream**分支指向上游地址即目标分支,这里的**upstream**名字可以任意指定,只是一般都把上游地址都叫**upstream**。 83 | 84 | 点击Contribute,并Open pull request,向目标仓库提交上传申请。 85 | 86 | 87 | 88 | 89 | 90 | ![](./Assets/github_desktop_11.png) 91 | 92 | 在完成PR后,会自动跳转到目标仓库,可以看到在Pull requests一栏中,上标增加了1,1就是贡献者所提交PR。之后就需要目标仓库的拥有者对贡献的代码进行审阅,如果代码合规可利用,就会将fork分支的commits合并到主分支中。这样一来,就完成了一次贡献!!👏👏 93 | 94 | ![](./Assets/github_desktop_12.png) 95 | 96 | ## 9.2 TortoiseGit 97 | 98 | TortoiseGit 简称 tgit, 中文名海龟 Git ,是一个开放的 Windows 系统下的 Git 版本控制系统的源客户端,提供有中文版支持。由于它不是针对特定IDE(如Visual Studio、Eclipse或其他)的集成,所以可以与任何开发工具和任何类型的文件一起使用。与 Github Desktop 一类的传统图形化交互不同,与 TortoiseGit 的交互主要利用 Windows 资源管理器的上下文菜单,因此不需要打开任何软件,十分轻量、便捷。 99 | 100 | ### 9.2.1 下载 101 | 102 | 根据操作系统的位数,下载并安装对应版本的 TortoiseGit 及中文语言包(✅ TortoiseGit 及语言包[下载](https://tortoisegit.org/download/) ,✅TortoiseGit [安装教程](https://jingyan.baidu.com/article/f3ad7d0f37a75d09c2345b6f.html))。 103 | 104 | 105 | 106 | ### 9.2.2 安装 107 | 108 | 1、双击刚刚下载好的msi文件进入安装 109 | 110 | 111 | 112 | 2、连续两次next之后,到如下页面,更改下载位置,继续next 113 | 114 | 115 | 116 | 3、点击Install进行安装 117 | 118 | 119 | 120 | 4、点击Finish配置TortoiseGit 121 | 122 | 123 | 124 | 5、选择英文进入连续两次点击下一页 125 | 126 | 127 | 128 | 6、配置git.exe,并点击下一页 129 | 130 | 131 | 132 | 7、填写用户名和邮箱,并点击下一页 133 | 134 | 135 | 136 | 8、完成tortoisegit安装 137 | 138 | 139 | 140 | 9、双击TortoiseGit-LanguagePack-64bit-zh_CN.msi,配置中文语言 141 | 142 | 143 | 144 | 145 | 146 | ### 9.2.3 基本使用 147 | 148 | 与 Github Desktop 不同,TortoiseGit 是通过鼠标右键菜单栏的方式进行 git 命令的交互,桌面空白处右键后如下所示。 149 | 150 | 151 | 152 | #### 9.2.3.1 建立首个仓库 153 | 154 | 本地Git仓库的创建有两种,一是直接Clone已存在的Git仓库,二是本地创建版本库。 155 | 156 | ##### Clone仓库 157 | 158 | 在存放项目的目录点右键,选择Clone,配置目标仓库的URL以及本地存储的路径。 159 | 160 | 161 | 162 | 163 | 164 | 克隆成功,在文件夹上就可以看到角标标识,下图是克隆后并修改的情况: 165 | 166 | 167 | 168 | Git文件上角标符号是用于反映出当前文件或者文件夹的状态: 169 | 170 | 1、正常的:**绿色的对号** 171 | 172 | 2、被修改过的:**红色感叹号** 173 | 174 | 3、新添加的:**蓝色的加号** 175 | 176 | 4、未受控的(无版本控制的):**蓝色的问号** 177 | 178 | 5、忽略不受控的:**灰色的减号** 179 | 180 | 6、删除的:**红色的叉号** 181 | 182 | 7、有冲突的:**黄色的感叹号** 183 | 184 | > 若是看不到角标符号可以查看该教程:[TortoiseGit状态图标不能正常显示的解决办法](https://www.cnblogs.com/xiesong/p/5761352.html) 185 | 186 | ##### 创建本地版本库 187 | 188 | 新建一个项目目录myfaster-git,在代码目录右键选择创建版本库。在弹出提示中,不要勾选纯版本库,直接确定 189 | 190 | 191 | 192 | 之后项目目录下就会生成一个.git的目录,这个目录里面记录的是git操作相关内容。 193 | 194 | 195 | 196 | #### 9.2.3.2 Add & Commit & Push 197 | 198 | 在完成项目的代码更新后,可以右键选择 Git 提交进行add、commit以及push操作。 199 | 200 | 201 | 202 | 填写日志信息作为commit的message,同时勾选设置作者日期以及作者,明确代码更新的细节。再在变更列表中选择需要commit的文件,最后点击提交并推送完成push操作。 203 | 204 | 205 | 206 | #### 9.2.3.3 Pull 207 | 208 | 当需要更新本地代码时,可以右键选择TortoiseGit,再选择拉取进行fetch。 209 | 210 | 211 | 212 | 213 | 214 | > 📃注意:其余的一些git操作,可以在下拉框中进行操作,见上图。 215 | 216 | #### 9.2.3.4 配置远端 217 | 218 | 右键选择TortoiseGit,再选择设置,进入以下界面。在Git下的远端中,可以配置本地main分支所对应的远端分支,例如个人Github仓库的origin分支,或者fork分支的上游upstream分支等等。 219 | 220 | 221 | 222 | ## 9.3 Vscode Git 223 | 224 | 在实际项目开发过程中,往往遇到的场景是项目开发者直接通过代码编辑器进行Git操作,在本章中,主要介绍Vscode中Git的一些基础的操作。 225 | 226 | 导入项目文件,选择侧边栏的第三项,就可以看到以下内容。 227 | 228 | ![](./Assets/vsgit_1.png) 229 | 230 | 首选暂存所有更改,再在消息栏中输入message并点击勾进行提交,或者使用快捷键Ctrl+Enter进行提交。 231 | 232 | 233 | 234 | 完成add和commit操作后,点击同步,即可以push到远端。 235 | 236 | 237 | 238 | ## 9.4 本章小结 239 | 240 | 在本章的前言部分,通过比较在日常应用场景下终端命令和图形化界面的优劣,引出了 Git GUI 图形化应用。再详细介绍了三种类型的 Git GUI 图形化应用,Github Desktop、TotoiseGit以及Vscode Git。与传统的命令行不同,图形化界面为项目开发者提供了更为轻松、高效的方式利用 Git 进行项目版本管理。在下一章中,将详细介绍Git团队协作以及合并时的diff工具。 241 | 242 | 🎉冲冲冲!!! 243 | -------------------------------------------------------------------------------- /lecture05/README.md: -------------------------------------------------------------------------------- 1 | # 第五章 Git 内部原理 2 | 3 | ## 5.0 引言 4 | 本章相对独立,从底层出发带你了解Git内部是如何运作的。 5 | 6 | 你应该注意到本地仓库下有个名为 `.git` 的隐藏目录,本章将带你了解这个目录下的文件结构和内容。 7 | 8 | > 命令操作说明: 9 | > - 本章演示的命令是使用win10环境下的git bash工具; 10 | > - '\$' 符号所在行是演示命令; 11 | > - 如有内容输出,会在'\$' 符号所在行的下面输出。 12 | 13 | ## 5.1 `.git` 的目录结构 14 | 创建一个名为 `test` 的新仓库 15 | ```shell 16 | $ mkdir test 17 | $ cd test 18 | $ git init 19 | ``` 20 | 新仓库会自动创建一个 `.git` 目录,该目录包含了几乎所有 Git 存储和操作内容。若想备份或复制一个版本库,只需将该目录拷贝至另一处即可。 21 | 22 | 目录结构如下(后续章节会对 `*`开头 的目录详细介绍): 23 | ``` 24 | ├── *config 配置信息(比如本地repo是否大小写敏感, remote端repo的url, 用户名邮箱等) 25 | ├── description 无需关心(仅供GitWeb程序使用) 26 | ├── *HEAD 目前被检出的分支 27 | ├── index 保存暂存区信息 28 | │ 29 | │ 30 | ├── hooks/ 钩子脚本(执行Git命令时自动执行一些特定操作) 31 | ├── info/ 包含一个全局性排除文件 32 | │ └── exclude 放置不希望被记录在 .gitignore 文件中的忽略模式 33 | ├── logs/ 记录所有操作 34 | ├── *objects/ 存储所有数据内容 35 | │ ├── SHA-1/ 保存git对象的目录(三类对象commit, tree和blob) 36 | │ ├── info/ 37 | │ └── pack/ 38 | └── *refs/ 存储指向数据(分支、远程仓库和标签等)的提交对象的指针 39 | ├── heads/ 40 | ├── remotes/ 41 | └── tags/ 42 | ``` 43 | ## 5.2 objects目录 —— 对象存储 44 | 初始化仓库后:objects目录下只有子目录 `pack` 和 `info` ,但均为空。 45 | 46 | 运行以下命令,创建两个文件并提交 47 | ```shell 48 | # 创建了 blob1 49 | $ echo "version1" > test.txt 50 | $ git add . 51 | 52 | # 创建了 blob2 53 | $ mkdir folder1 54 | $ echo "file inside folder1" >folder1/file.txt 55 | $ git add . 56 | 57 | # 创建了 tree1, tree2和commit 58 | $ git commit -m "test" 59 | [master (root-commit) 67f0856] test 60 | 2 files changed, 2 insertions(+) 61 | create mode 100644 folder1/file.txt 62 | create mode 100644 test.txt 63 | ``` 64 | 此时查看objects目录,会发现新增了5个子目录。 65 | ``` 66 | .git/objects 67 | ├── 40 68 | │ └── fa006a9f641b977fc7b3b5accb0171993a3d31 69 | ├── 5b 70 | │ └── dcfc19f119febc749eef9a9551bc335cb965e2 71 | ├── 67 72 | │ └── f0856ccd04627766ca251e5156eb391a4a4ff8 73 | ├── 87 74 | │ └── db2fdb5f60f9a453830eb2ec3cf50fea3782a6 75 | ├── ac 76 | │ └── f63c316ad27e8320a23da194e61f45be040b0b 77 | ├── info 78 | └── pack 79 | ``` 80 | 81 | 让我们来学习一些知识点,来解答以下疑问。 82 | ``` 83 | - 这些长串数字代表什么意思? 84 | - 为什么突然多了5个子目录,分别代表什么呢? 85 | 86 | (info和pack目录将在下一小节介绍) 87 | ``` 88 | 89 | ### 知识点 90 | **1. 什么是对象?** 91 | 92 | objects目录下存储三种对象:数据对象(blob),树对象(tree)和提交对象(commit)。 93 | 94 | 5个子目录的含义如下图所示:2个blob, 2个tree和1个commit 95 |
96 | 97 |
98 | 99 | **2. Git如何存储对象?** 100 | - Git会根据对象内容生成一个 SHA-1 哈希值(称为该文件的校验和) 101 | 102 | 例如:`40fa006a9f641b977fc7b3b5accb0171993a3d31` 103 | - 截取校验和的前两个字符 => 用于命名子目录 104 | 105 | 例如:`40` 106 | - 校验和余下的 38 个字符 => 用于文件名 107 | 108 | 例如:`fa006a9f641b977fc7b3b5accb0171993a3d31` 109 | - 将对象内容存储在 `子目录/文件名` 内 110 | 111 | **3. [小拓展] 如何查看对象的存储内容** 112 | 113 | 可以根据校验和,查看存储的内容及对象类型 114 | ```shell 115 | # 查看文件类型 116 | $ git cat-file -t 40fa006a9f641b977fc7b3b5accb0171993a3d31 117 | blob 118 | 119 | # 查看文件内容 120 | $ git cat-file -p 40fa006a9f641b977fc7b3b5accb0171993a3d31 121 | file inside folder1 122 | ``` 123 | 124 | ## 5.3 objects目录 —— 包文件的存储机制 125 | > Git默认保存文件快照,即保存每个文件每个版本的完整内容。但假设只更改了某大文件中的一个字符,保存两次全部内容是不是有点低效? 126 | 127 | Git最初向磁盘存储对象时采用"松散"对象格式;但为了节省空间和提高效率,Git会时不时将多个对象打包成一个称为"包文件"。 128 | 129 | 当版本库中有太多的"松散"对象,或者手动执行 `git gc` 命令,或者向远程服务器执行推送时,Git 都会进行打包。 130 | 131 | 运行以下命令,手动打包 132 | ```shell 133 | $ git gc 134 | Enumerating objects: 113, done. 135 | Counting objects: 100% (113/113), done. 136 | Delta compression using up to 8 threads 137 | Compressing objects: 100% (92/92), done. 138 | Writing objects: 100% (113/113), done. 139 | Total 113 (delta 15), reused 102 (delta 13), pack-reused 0 140 | ``` 141 | 此时查看objects目录,会发现很多子目录不见了,而 `info` 和 `pack` 目录非空。 142 | ``` 143 | .git/objects 144 | ├── info 145 | │ ├── commit-graph 146 | │ └── packs 147 | └── pack 148 | ├── pack-XXX.idx 149 | └── pack-XXX.pack 150 | ``` 151 | 152 | - 包文件`pack-XXX.pack`:包含了刚才从文件系统中移除的所有对象的内容; 153 | - 索引文件`pack-XXX.idx`:包含了包文件的偏移信息。通过索引文件可以快速定位任意一个指定对象 154 | 155 | ## 5.4 refs目录 —— 引用 156 | Git把一些常用的 `SHA-1` 值存储在文件中,用文件名来替代,这些别名就称为**引用**。有三种引用类型:heads, remotes和tags。 157 | 158 | 运行以下命令,更新refs目录下的内容 159 | ```shell 160 | # 基于当前commit创建新分支test 161 | git branch test 162 | 163 | # 基于commit打tag 164 | git tag -a v1.0 165 | 166 | # 连接远程仓库 167 | git remote add origin https://github.com/datawhalechina/faster-git.git 168 | git fetch 169 | 170 | # 本地修改文件,然后运行git stash 171 | echo "version2" > test.txt 172 | git stash 173 | ``` 174 | 此时查看refs目录,内容如下 175 | ``` 176 | .git/refs 177 | ├── heads 记录本地分支的最后一次提交 178 | │ ├── master 179 | │ └── test 180 | ├── remotes 记录远程仓库各分支的最后一次提交 181 | │ └── origin 182 | │ └── main 183 | ├── tags 184 | │ └── v1.0 185 | └── stash 186 | ``` 187 | 188 | ### 5.4.1 HEAD引用 189 | HEAD引用有两种类型 190 | | | 存储位置 | 指代内容 | 文件内容 | 191 | | ----- | -------------------- | ---------------------------------------- | ---------------------------------- | 192 | | 分支级别 | `.git/refs/heads`目录下 | 本地分支的最后一次提交- **有多少个分支,就有多少个同名的HEAD引用** | commitHash | 193 | | 代码库级别 | `.git/HEAD`文件 | 指代当前代码所处的分支;拓展:也可指代commitHash(称为[分离HEAD](https://git-scm.com/docs/git-checkout#_detached_head)) | 符号引用 - 例如 `ref: refs/heads/master` | 194 | 195 | ### 5.4.2 远程引用 196 | - 存储位置: `.git/refs/remotes` 目录下 197 | - 指代内容:远程仓库各分支的最后一次提交 198 | - 注意点:用于记录远程仓库;文件是只读的,乱改就崩了 199 | 200 | ### 5.4.3 标签引用 201 | > tag主要用于发布版本的管理:一个版本发布之后,我们可以为git打上 v1.0 v2.0 ... 这样的标签 202 | - 存储位置:`.git/refs/heads` 目录下 203 | - 指代内容:tag可以指向任何类型(更多的是指向一个commit,赋予它一个更友好的名字) 204 | - 文件内容:SHA-1值 205 | 206 | ### 5.4.4 stash 207 | - 存储位置:`.git/refs/stash` 文件 208 | - 指代内容:当你想转到其他分支进行其他工作,又不想舍弃当前修改的代码时 - stash可把当前的修改暂存起来 209 | 210 | ## 5.5 config文件 —— 引用规范 211 | 运行以下命令,连接远程仓库 212 | ```shell 213 | git remote add origin https://github.com/datawhalechina/faster-git.git 214 | git fetch 215 | ``` 216 | 此时查看 `.git/config` 文件,会发现新添加了一段小节: 217 | ``` 218 | [remote "origin"] 219 | url = https://github.com/datawhalechina/faster-git.git 220 | fetch = +refs/heads/*:refs/remotes/origin/* 221 | ``` 222 | 223 | **引用规范**由 `git remote add origin` 命令自动生成 224 | - 获取远端 `refs/heads/` 下的所有引用 225 | - 将其写入本地的 `refs/remotes/origin/` 中 226 | - 更新本地的 `.git/config` 文件 227 | 228 | 一些常用命令: 229 | | | 命令 | 230 | | ---------------------------- | ---------------------------------------- | 231 | | 连接远程仓库 | `git remote add <远端名origin> ` | 232 | | 拉取分支 | `git fetch <远端名origin> <远端分支名>:<本地分支名>` | 233 | | 将远程的 main 分支拉到本地的mymaster 分支 | `git fetch origin main:mymaster` | 234 | | 将本地的master分支推送到远端的topic分支 | `git push origin master:topic` | 235 | | 删除远端分支topic | 法1:将\留空
`git push origin :topic`
法2:Git v1.7.0新语法
`git push origin --delete topic` | 236 | 237 | ## 5.6 config文件 —— 环境变量 238 | Git有三种环境变量: 239 | 240 | 1)系统变量 241 | - 适用范围:对所有用户都适用 242 | - 命令选项:`git config --system` 243 | 244 | 2)用户变量 245 | - 适用范围:只适用于该用户 246 | - 命令选项:`git config --global` 247 | 248 | 3)本地项目变量 249 | - 适用范围:只对当前项目有效 250 | - 命令选项:`git config --local` 251 | - 存储位置:`.git/config` 252 | 253 | 一些常用命令: 254 | | | 命令 | 255 | | ------ | --------------------------------------- | 256 | | 查看所有配置 | `git config --list` | 257 | | 配置用户名 | `git config --global user.name "你的用户名"` | 258 | | 配置邮箱 | `git config --global user.email "你的邮箱"` | 259 | 260 | ## 5.7 小练习 261 | ### 5.7.1 远端分支推送 262 | Tom 想把自己的本地分支 `feature1`(当前也为 `HEAD` ),推送到远端分支的 `feature`,应当执行什么命令? 263 | 264 | ``` 265 | A. git push origin/feature1:feature 266 | B. git push origin feature1:feature 267 | C. git push origin HEAD:feature 268 | D. git push origin :feature 269 | ``` 270 | 271 | ### 5.7.2 邮箱配置 272 | Tom工作在多个Git项目上,大部分属于公司的项目,都是使用他的工作邮箱提交。 273 | 274 | 今天他新建了一个私人项目,想使用私人邮箱进行提交。他运行什么命令更合适呢? 275 | ``` 276 | A. git config --system user.email "tom@私人邮箱" 277 | B. git config --global user.email "tom@私人邮箱" 278 | C. git config --local user.email "tom@私人邮箱" 279 | D. 以上选项都可以 280 | ``` 281 | 282 | . 283 | 284 | . 285 | 286 | . 287 | 288 | . 289 | 290 | . 291 | 292 | . 293 | 294 | 8.1 答案:B C 295 | 296 | 8.2 答案:C 只对当前项目有效 -------------------------------------------------------------------------------- /lecture08/README.md: -------------------------------------------------------------------------------- 1 | # 第八章 Github/Gitee使用说明 2 | 3 | ## 8.0 初识GitHub 4 | 5 | 可能同学们都或多或少听说过Github,Github是一个使用Git作为版本管理工具的代码托管平台,由于其用户量大并且氛围友好,又经常被大家戏称为“全球最大同性交流平台”。事实上,依赖于Git的强大协作能力,Github是开源软件发展的主战场之一。如果还有同学没有注册过Github,可以先登陆http://github.com注册账号 6 | 7 | 8 | 9 | ## 8.1 使用Github托管代码 10 | 11 | ### 8.1.1 创建仓库 12 | 13 | Github上几乎所有的事情都是围绕着仓库展开的。我们首先来学习如何新建一个仓库并满足自己的开发需求。 14 | 15 | 一个GitHub仓库实质上是一个包含了你的项目所有文件的文件夹。 .git文件夹也包含在其中用于版本控制。 16 | 17 | 登陆GitHub主页,点击右上角+号即可创建一个仓库,如下图: 18 | 19 | 20 | 21 | 点击后会跳转到新建仓库的表单, 22 | 23 | 24 | 25 | 注意: 26 | 27 | 1. github上的仓库一般都会包含readme文件,该readme文件会在项目页面进行展示 28 | 2. .gitignore文件可以用来忽略工作区的私有文件(例如本地配置、缓存文件、node_modules等) 29 | 30 | 31 | 32 | 点击绿色的code按钮,选择相应的协议即可拿到该项目的地址,在本地只需要clone下来就可以进行开发了,开发完成后push到原仓库即可 33 | 34 | ### 8.1.2 仓库界面介绍 35 | 36 | 我们以vscode项目进行介绍 37 | 38 | 访问https://github.com/microsoft/vscode 即可看到如下的界面 39 | 40 | ![](imgs/repo-page.png) 41 | 42 | 整个页面的信息量很大,我们主要介绍几个: 43 | 44 | **页面的左上角:** 45 | 46 | **Star**:Star类似于朋友圈的点赞,给项目star代表了你对项目的认可 47 | 48 | > 所以尽量不要像朋友圈集赞一样要求身边朋友刷star 49 | 50 | **Fork**:Fork操作实际上是创建一个仓库的副本,并将仓库的upstream指向原仓库 51 | 52 | > 小问题:为什么要fork呢?为什么不直接push呢? 53 | > 54 | > fork方便了多人协作 55 | 56 | **Watch**:Watch操作可以向你的邮箱中推送该仓库的推送信息 57 | 58 | image-20220430232629453 59 | 60 | > 提示:如果不是特别重要的项目,不要随意点Watch,否则很容易邮箱被轰炸 61 | 62 | **Issues**:Issues在Github官方文档中被翻译为议题,作用是针对仓库的内容进行讨论(例如bug反馈/新功能推荐) 63 | 64 | > 提示:Issues不等同于评论区,Issues板块应该专注于解决问题,不要在Issues中发一些和项目无关的内容,这样可能会消耗很多maintainer的精力 65 | 66 | **Pull Requests**:Pull Requests,简称PR,是github中将修改过的代码分支合并到目标分支的操作。前面git的学习中,我们都知道commit是git的最小工作单元,在github的仓库中,PR是主要的工作单元。很多同学刚刚接触GitHub时,对于Pull Requests很不理解:什么是拉取请求?在gitlab中,pr的操作叫做Merge Request, 实际上大家可以把PR理解为“我修改好了你的代码,现在请求你把代码拉回主仓库中” 67 | 68 | **Action**:Github Action 是GitHub推出的自动化构建工具,感兴趣的同学可以阅读文档 69 | 70 | **Projects**:针对某一仓库的项目板(看板) 71 | 72 | **Wiki**: 存放一些介绍性的内容 73 | 74 | **Security**:与安全相关,这里不做介绍 75 | 76 | **Insight**:里面包含里项目的一些数据,包括代码贡献的时间分布图,每个人的贡献量等metric 77 | 78 | **discussion**:vscode仓库中并没有开启discussion功能,这里展示一下wagtail社区的,该功能像一个真正的讨论区 79 | 80 | 81 | 82 | 83 | 84 | ## 8.2 提交issue 85 | 86 | 我们以vscode为例展示提交issue 87 | 88 | ![](imgs/issue-tab.png) 89 | 90 | 进入Issues选项卡,可以看到vscode项目已经准备了一些模版,我们点击Bug report 91 | 92 | ![](imgs/issue-template.png) 93 | 94 | 95 | 96 | > 提示:在提bug时,请尽可能详细的描述出bug发生的步骤以及所运行的环境(https://stackoverflow.com/help/minimal-reproducible-example )。一般来说,Issue是参与项目贡献的起点,一个高质量的Issue也会让maintainer更愿意交流、处理。 97 | 98 | 如果你是项目的maintainer,也可以通过右侧对该issue进行更详细的设置,这里不详细介绍了。 99 | 100 | 101 | 102 | ## 8.3 提交PR 103 | 104 | 如果你fork了一份项目代码并做了修改,并且希望将修改的代码合并进上游仓库中,就可以提交PR 105 | 106 | ![](imgs/pr-tab.png) 107 | 108 | 上图为vscode的pr界面,点击New pull request即可新建pr。具体的PR流程这里也不详细讲解了。 109 | 110 | 111 | 112 | 注意:不是所有的PR都会被合并,所以在提交PR前请先和maintainer进行沟通,并且在开发的过程中反馈进度,一种比较好的方式就是draft PR,如下图所示: 113 | 114 | 115 | 116 | draft PR表示该PR还没有开发完,项目的maintainer不需要进行reveiw和merge,只需要简单看看代码是否符合预期。 117 | 118 | > 小提示:在提交PR时,尽可能关联相关Issue,并说明你的代码解决了什么问题。 119 | 120 | 121 | 122 | **更新fork的项目-Fetch upstream** 123 | 124 | 情景:用户2729956566的对项目进行了fork,提交的PR通过了,或者项目进行了其它更新。此时,我们fork的项目已不是最新版,因此需要更新我们fork的项目到最新版。 125 | 126 | 大概步骤 [视频参考链接](https://www.bilibili.com/video/BV1Vb411A7z2?spm_id_from=333.337.search-card.all.click) 127 | 128 | ```shell 129 | # 查看远程仓库有几个分支 130 | git remote -v 131 | 132 | # 将仓库的原始地址加进去 133 | git remote add upstream git@github.com:2951121599/repo_for_test_pr.git 134 | 135 | # 再次查看远程仓库的分支 (会多上有仓库upstream) 136 | git remote -v 137 | 138 | # fetch将远程分支拉到本地 pull = fetch + merge (pull会做自动合并) 139 | # 创建新分支 master/upstream 140 | git fetch upstream 141 | 142 | # 查看远程分支 若跟本地分支名一样 然后做一下合并 143 | git branch -r 144 | 145 | # 和原始仓库的远程保持一致 rebase不会做合并操作,将当前分支的修改复制并放在目标分支的最后一次 而merge会将两个分支合在一起 146 | # 因此没做贡献用rebase就够了 147 | git rebase upstream/master 148 | 149 | # 推送 150 | git push 151 | ``` 152 | 153 | 154 | 155 | ## 8.4 探索Github 156 | 157 | 对于大多数程序员来说,Github的一个重要用途就是学习别人的代码,看自己的任务有没有已经写好的轮子可以用。因此如何高效的探索Github也是很重要的,这里给大家介绍几种探索GitHub的小技巧 158 | 159 | ### 8.4.1 Explore 160 | 161 | 点击GitHub最上方的Explore或输入https://github.com/explore 即可进入。Explore板块不仅可以根据你的兴趣进行项目的推荐,而且Trending榜展示了当前综合热度最高的项目。关注Trending可以随时掌握整个Github的最新动向![](imgs/trending.png) 162 | 163 | > 补充 https://kamranahmed.info/githunt/ 也是一个追踪热门项目的网站 164 | 165 | ### 8.4.2 快捷键 166 | 167 | GitHub网站拥有一系列快捷键,你可以通过快捷键来完成你想要完成的动作,例如ctrl/command+k会调起一个类似于powertoy一样的搜索框,在这里你可以直接进行搜索。 168 | 169 | 170 | 171 | 类似的快捷键有很多,完整的快捷键见文档https://docs.github.com/cn/get-started/using-github/keyboard-shortcuts 172 | 173 | ### 8.4.3 高级搜索 174 | 175 | 高效的搜索方式可以节约你很多时间,例如下面代码可以帮助你找到Github中star量超过10000的项目 176 | 177 | ``` 178 | stars:>10000 179 | ``` 180 | 181 | ![](imgs/advanced-search.png) 182 | 183 | 其他搜索技巧可以参考上图红框中的链接 184 | 185 | **常见搜索的快速备忘单** 186 | 187 | ##### 8.4.3.1 基本搜索 188 | 189 | | 搜索 | 使用...查找存储库 | 190 | | ----------------------- | ------------------------------------------------ | 191 | | cat stars:>100 | 查找星数超过 100 的 cat 存储库。 | 192 | | user:2951121599 | 从用户 2951121599 获取所有存储库。 | 193 | | qucik_sort extension:py | 在带有py扩展名的代码中查找所有qucik_sort的实例。 | 194 | | NOT cat | 排除所有包含 cat 的结果。 | 195 | 196 | 197 | 198 | ##### 8.4.3.2 存储库搜索 199 | 200 | 查看你在 GitHub 上可以访问的项目,你也可以过滤结果 201 | 202 | | 搜索 | 使用...查找存储库 | 203 | | ------------------------ | ------------------------------------------ | 204 | | python forks:>200 | 查找所有大于 200 个forks的 Python 存储库。 | 205 | | awesome-python fork:true | 包括 awesome-python 的分支。 | 206 | | awesome-python fork:only | 仅返回 awesome-python 的分支。 | 207 | 208 | 209 | 210 | ##### 8.4.3.3 代码搜索 211 | 212 | 代码搜索会查看托管在 GitHub 上的文件。您还可以过滤结果: 213 | 214 | | 搜索 | 使用...查找存储库 | 215 | | --------------------------- | ------------------------------------------------------- | 216 | | chunk repo:2951121599/Utils | 从存储库 2951121599/Utils 中查找所有 chunk 的code实例。 | 217 | | pandas user:2951121599 | 从所有公共 2951121599 存储库中查找对 pandas 的引用。 | 218 | | examples path:/docs/ | 在路径 /docs/ 中查找所有examples 。 | 219 | 220 | 221 | 222 | ##### 8.4.3.4 问题搜索 223 | 224 | 问题搜索查看 GitHub 上的 issues and pull requests(问题和拉取请求)。您还可以过滤结果: 225 | 226 | | 搜索 | 发现问题… | 227 | | -------------------- | ------------------------------ | 228 | | cat is:open | 查找未解决的猫问题。 | 229 | | strange comments:>42 | 超过 42 条评论的问题。 | 230 | | hard label:bug | 标记为错误的难题。 | 231 | | author:2951121599 | 所有问题均由 2951121599 撰写。 | 232 | | mentions:tpope | 所有提到 tpope 的问题。 | 233 | | assignee:2951121599 | 分配给 2951121599 的所有问题。 | 234 | 235 | 236 | 237 | ### 8.4.4 CodeSpace 238 | 239 | 在你的仓库界面,输入英文状态下的 `.`,即可进入该项目的web editor,这实质上是一个云端的vscode,方便用户查找编辑代码。很可惜现在CodeSpace还不能支持在线运行代码,一些简单的修改可以配合Action使用 240 | 241 | ### 8.4.5 Copilot 242 | 243 | Copilot是Github通过公开代码训练的一个强大的代码补全工具,现在还在内测阶段,有感兴趣的同学可以在https://copilot.github.com/ 申请,这里不过多介绍了 244 | 245 | ### 8.4.6 Readme-profile 246 | 247 | 用户主页也是探索Github很好的地方,我的用户主页如下图 248 | 249 | ![](imgs/homepage.png) 250 | 251 | 左边展示了你参与过的项目,右边展示了Github Explore推荐的项目,中间展示了你Follow的用户最近的动态通常来说,你Follow的用户越多,主页动态越精彩。 252 | 253 | > 补充资料:思否今年做过一个中国开源爱好者榜单,有兴趣的同学可以看下https://github.com/OpenSourceWin/hacking-force 254 | 255 | ### 8.4.7 Github API 256 | 257 | Github对针对开发者提供了一系列API,详情见https://docs.github.com/en/developers 。通过API可以对数据采集分析,探索更微观的GitHub。也有开源项目专门做这件事情,例如open-digger开源项目(https://github.com/X-lab2017/open-digger ),感兴趣的同学去自己探索下,这里也不多讲了。 258 | 259 | ### 8.4.8 保持清醒 保持正义 260 | 261 | Github不是法外之地,如果有遇到代码滥用行为或者政治/宗教等歧视行为,请毫不犹豫地举报! 262 | 263 | 264 | 265 | > **练习一**(选做):github readme-profile练习 266 | > 267 | > Readme-profile是github提供的一个主页展示仓库,具体实现方式为创建一个与自己用户名相同的仓库,该仓库可以展示在githubprofile中。同时,你也可以添加各种badges来让你的主页变得很炫酷。 268 | > 269 | > 一些可以参考的资源: 270 | > 271 | > https://github.com/rzashakeri/beautify-github-profile 272 | > 273 | > https://github.com/kautukkundan/Awesome-Profile-README-templates 274 | 275 | > **练习二**(选做):小组内PR练习 276 | > 277 | > 以小组为单位建立学习一个仓库,每人向仓库中提交pr并合并到主分支中。 278 | 279 | 280 | 281 | ## 8.5 国内其他代码托管平台简介 282 | 283 | Gitee/Coding/jihulab 284 | 285 | 作为代码托管平台,Github由于网速等原因的限制,访问起来会很慢,可以使用开源项目[dotnetcore/FastGithub: github加速神器](https://github.com/dotnetcore/FastGithub),只需下载安装运行,即可提高网站访问速度。 286 | 287 | 这时可以采用国内的代码托管平台,这里我们只介绍下Gitee 288 | 289 | 网址:https://gitee.com/ 290 | 291 | Gitee整体的功能与github相差不大,这里就不多介绍了,等待大家的探索。 292 | 293 | 下面我们讲一下,如何通过Gitee 克隆Github上的项目 294 | 295 | 在Gitee创建仓库时,点击右上角`点击导入` 296 | 297 | ![gitee-import-repo](imgs/gitee-import-repo.png) 298 | 299 | 即可导入其他平台项目,并享受高速的克隆速度。非常方便~ 300 | 301 | 如果大家想将代码回传到GitHub中,请复习git remote相关知识进行操作。 302 | 303 | 304 | 305 | ---- 306 | 307 | 本章内容就介绍到这里了,下面是一些补充资料: 308 | 309 | 补充资料一:一些Git相关的开源仓库 310 | 311 | Progit2:https://github.com/progit/progit2 312 | 313 | git-cheat-sheet:https://github.com/arslanbilal/git-cheat-sheet 314 | 315 | githug--一个ruby编写的git练习游戏:https://github.com/Gazler/githug 316 | 317 | gitignore模版:https://github.com/github/gitignore 318 | 319 | git-extras:https://github.com/tj/git-extras 320 | 321 | git-recipes:https://github.com/geeeeeeeeek/git-recipes 322 | 323 | 324 | 325 | 补充资料二:GitHub高赞项目推荐 326 | 327 | awesome系列: 328 | 329 | 主仓库https://github.com/sindresorhus/awesome 330 | 331 | 周刊系列: 332 | 333 | https://github.com/GrowingGit/GitHub-Chinese-Top-Charts 334 | 335 | https://github.com/ruanyf/weekly 336 | 337 | https://github.com/GitHubDaily/GitHubDaily 338 | 339 | 资源集合系列: 340 | 341 | https://github.com/papers-we-love/papers-we-love 342 | 343 | https://github.com/public-apis/public-apis 344 | 345 | https://github.com/danistefanovic/build-your-own-x 346 | 347 | https://github.com/GorvGoyl/Clone-Wars 348 | 349 | https://github.com/TheAlgorithms 350 | 351 | 这里只列出了一小部分项目,感兴趣的同学可以在学习群里交流~ 352 | 353 | 354 | 355 | 356 | 357 | -------------------------------------------------------------------------------- /lecture07/README.md: -------------------------------------------------------------------------------- 1 | # 第七章 Git提交规范 2 | ## 7.0 前言 3 | 4 | Git是目前程序员必备基础技能,可以用来管理代码、文档、博客,甚至菜谱。个人的私有仓库的提交相对而言可以 5 | 较为随意,但是在团队开发中,还是要遵循相应的规范。本文对Git使用中涉及到提交相关的实践做了些整理, 6 | 供大家参考。 7 | 8 | ![git commit](git-commit.png) 9 | 10 | 如上图所示(截取自Angular commit [970a3b5](https://github.com/angular/angular/commit/970a3b5c70fee29aa40945836ebeb464d75438e4)), 11 | 一个commit包含如下几个信息: 12 | 13 | * commit message - 提交的内容相关描述 14 | * author & committer - 作者及提交者 15 | * changed files - 修改的文件 16 | * hash & parent - 提交内容的hash及在提交树上的位置 17 | 18 | ## 7.1 Commit Message 19 | 20 | 提交消息描述的是当前提交的功能相关信息,一般可以包括`header`,`body`,`footer`, 21 | 22 | ``` 23 |
24 | 25 | 26 | 27 |