仅做学习记录使用。
本次课程主要的目的是介绍常见的协同开发与版本控制工具——Git的使用,并要求同学们能够利用Git工具和在线的代码托管仓库Github进行多人协同开发与版本控制。
本操作流程包括三个方面:
- Git工具的基本使用
- Github在线协同开发
- 代码的版本控制
因为课堂时间有限,第一部分Git工具的基本使用需要同学们课下进行提前预习,课上我们主要围绕协同开发与版本控制部分进行演示与讲解,有兴趣和时间的同学也可继续预习剩下的部分,预习过程中可往年的课程录播视频(包含基本的使用)。
因为课上需要同学们尽量跟随演示自行完成任务,同时为了方便同学们完成课后作业,需要同学们进行如下的准备工作:
- 准备Ubuntu系统(注意:由于大部分同学使用的还是Windows系统,因此这步不强求,有条件的同学可自行选择用虚拟机安装或使用win10自带的子系统,没有条件的同学也可使用Windows自带的命令行工具;使用MacOS系统的同学可以保持现状),同时掌握命令行工具的基本使用;
- 安装Git命令行工具,参考 https://git-scm.com/book/zh/v2/起步-安装-Git 或其他网上的相关博文;同时,完整的文档也在Git - Book 下,后续的使用均可参照本文档的内容;
- 注册Github账号,并尽量提前与其他同学组成3-4人的队伍,以便于课上进行演示练习和完成课后作业(Github目前在国内访问很不稳定,同学们最好提前注册下国内的代码托管平台“码云”:Gitee - 基于 Git 的代码托管和研发协作平台,不能访问github的同学及时换到gitee)
1.Git工具的基本使用(请认真预习该部分)
1.目的:查看版本号,若有输出则为成功安装命令行工具
命令:
git --version(以下命令均针对Ubuntu系统,其他系统命令若不同请根据功能查询对应命令)
示例:
2.目的:创建工作目录并初始化工作目录
命令:
mkdir gitdemo # 建立工作目录
cd gitdemo # 转到工作目录
git init # 初始化工作目录
ls .git # 查看创建的git隐藏目录
示例:(示例系统为中文环境,若无中文环境则命令输出为英文)
3.目的:添加新文件并修改,查看git仓库状态
命令:
touch fileinfo.py # 创建新文件
打开文件,复制已有代码的第1-8行进入新文件
git status # 查看状态,发现文件的状态为未跟踪
示例:
4.目的:已修改文件的添加与提交:
命令:
git add fileinfo.py # 添加修改的文件到暂存区
git status # 再次查看状态,发现文件已变为待提交
# 在commit之前,需要设置用户名和邮箱,保证提交者为本人
git config user.email “you@example.com“ # 邮箱为注册github时的账号
git config user.name "Your Name" # 名字为自己的名字或昵称均可
git config user.email # 查看写好的邮箱
git config user.name # 查看写好的名字
git commit -m "initial update" # 提交修改,-m后填写本次提交的说明
git status # 再次查看状态,已无任何文件待追踪或提交
示例:
5.目的:尝试查看暂存区的功能
命令:
touch test1.py # 新建文件1
touch test2.py # 新建文件2
git status # 发现两个文件均为未追踪状态
git add test1.py # 只添加文件1至暂存区
git commit -m “add test1.py” # 进行提交
git status # 发现只有test1.py被提交,test2.py仍未未追踪状态
示例:
6.目的:修改文件后的再次提交
命令:
打开文件,复制已有代码的第9-36行进入fileinfo.py
git status # 发现fileinfo.py已经被修改
git diff fileinfo.py # 查看修改的内容,按q可退出
git add fileinfo.py # 添加至暂存区
git commit -m "modify" # 提交修改
示例:
2.Github在线协同开发
1.目的:在github中新建对应的项目(默认已注册好github账号)
2.目的:在本地项目中添加远程仓库,从而可以将代码及各个历史版本 存储在云端
命令:
git remote add origin <仓库链接>
# origin为在线仓库名称,后面的链接从在线仓库处获得,存在多种方式,这里以https为例(若无法连接请切换至gitee)
git remote -v # 查看已经添加好的在线仓库
示例:
3.目的:从云端仓库拉取最新代码与推送本地提交至云端仓库
命令:
git pull origin master
# 从云端拉取最新代码并合并至本地代码,master为分支名(分支不在本课程讲授范围内,如果有同学感兴趣可以在文档中查看并学习,这里我们只使用主分支;主分支名最早默认为master,但因为歧视问题现在默认为main,但这里我修改了我账号中的默认主分支仍为master)
git pull origin master --allow-unrelated-histories
# 合并时可能会出现拒绝合并无关历史的警告,使用参数来进行强制合并;强制合并过程中会要求填写合并说明,可以填写或直接跳过
git push origin master# 之前我们已经提交过两次修改了,这里需要将修改推送到云端仓库,推送过程需要输入密码(如使用ssh方式则无需密码,且速度更快更稳定,但需要进行一定的配置,感兴趣的同学可自行查看);提交成功后打开云端仓库可看到改变情况,点击提交说明可查看提交的具体情况
示例:
4.目的:多人协作开发,其余开发者先fork管理员的目标主仓库,再克隆fork后的仓库并进行自己的开发,提交并推送至自己的仓库,再发起pull request并等待管理员同意与合并
示例:
a.开发者先fork,fork后会发现在自己的仓库内出现了fork后的仓库
b.开发者git clone以克隆下来fork后的自己的库(注意不是主库)
c.为了能够让开发者随着跟进管理员主库的改变,需要将主库添加至remote中
d.开发者从主库中pull下来最新的代码
e.开发者向自己的仓库内提交代码,如果向管理员主库提交代码会提示没有权限
f.回到开发者自己的网页端,创建新的pull request并提交
g.管理员回到自己的网页端,查看主库内新增的pull request,在审查与测试后分别点击按钮允许合并,则开发者的提交合并至主库内
h.注意:如果开发者已经被添加到主库的协作者当中,如果开发者有权限,开发者可以自行将自己的pull request合并至主库,但仅限于无需审查的小型项目的快速开发
代码的版本控制
1.目的:代码的版本查看
命令:
git log# 查看提交的版本记录,每次提交都为一个版本,和github页面上展示的版本号一致
示例:
2.目的:查看每个版本的具体修改内容
命令:
git show <commit id> # 查看对应版本的具体信息,在云端仓库可视化页面中也可以查看
示例:
3.目的:版本的回退与回滚
命令:
git reset --hard <commit id> # 将当前版本回退到指定的版本
git push origin master -f # 将回退的版本强制推送到云端仓库
git revert <commit id> # 回滚当前版本的某一次提交(删除指定的提交)
git push origin master # 回滚相当于一次新的提交,直接推送即可
示例: