这篇文章是一次分享的大体提纲,因此有很多概念不会用文字详细解释。
git的重要性便不在此赘述,为什么在网络上已经有丰富教程的前提下还要做这个东西, 就是希望大家(班里的同学们)大家能够尽可能站在一个水平线上,为以后的合作提供技术基础。
不过,也请不要期待仅仅在两个小时之后就能上手全部的内容。
因为坑注定是要自己踩才会有感觉。
这篇文章不会涉及的内容
git的安装
git的全部详解
github ssh公钥设置
git 版本控制器
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
为什么使用git
你可能会经常遇到这样的情况:正在使用编辑器编写代码的时候,电脑突然死机了。
当然重启以后发现这个文件并没有丢失,可问题是,如果有一百个文件,你要一个个确认吗?
另外一个问题,当你在书写程序时,想要恢复一大段被删除的文字怎么办?
还有,在多人合作时,你如何保证多个人分别开发不同的代码以后,能够安全的合并文件呢?
存在网上?如果断网了呢?
安装
略过
git是如何实现版本控制的
admonition example 具体演示 {:.info}
如何使用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
以一次提交为例的演示 {:.info}
其他的基本功能
- 回滚
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 的局限性以及 .gitignore
- 操作比较繁琐
- 无法彻底解决安全问题
- 无法有效的管理大二进制文件存储问题
.gitignore
那些文件需要使用
- 本地依赖
node_modules
- 编译的结果或者中间结果
*.out *.a *.o
- 隐私文件
一些 FAQ
有哪些与 Git 相关的好用的工具
- VSCode (或者其他编辑器/IDE) 中的 Git 相关的插件,比如 GitLens
- zsh 的 Git 插件等(alias)
- git-cz (better commit)
- tldr (e.g.
tldr git-log
) - 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
个人经验 {:.info}
合作开发中需要注意的东西
- README.md
- 协议(版权)
- 成员之间任务管理
- 利用好分支
- 利用其它插件 (以 Travis 为例)
以项目为例 {:.info}
GitLab “开源的 GitHub”
- 开源,可以部署私有在线代码仓库 网协部署的校内 GitLab
- 对 docker 相关部署做了集成
- k8s 等
- 更注重敏捷开发
以项目为例 诊所预约管理系统 {:.info}
持续集成 - CI
### 什么叫持续集成
以github为例展示简单的持续集成
- 原料
- 服务器(部署环境)、github、travis-ci、docker
- 使用方式
- 编写.travis.yml(配置文件),脚本,
docker-compose
- 编写.travis.yml(配置文件),脚本,
简单说说 {:.info}
一些展望
唠叨一下
安全
- CVE
- 管理权限 百度、阿里、腾讯之类的大公司用 Git 吗?
- 生产环境可能存在源码泄露
小练习
以组为单位完成以下任意一个练习
- 创建自己的分支,提交代码,合并到主分支
- 从主分支拉取代码,进行修改并提交,利用Pull Request合并到主分支
- 审核别人的Pull Request,并且同意(拒绝)合并
- 提issues, 新建fix 分支(分支名为fix xxxx),修改提交后,合并并关闭issues
以上内容不分先后