3.5git 与 github
引自 nju-ics-pa
光玉
想象一下你正在玩 Flappy Bird,你今晚的目标是拿到 100 分,不然就不睡觉。经过千辛万苦,你拿到了 99 分,就要看到成功的曙光的时候,你竟然失手了!你悲痛欲绝,滴血的心在呼喊着,“为什么上天要这样折磨我?为什么不让我存档?”
想象一下你正在写代码,你今晚的目标是实现某一个新功能,不然就不睡觉。经过千辛万苦,你终于把代码写好了,保存并编译运行,你看到调试信息一行一行地在终端上输出。就要看到成功的曙光的时候,竟然发生了错误!你仔细思考,发现你之前的构思有着致命的错误,但之前正确运行的代码已经永远离你而去了。你悲痛欲绝,滴血的心在呼喊着,“为什么上天要这样折磨我?” 你绝望地倒在屏幕前 ... ... 这时,你发现身边渐渐出现无数的光玉,把你包围起来,耀眼的光芒令你无法睁开眼睛 ... ... 等到你回过神来,你发现屏幕上正是那份之前正确运行的代码!但在你的记忆中,你确实经历过那悲痛欲绝的时刻 ... ... 这一切真是不可思议啊 ... ...
人生如戏,戏如人生
人生就像不能重玩的 Flappy Bird,但软件工程领域却并非如此,而那不可思议的光玉就是 “版本控制系统”。版本控制系统给你的开发流程提供了比朋也收集的更强大的光玉,能够让你在过去和未来中随意穿梭,避免上文中的悲剧降临你的身上。
没听说过版本控制系统就完成实验,艰辛地排除万难,就像游戏通关之后才知道原来游戏可以存档一样,其实玩游戏的时候进行存档并不是什么丢人的事情。
在本节,我们使用 git
进行版本控制。下面简单介绍如何使用 git
:
游戏设置
首先你得安装 git
:
- Linux 下
# Debian , Ubuntu
sudo apt install git
# Debian , Ubuntu
sudo apt install git
2
- windows 下
从这里下载 https://git-scm.com/download/win
下载完安装一路点 next
就行,什么配置也不用动。
安装好之后,你需要先进行一些配置工作。在终端里输入以下命令:
git config --global user.name "Zhang San" # your name
git config --global user.email "zhangsan@foo.com" # your email
git config --global user.name "Zhang San" # your name
git config --global user.email "zhangsan@foo.com" # your email
2
经过这些配置,你就可以开始使用 git
了。
你会通过 git clone
命令来拉取远程仓库的代码,里面已经包含一些 git
记录,因此不需要额外进行初始化。如果你想在别的实验、项目中使用 git
,你首先需要切换到实验、项目的目录中,然后输入
git init
git init
进行初始化。初始化后会创建一个隐藏的文件夹名为 .git
git 会基于这个文件夹来进行版本控制功能。
查看 commit 信息
使用
git log
git log
查看目前为止所有的 commit 记录。
(commit:提交)
使用
git status
git status
可以得知,与当前存档相比,哪些文件发生了变化。
提交
你可以像以前一样编写代码。等到你的开发取得了一些阶段性成果,你应该马上进行 “提交(commit)”。
首先你需要使用 git status
查看是否有新的文件或已修改的文件未被跟踪;若有,则使用 git add
将文件加入跟踪列表,例如
git add file.c
git add file.c
会将 file.c
加入跟踪列表。如果需要一次添加所有未被跟踪的文件,你可以使用
git add -A
# 或者
git add .
git add -A
# 或者
git add .
2
3
但这样可能会跟踪了一些不必要的文件(二进制文件),例如编译产生的 .o
文件,和最后产生的可执行文件。事实上,我们只需要跟踪代码源文件即可。为了让 git
在添加跟踪文件之前作筛选,你可以编辑 .gitignore
文件(没有的话手动创建 文件名就叫这个),在里面给出需要被 git
忽略的文件和文件类型。
这个网页 可以根据你搜索的语言来给你创建必要的 .gitignore
文件
# .gitignore文件示例
.idea # 编辑器配置
__pycache__ # 缓存文件夹
node_modules # 某个可以拉取的模块文件夹
dist
*.local # 以.local为后缀的文件
index.html # 一个文件
file.o # 一个编译后的文件
# .gitignore文件示例
.idea # 编辑器配置
__pycache__ # 缓存文件夹
node_modules # 某个可以拉取的模块文件夹
dist
*.local # 以.local为后缀的文件
index.html # 一个文件
file.o # 一个编译后的文件
2
3
4
5
6
7
8
建议把编译后的文件都加入 .gitignore
并在 README.md
文件中留下编译的详细操作流程,节省 .git
空间、符合提交规范。
把新文件加入跟踪列表后,使用 git status
再次确认。确认无误后就可以存档了,使用
git commit -m "...comment..."
git commit -m "...comment..."
提交工程当前的状态(注释)。其中 ...comment...
是你本次提交的注释(一般在注释中简略写出本次提交干了什么)以下为注释规范,养成良好习惯请遵守:
模板:
type(scope): subject
type为commit的类型
feat: 新特性
fix: 修改问题
refactor: 代码重构
docs: 文档修改
style: 代码格式修改
test: 测试用例修改
chore: 其他修改, 比如构建流程, 依赖管理.
perf: 性能提升的修改
build: 对项目构建或者依赖的改动
ci: CI 的修改(ci是自动构建 感兴趣可以搜搜 github workflow )
revert: revert 前一个 commit ( 撤销前一个commit )
scope是文件名/模块名/影响的范围
例如 schoolSchedule
subject为commit概述
建议符合 50/72 formatting
例 feat(JoinForm): add success submit tips
注意 冒号和subject之间要加空格
模板:
type(scope): subject
type为commit的类型
feat: 新特性
fix: 修改问题
refactor: 代码重构
docs: 文档修改
style: 代码格式修改
test: 测试用例修改
chore: 其他修改, 比如构建流程, 依赖管理.
perf: 性能提升的修改
build: 对项目构建或者依赖的改动
ci: CI 的修改(ci是自动构建 感兴趣可以搜搜 github workflow )
revert: revert 前一个 commit ( 撤销前一个commit )
scope是文件名/模块名/影响的范围
例如 schoolSchedule
subject为commit概述
建议符合 50/72 formatting
例 feat(JoinForm): add success submit tips
注意 冒号和subject之间要加空格
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
其中详细内容可以参照 约定式提交
你可以使用 git log
查看存档记录,你应该能看到刚才编辑的注释。
读档(回溯到某一个 commit)
如果你遇到了上文提到的让你悲痛欲绝的情况,现在你可以使用光玉来救你一命了。首先使用 git log
来查看已有的存档,并决定你需要回到哪个过去。每一份存档都有一个 hash code
,例如 b87c512d10348fd8f1e32ddea8ec95f87215aaa5
, 你需要通过 hash code
来告诉 git
你希望读哪一个档。使用以下命令进行读档:
git reset --hard b87c
git reset --hard b87c
其中 b87c
是上文 hash code
的前缀:你不需要输入整个 hash code. 这时你再看看你的代码,你已经成功地回到了过去!
但事实上,在使用 git reset
的 hard
模式之前,你需要再三确认选择的存档是不是你的真正目标。如果你读入了一个较早的存档,那么比这个存档新的所有记录都将被删除!这意味着你不能随便回到 “将来” 了。
分支
当然还是有办法来避免上文提到的副作用的,这就是 git
的分支功能。使用命令:
git branch
git branch
查看所有分支。其中 master
是主分支,使用 git init
初始化之后会自动建立主分支。
读档的时候使用以下命令:
git checkout b87c
git checkout b87c
而不是 git reset
。这时你将处于一个虚构的分支中,你可以
- 查看
b87c
存档的内容 - 使用以下命令切换到其它分支
git checkout 分支名
git checkout 分支名
- 对代码的内容进行修改,但你不能使用
git commit
进行存档,你需要使用
git checkout -B 分支名
git checkout -B 分支名
- 把修改结果保存到一个新的分支中,如果分支已存在,其内容将会被覆盖
不同的分支之间不会相互干扰,这也给项目的分布式开发带来了便利。有了分支功能,你就可以像第三视点那样在一个世界的不同时间 (一个分支的多个存档),或者是多个平行世界(多个分支)之间来回穿梭了。
更多功能
以上介绍的是 git
的一些基本功能, git
还提供很多强大的功能,例如使用 git diff
比较同一个文件在不同版本中的区别,使用 git bisect
进行二分搜索来寻找一个 bug 在哪次提交中被引入...
其它功能的使用请参考 git help
, man git
,或者在网上搜索相关资料。
全球最大男性交友网站 —— Github
🤡
想象一下你正在进行人生中第一次软件开发的小组合作。
你把任务分配好让组员去写代码中的某一个模块。组员写好之后发给你。
你一看,通过 QQ 发过来的是一个文件啊文件 比如说 学生管理模块.c
你打开一看,我去是乱码。
你废了九牛二虎之力把他的 GBK 编码改成 UTF8 之后,细细地品鉴这段代码,发现我去有严重逻辑错误,而且代码很不规范。
你通过 QQ 告诉他,这一行有问题,能不能改一下。他说,好的我改一下。
然后又发了文件啊文件给你,如此反复循环,你俩已经互相传了好几百个源代码文件,很没效率!
通过 Git 版本控制管理自己的代码,再通过 Github 来发布、同步互联,是一个很好的解决方案!
简介
作为开源代码库以及版本控制系统,Github 拥有超过 900 万开发者用户。随着越来越多的应用程序转移到了云上,Github 已经成为了管理软件开发以及发现已有代码的首选方法。
页面大概是这样(老图):
Git 和 Github
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。
Git 绑定 Github
🤗
下面将教学如何注册这个网站,并给本项目点一个小小的 kita kita 的 star🎇
第一步:注册账号
(GitHub 官网)右上角点击 sign up 会有一个非常酷炫的界面指引你注册 🥳
他会用一个像是命令行交互的方式引导注册,你需要依次填写 邮箱
、 密码
、 用户名(此为 ID 非昵称)
、 是否同意邮箱广告推送
、 机器验证码
之后创建账户,随后会给你填写的邮箱发送验证码,填写注册。
随后是一个欢迎问卷😋随便填写、如果他问你什么 PRO Plan 选择 free 不付费就好。
最后你访问 GitHub 官网应该会显示你的 dashboard 管理台界面
第二步:选择你拉取仓库的方式
点开 github 某个仓库的绿油油的 <>Code
按钮,你会发现有三种 clone 方式。
分别为
- https(基本无配置,有图形化界面就能用)
- ssh(有公私钥设置,没有图形化界面也能用)
- gh-cli(github 出品的 cli 工具)
【https 方法配置】账号绑定 github
在命令行配置好你的 id 和邮箱
git config --global user.name "Zhang San" # your name
git config --global user.email "zhangsan@foo.com" # your email
git config --global user.name "Zhang San" # your name
git config --global user.email "zhangsan@foo.com" # your email
2
在 GitHub 主页,找到 New
或者 Create repository
一个绿色的按钮,创建一个新的仓库
然后填上这个仓库的大名就可以创建了
进入你新创建的仓库
跟随新创建之后的指引, …or create a new repository on the command line
内他描述了如何创建一个文件夹、创建一个 README.md 的文件,然后和 github 仓库绑定。
push 的时候 github 会弹窗索要你的 github 账号和密码,填上去就能用了。
【ssh 方法配置】创建 SSH Key 并获取公钥
先在 C:\Users\用户名\.ssh
下找有没有 id_rsa
和 id_rsa.pub
文件
如果有就直接跳过这一步
如果没有,打开 Shell(Windows 下打开 Git Bash 前提是你已经安装好了 git 在桌面右键应该会有 Git bash here 选项),创建 SSH Key:
ssh-keygen -t rsa -C "youremail@example.com" # youremail为你注册用的电子邮件地址
ssh-keygen -t rsa -C "youremail@example.com" # youremail为你注册用的电子邮件地址
打开 id_rsa.pub
,复制里面的内容
【ssh 方法配置】绑定 Github
登陆 GitHub
,点击右上角自己的头像,打开 settings
然后打开左侧栏 SSH and GPG`` keys
页面
然后,点 New SSH Key
,填上任意 Title,在 Key 文本框里粘贴 id_rsa.pub
文件的内容即可
【ssh 方法配置】创建仓库并和本地绑定
绑定完 GitHub 然后你可以创建仓库了
首先在 GitHub 主页,找到 New
或者 Create repository
一个绿色的按钮,创建一个新的仓库
然后填上这个仓库的大名就可以创建了
根据之前学习的方法在本地创建完 git 仓库之后
在 git bash 中输入:
git remote add origin git@github.com:yourname/gitexample.git
# 请将yourname换成自己的id
git remote add origin git@github.com:yourname/gitexample.git
# 请将yourname换成自己的id
2
就可以绑定
或者是直接 git clone 下来
git clone git@github.com:yourname/gitexample.git
git clone git@github.com:yourname/gitexample.git
或者你可以跟随新创建之后的指引, …or create a new repository on the command line
内他描述了如何创建一个文件夹、创建一个 README.md 的文件,然后和 github 仓库绑定。
下载代码 ——clone
拷贝他人存档也未尝不可,而我们如果用他人存档时,次次都需要一样一样的拷贝文件和代码未免太过折磨,下面简单介绍如何使用
git clone <url>
git clone <url>
接下去对着下面这个 GitHub 的代码使用一下
首先,代码的 url 在下图所示的位置
然后复制完代码后切换回我们的命令行
# powershell or cmd
# 进入(cd)到想要存储该代码的地方(父文件夹目录)
git clone https://github.com/camera-2018/git-example.git
# powershell or cmd
# 进入(cd)到想要存储该代码的地方(父文件夹目录)
git clone https://github.com/camera-2018/git-example.git
2
3
这里使用的例子是我的仓库,当然你也可以用你自己的仓库。
如果你使用我的仓库的话,你 clone 过后在你自己电脑更改的文件等东西,是没法直接提交回来的(因为你没有我仓库管理权限)
如果你非要给我的仓库添加东西呢 也是可以,参照下面的 PR(Pull Request)教程
一阵抽搐过后就下载好了
TIP
用完之后别忘记给 camera-2018 点个 follow 😋 呃呃 follow 没用 star 有用
注意:失败就重试吧 还失败建议使用魔法(非国内网你懂得)
提交和合并分支
如图 我在仓库里新建了 helloworld.c
并且写了一些代码
接下来是提交操作
git status #看一下文件暂存区
git status #看一下文件暂存区
红色表示文件没有提交到暂存区 我们要提交
接下来
git add . #将没有提交的所有文件加入暂存区
git add . #将没有提交的所有文件加入暂存区
绿色表示所有文件已加入暂存
git commit -m "feat(helloworld): add helloworld file"
git commit -m "feat(helloworld): add helloworld file"
将刚才加入暂区的文件发起了一个提交,提交注释(commit message)是 feat(helloworld): add helloworld file
如果这是你自己的仓库有权限(本人仓库或 Collaborators 有权限的情况下)你就可以直接使用
bashgit push origin main # origin 是第四步里 remote add 起的远程名字 # main 是分支名
git push origin main # origin 是第四步里 remote add 起的远程名字 # main 是分支名
1
2上传本次提交
如果你没有本仓库的主分支提交权限 可以提交 PR(Pull Requests)
第一种情况:这里假设我是协作者 无主分支权限,但有创建分支权限
首先创建一个新分支 命名为
yourname-dev
然后按照上面的方法
git clone
并切换到你刚创建的分支bashgit switch camera-2018-dev
git switch camera-2018-dev
1然后提交一个文件,这里直接使用 vscode 自带的 git 工具试试(很方便、不用敲命令行)
点暂存所有更改 写好 comment 之后点提交
最后点同步更改上传
如果是你提交 在 github 上会显示这个 快捷创建 pr 的按钮
点它创建 PR
这样管理本仓库的人看到 pr 请求就可以 merge 合并辣
实际合作过程中可能会出现代码冲突无法 merge 的情况 😋 遇到了自己去 STFW 吧
第二种情况:我不是协作者、我什么权限也没有,我看了这个 public 项目后觉得很好但是有一些问题,我要给他贡献一些代码
可以点击仓库右上角的 fork
这样会在你的名下多出来一份这个同名仓库,而这个仓库你是拥有所有权限的,你可以 clone 你这个同名仓库,更改代码,提交代码之后
回到源仓库点击 Pull Request 然后创建 PR
New pull request
最上面会提示你说
Comparing changes Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also compare across forks .
点击小蓝字
compare across forks
这会让你对比你 fork 仓库和源代码仓库的提交记录,之后就可以创建 PR 了,原作者看到了会合并。
其他功能
问题跟踪:GitHub 的问题跟踪功能可用于报告软件中的问题、错误和功能请求,并进行讨论、分配和解决。
Wiki 页面:用户可以创建和编辑与存储库相关的 Wiki 页面,用于提供项目的文档、指南、示例代码等。
Pull 请求(Pull Requests):使用者可以将自己的代码变更提交给其他项目的所有者,并请求合并到主干代码中。
项目管理:GitHub 提供项目管理功能,包括任务管理、里程碑(milestones)、项目板(project boards)等工具,可用于组织和跟踪项目的进展。
部署功能:GitHub 可以与各种持续集成和部署(CI/CD)工具集成,帮助开发人员自动化构建、测试和部署他们的应用程序。
统计信息:GitHub 提供有关存储库活动和贡献者的统计信息,例如提交图表、活动日历等,有助于跟踪和分析项目的发展。
社交功能:用户可以关注其他用户、存储库和组织,接收他们的更新和活动通知,并与他们进行交流和讨论。
代码审核(Code Review):GitHub 的 Pull 请求功能允许团队成员对代码进行审查和讨论,以确保代码质量和最佳实践。
集成和扩展:GitHub 支持与其他工具和服务的集成,例如持续集成(CI)工具、代码质量检查工具、项目管理工具等。
页面托管:GitHub Pages 功能使您可以托管静态网站和文档,这在展示和共享项目文档、演示和博客等方面非常有用。
然后还有一些比如说 Copilot 之类的有用的功能。
Copilot 是 GitHub 推出的一款基于人工智能技术的代码辅助工具。它使用了机器学习模型 codex,并针对编写代码的场景进行了训练。
Copilot 可以根据上下文和输入的提示,为开发人员生成代码建议和自动完成。它可以通过分析现有代码库、注释和上下文来生成代码片段,提高编码效率并减少重复劳动。
Copilot 白嫖教程
你需要学生认证你的 Github 账号。
地址在 https://education.github.com/students 点击 Sign up for Global Campus
来开始认证,下面会让你输入学校,绑定学校邮箱(杭电为 @hdu.edu.cn 结尾的邮箱)(如果你是杭电新生的话,可能要等到智慧杭电账号发放时才能注册杭电邮箱)并上传学生证明(从 21 年开始这个验证越来越严,如果不过的话你可以尝试 学生证第一页
、 学生证第一页英文翻译(像有道翻译那样 P 图上去)
、 学信网学籍证明英文翻译(英文也是 P 上去)
)
通过了的话你的账户会有 Pro 标识 然后你可以享受的 Github 学生包里包含这些东西
里面比较有用的有
- JETBRAINS 全家桶的免费用(我没用,我用的是 jb 自己家的验证方式,不是 github)
- name.com 家的一个一年期的免费域名(大概价值吧 六七十块钱?)
- github 的容量扩容和 actions 时间扩容、Codespaces 时间延长、Pages 扩容(没啥用倒是)
- Termius 学生包,这是我很喜欢用的终端软件,有学生包可以多端同步 ssh 的账号密码啥的,很方便。
- Sentry 容量扩容
- Copilot 免费用
你可以在 settings
里看到你的 copilot,配置如下
然后就可以在你喜欢的 IDE 或编辑器上下载 Copilot 插件,来启用他。