有关 Git、Github、Gitlab 以及 CI 的一些入门介绍

这篇文章是一次分享的大体提纲,因此有很多概念不会用文字详细解释。

git的重要性便不在此赘述,为什么在网络上已经有丰富教程的前提下还要做这个东西, 就是希望大家(班里的同学们)大家能够尽可能站在一个水平线上,为以后的合作提供技术基础。

不过,也请不要期待仅仅在两个小时之后就能上手全部的内容。

因为坑注定是要自己踩才会有感觉。

这篇文章不会涉及的内容

git的安装

git的全部详解

Pro Git book

github ssh公钥设置

Windows下公钥配置


git 版本控制器

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 简史

为什么使用git

你可能会经常遇到这样的情况:正在使用编辑器编写代码的时候,电脑突然死机了。

当然重启以后发现这个文件并没有丢失,可问题是,如果有一百个文件,你要一个个确认吗?

另外一个问题,当你在书写程序时,想要恢复一大段被删除的文字怎么办?

还有,在多人合作时,你如何保证多个人分别开发不同的代码以后,能够安全的合并文件呢?

存在网上?如果断网了呢?

安装

略过

git是如何实现版本控制的

架构

工作区域

admonition example 具体演示

如何使用git

git --help
# 先查看帮助呦
git init
git add SOME_FILE
git commit -m "SOME_COMMENT"
git push

与之对应的四个阶段

st=>start: git init || git clone|past
e=>end: 提出Pull Request 或 关闭相应issue
state0=>operation: 编辑文件
cond1=>condition: 文件
是否有改动
state1=>operation: git add [files]
cond2=>condition: 是否完成
一定功能的修改
state2=>operation: git commit [change messages]
cond3=>condition: 是否可以
提交至服务器
state3=>operation: git push
statefix=>inputoutput: git pull 并 解决冲突


st->state0->cond1->state1->cond2->state2->cond3->state3->e
cond1(yes)->state1
cond1(no)->state0
cond2(no)->state0
cond2(yes)->state2
cond3(yes)->state3
cond3(no)->statefix->state0


以一次提交为例的演示

其他的基本功能

  • 回滚 revert
  • 压缩 rebase
  • 比较 diff
  • 隐藏 .gitignore
  • 子模块 submodule

说说分支与 Git 的 Workflow

分支

一些底层的机理,可对照 .git/objects/ 目录下内容学习。

# generate checksum
git hash-object <file>
git cat-file -p <checksum>
# check type of object: commit blob tree
git cat-file -t <checksum>

从零开始创建一个 commit

git init

cat > file-1.txt << EOF
file-1
EOF

cat > file-2.txt <<EOF
file-2
EOF

# hash && 存放入数据库
git hash-object -w file-1.txt
# fbfd79f5e4816836f68f8128e9f99b12a0013a06

git hash-object -w file-2.txt
# 37ad5611998d92506ab38906d83810929f8c4a3d

# 此时 .git/objects/ 多了内容

# -----

# git add
git update-index --add --cacheinfo 100644 \
fbfd79f5e4816836f68f8128e9f99b12a0013a06 file-1.txt

git update-index --add --cacheinfo 100644 \
37ad5611998d92506ab38906d83810929f8c4a3d file-2.txt

# 此时输入 git status,可以查看到暂存的内容
# ./git/index 文件诞生

# -----

# 写入 tree 对象
git write-tree
# 85b5f8639b41a5ec4ba88381c358141105d3c50c

# 尝试更复杂一点,修改一下
cat > file-1.txt << EOF
updated
EOF

# 写入数据库
git hash-object -w file-1.txt

# 写入暂存区(index)
git update-index --cacheinfo 100644 \
519c15ed8d400dfa4be08f404a5c5b21ad6d4a7a file-1.txt

# 将之前的树也写入暂存区(index)
git read-tree --prefix=bak 85b5f8639b41a5ec4ba88381c358141105d3c50c

# 此时试图 git status 会看见 bak/ 中 **有过** 文件,这就是上个命令产生的效果

# 写入 tree object
git write-tree
# b72c06c298832e50d22d218424f478515e73cea1

# git commit
echo 'first commit' | git commit-tree 85b5f8639b41a5ec4ba88381c358141105d3c50c
# 7ae4ed6a70d0e25ef14b7b46d9b0fb925849187f 会因为信息不同而不一样

# second commit -> first
echo 'second commit' | git commit-tree b72c06c298832e50d22d218424f478515e73cea1 -p 7ae4ed
# 97072885b3d1115edeef3fdfdc52e0f48f19f991 会因为信息不同而不一样

# 移动 master 指针
echo "97072885b3d1115edeef3fdfdc52e0f48f19f991" > .git/refs/heads/master

# 此时 git log 可以看见提交

Git版本控制与工作流


Git 的局限性以及 .gitignore

  • 操作比较繁琐
  • 无法彻底解决安全问题
  • 无法有效的管理大二进制文件存储问题

.gitignore

那些文件需要使用

  • 本地依赖 node_modules
  • 编译的结果或者中间结果 *.out *.a *.o
  • 隐私文件

一些 FAQ

有哪些与 Git 相关的好用的工具

  1. VSCode (或者其他编辑器/IDE) 中的 Git 相关的插件,比如 GitLens
  2. zsh 的 Git 插件等(alias)
  3. git-cz (better commit)
  4. tldr (e.g. tldr git-log)
  5. gitignore.io 帮助生成 .gitignore

我做了很多重复的提交,如何压缩成一个

git rebase -i HEAD~5

想要强制覆盖远程仓库里的记录

git push --force

clone 时候,速度快一些

git clone <xxxxx> --depth 1

这个 Bug 谁写的

git blame <file>
git log -p <file>

如何引(白)用(嫖)别人的项目

git submodule add <...>

想要撤销操作怎么办

git restore <file>
git restore --staged <file>
git commit --amend
git revert

有大文件怎么办

LFS

如何发布 release

git tag

有些复杂的命令记不住

git config --global alias.last 'log -1 HEAD'

Git Merge 是最好的合并代码的方式么

git rebase

一般我们这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁——例如向某个其他人维护的项目贡献代码时。 在这种情况下,你首先在自己的分支里进行开发,当开发完成时你需要先将你的代码变基到 origin/master 上,然后再向主项目提交修改。 这样的话,该项目的维护者就不再需要进行整合工作,只需要快进合并便可。 呃,奇妙的变基也并非完美无缺,要用它得遵守一条准则:不要对在你的仓库外有副本的分支执行变基。

详细区别见教程

如果按照 Git 的“对每一个修改的文件” 重新打包的方式,会不会很占用空间

git gc

包文件


github 软件源代码托管服务 大型同性交友社区

为什么使用github

  • 可视化
  • 方便协作
  • 大量优质项目

github中各个组件的功能以及使用技巧

  • Issues
  • Project
  • Wiki
  • Pull Request
  • 私人仓库
  • Fork
  • Release

个人经验

合作开发中需要注意的东西

  • README.md
  • 协议(版权)
  • 成员之间任务管理
  • 利用好分支
  • 利用其它插件 (以 Travis 为例)

以项目为例


GitLab “开源的 GitHub”

  • 开源,可以部署私有在线代码仓库 网协部署的校内 GitLab
  • 对 docker 相关部署做了集成
    • k8s 等
  • 更注重敏捷开发

以项目为例 诊所预约管理系统


持续集成 - CI

### 什么叫持续集成

以github为例展示简单的持续集成

  • 原料
    • 服务器(部署环境)、github、travis-ci、docker
  • 使用方式
    • 编写.travis.yml(配置文件),脚本,docker-compose

简单说说


一些展望

唠叨一下


安全


小练习

以组为单位完成以下任意一个练习

  • 创建自己的分支,提交代码,合并到主分支
  • 从主分支拉取代码,进行修改并提交,利用Pull Request合并到主分支
  • 审核别人的Pull Request,并且同意(拒绝)合并
  • 提issues, 新建fix 分支(分支名为fix xxxx),修改提交后,合并并关闭issues

以上内容不分先后

其他资料