如何开始合作——从Git到Github
Git本地保存
Git最常见的用途是为了保存Local的代码改动。
1 | |
这样我们就完成了一次本地的保存操作。
git init命令会在当前目录下生成一个隐藏目录.git/。Git 初始化了一个对象数据库 (Object Database)。从此以后,这个文件夹里的任何变动,都有资格被 Git 监控。
git add命令会将文件从工作区移动到暂存区,在实际的开发场景中,尤其是多人合作的项目中,我们一般会使用git add <filename>的命令,这是“精细化提交”的行为之一。
git commit命令会将暂存区的所有内容打包成一个永久的快照,存入 Local Repository (本地仓库)。
值得说的是,这里我们就已经触及了Git的三大工作区域,分别是:
- 工作区(Working Directory):你的代码,保存文件(Ctrl+S)的地方,文件会处于未追踪(Untracked)或者已修改(Modified)状态,常见的IDE已经支持在内部显示这两种状态。
- 暂存区/索引(Staging Area / Index):这是 Git 独有的概念。它是一个“缓冲区”,用于准备即将提交的文件快照。
- 本地仓库(Local Repository):这是存储在
.git文件夹里的数据库。一旦进入这里,文件就有了永久的历史记录。
Git远程连接
建立连接
1 | |
这里我们注册了一个远程上游(Remote Upstream)。简单地说,我们给本地仓库配置了一个远程的目标地址。
值得一提的是,origin本身并不是一个“魔法词汇”,其实它只是一个别名(Alias)。你可以将其命名为github,backup,my-server都行,推荐使用origin。设置别名的目的是以后我们都不用打一长串的URL地址,而是只需要origin即可。
分支同步与推送
1 | |
通过这个命令,我们将本地仓库的commit对象,通过网络传输到github的远程仓库(Remote Repository)。
这里的参数 -u 是上游(Upstream)的缩写。它建立了一条持久化的追踪关系,告诉git,我本地的main分支对应着远程origin的main分支。这样,我们下次只需要输入git push,git就自动知道要把谁推给谁。
多人合作
安全与身份
- GPG 签名:
- 在本地电脑上我们可以任意输入用户名,比如说这样你就变成Linux之父,这样很酷,但是如果以这个身份提交代码,别人看见的就是Linus与他们进行合作。
1
git config user.name "Linus" - GPG Key 是什么? GPG (GNU Privacy Guard) 是一种加密技术。它生成一对密钥:一把私钥(在你电脑里),一把公钥(上传给 GitHub)。
- 对于工业界的团队合作项目,GPG Key是一个常见的配置,用来说明“你是你”。Github上面有些开源大神的头像旁边也会有一个Verified标签,这也是GPG签名。
- 在本地电脑上我们可以任意输入用户名,比如说
- 分支保护:
- GitHub仓库管理员会将main分支锁定。此时,我们之前的push就不起作用,只有通过审核的代码会进入main分支。一般来说,审核包括GitHub的语法检查和团队其他成员的review。
开发
既然main分支已被锁定,我们的开发就只能在为了任务而创建的特性分支(Feature Branch)。
- 同步上游:这是你开工的第一件事,拉取最新的main。
1 | |
- 切分支:我们需要良好的命名习惯,方便我们进行debug,以下是一个例子。
- type: 对应任务类型,比如说开发新功能的feature,修改bug的fix等。
- ticket-id: 对应工单号,这样方便我们查询这段代码的需求文档。
- description: 对应描述,一眼便知这段代码的作用。
1 | |
- 频繁提交,延迟推送:经常在本地commit,比如说每15min一次。但是这些记录不能污染远程仓库。
发起PR和审查*
在个人项目或 Demo 中,我们往往习惯直接合并代码。但在工业界,这是绝对禁止的。现在简要地介绍一下这一部分。
- 发起请求:在github上点击”New Pull Request”。
- 机器检查:在工业界,某些企业会有机器人把你的代码进行测试,你可以在github下方看见check标志。
- 代码审查:
- 自查:在merge之前最后看一眼自己的代码。
- 他人审查:其他团队成员进行审查,一致通过以后可以merge。
合并
将你的代码合并到远程仓库。
- 在GitHub界面中点击“Squash and Merge”。
- GitHub会将10个commit压缩(squash)成一个commit并合并进去,这样一个开发功能只对应一个点。
清理
合并完成之后,你的特性分支就应该被清理。
- GitHub:会自动提示“Delete branch”。
- 本地:
1 | |