Git工具
1 为什么学Git
问:为什么学PyCharm呢?
方便个人代码编写和管理。
PyCharm只是方便个人编写和代码管理,在公司中,一般都是多人合作开发,所以,多人开发的项目中,如何进行管理呢?
PyCharm搞不定。
这个时候就需要使用版本控制工具了。
Git就是其中一款版本控制工具。
2 版本控制简介
2.1 文件版本控制

人肉版本控制缺点
- 操作麻烦, 每次都需要复制 → 粘贴 → 重命名
- 无法通过文件名知道具体做了哪些修改
- 容易丢失, 如果硬盘故障或不小心删除,文件很容易丢失
- 协作困难, 需要手动合并每个人对项目文件的修改,合并时极易出错
2.2 版本控制软件(Version Control Software)
概念: 版本控制软件是一个用来记录文件变化,以便将来查阅特定版本修订情况的系统,因此有时也叫做版本控制系统。
通俗的理解: 把手工管理文件版本的方式,改为由软件管理文件的版本;这个负责管理文件版本的软件,叫做版本控制软件。
SVN(Subversion):集中式版本控制系统,代码和版本控制数据存储在中央仓库中。
Git:分布式版本控制系统,每个开发者都有完整的版本历史。
2.3 版本控制软件优点
操作简便:只需要记几组简单的终端命令或者图形化界面点选操作,即可快速上手常见的版本控制软件
易于对比:基于版本控制软件提供的功能,能够方便地比较文件的变化细节,从而查找出导致问题的原因
易于回溯:可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态
不易丢失:在版本控制软件中,被用户误删除的文件,可以轻松的恢复回来
协作方便:基于版本控制软件提供的分支功能,可以轻松实现多人协作开发时的代码合并操作
2.4 版本控制软件的发展
本地版本控制系统(RCS)

特点:使用软件来记录文件的不同版本,提高了工作效率,降低了手动维护版本的出错率
缺点:
① 单机运行,不支持多人协作开发
② 版本数据库故障后,所有历史更新记录会丢失
集中式版本控制系统(SVN)

特点:基于服务器、客户端的运行模式
① 服务器保存文件的所有更新记录
② 客户端只保留最新的文件版本
优点:联网运行,支持多人协作开发
缺点:
① 不支持离线提交版本更新
② 中心服务器崩溃后,所有人无法正常工作
③ 版本数据库故障后,所有历史更新记录会丢失
分布式版本控制系统(Git)

特点:基于服务器、客户端的运行模式
① 服务器保存文件的所有更新版本
② 客户端是服务器的完整备份,并不是只保留文件的最新版本
优点:
① 联网运行,支持多人协作开发
② 客户端断网后支持离线本地提交版本更新
③ 服务器故障或损坏后,可使用任何一个客户端的备份进行恢复
3 Git简介
Git的诞生源于Linus Torvalds(Linux 操作系统的创始人)对当时使用的版本控制系统BitKeeper的不满。BitKeeper是一个商业版本控制工具,它在Linux内核项目中被使用,但由于商业许可的限制,Linux社区决定寻找一个开源的替代方案。
Linus Torvalds于2005年4月发布了Git的第一个版本。这个版本非常简陋,核心目标是解决Linux内核项目的版本控制问题。
3.1 什么是git
Git是一个开源的分布式版本控制系统
- 目前世界上最先进、最流行的版本控制系统
- 可以快速高效地处理从很小到非常大的项目版本管理
**特点:**项目越大越复杂,协同开发者越多,越能体现出Git的高性能和高可用性
Git之所以快速和高效,主要依赖于它的如下两个特性:
-
直接记录快照,而非差异比较
-
近乎所有操作都是本地执行
在Git中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息
-
断网后依旧可以在本地对项目进行版本管理
-
联网后,把本地修改的记录同步到云端服务器即可

3.2 Git的安装
在开始使用Git管理项目的版本之前,需要将它安装到计算机上。可以使用浏览器访问如下的网址,根据自己的操作系统,选择下载对应的Git安装包:


安装十分简单,一路下一步即可。
Pycharm中配置git

3.3 概念区分
shell
# 1.git
git是版本控制工具。它是个工具。
可以帮助团队进行更好地协作开发。
它只是众多的版本控制工具其中一个而已。比如jira,SVN。
现在行业内都用git。
# 2.github
代码托管平台。全球最大的,没有之一。
换言之,放到github的代码都是开源代码。
可以让任何人在任何地方随意访问。
github被微软收购了,github是微软的了。
在工作中,如果需要查阅优秀的代码/项目,都可以来这里找找。
都是用git来操作。
# 3.gitee
国内版的github,别名码云。
有了github,为什么还有有gitee呢?
github是国外的服务器,有时候需要科学上网。
用git来访问操作。
# 4.gitlab
gitlab,也是类似于github的软件(免费使用),一般用于公司内部的git私仓。
公共仓库:开源的,大家都能访问的代码仓库(文件夹)。
私人仓库:闭源的,不允许别人访问的仓库。
国内的大厂,都会有自己的git内部代码平台,比如腾讯:工蜂。
git:工具,可以把代码推送到平台上。
平台:仓库。(公共仓库,私人仓库)
3.4 git架构

解释:
shell
仓库:简单理解,就是文件夹。
本地仓库:文件夹在本地创建的。图示就是版本库。
远程仓库:代码托管平台上。github、gitee、gitlab、工蜂
工作区:就是干活的地方。在哪个分支干活,哪里就是工作区。
暂存区:只是暂存代码而已,如果代码OK,没有问题,则一定要commit(提交)。
# 注意:不能往主分支提交有bug的代码。最多在你自己个人分支玩玩。
3.5 git的分支
3.5.1 分支的概念与作用
在日常工作中,我们经常会增加/修改代码, 如新功能开发、bug修复、代码重构等等。在这些情况下, Git的分支功能会发挥巨大的作用:它允许你在代码库中创建多个不同的分支,每个分支代表着代码库的不同状态,方便开发人员在多个分支之间进行切换和修改代码。

当我们在Git中创建一个新的分支时:
- git会以当前所在分支的状态作为基础来创建一个新的分支,并保留了当前分支的所有提交历史
- 可以在新分支上独立地进行开发、修改代码,并在需要时将代码合并回原始的分支
- 可以保持代码库的主分支干净整洁,并且方便开发人员在不同的功能或任务之间进行切换。
Git分支还有许多其他的用途,比如
- 创建临时性的修复分支来修复线上问题
- 创建独立的实验分支用于尝试新的技术
- 创建发布分支用于发布软件版本等等
Git分支是一个非常有用的工具,可以帮助程序员更好地组织和管理代码变更,提高开发效率和代码质量
在进行多人协作开发的时候,为了防止互相干扰,提高协同开发的体验,建议每个开发者都基于分支进行项目 功能的开发,例如:

3.5.2 主分支(master)
在初始化本地 Git 仓库的时候,Git 默认已经帮我们创建了一个名字叫做 master 的分支。通常我们把这个 master 分支叫做主分支。

在实际工作中,master主分支的作用是:用来保存和记录整个项目已完成的功能代码。
因此,不允许程序员直接在 master 分支上修改代码,因为这样做的风险太高,容易导致整个项目崩溃。
3.5.3 功能分支
由于程序员不能直接在 master 分支上进行功能的开发,所以就有了功能分支的概念。
功能分支指的是专门用来开发新功能的分支,它是临时从 master 主分支上分叉出来的,当新功能开发且测试 完毕后,最终需要合并到 master 主分支上,如图所示:

3.6 项目托管平台的介绍与应用
专门用于免费存放开源项目源代码的网站,叫做开源项目托管平台。目前世界上比较出名的开源项目托管平台 主要有以下 3 个:
- Github (全球最牛的开源项目托管平台,没有之一)
- Gitlab (对代码私有性支持较好,因此企业用户较多)
- Gitee (又叫做码云,是国产的开源项目托管平台。访问速度快、纯中文界面、使用友好)
Github 是全球最大的开源项目托管平台。只支持 Git 作为唯一的版本控制工具,GitHub可以:
① 关注自己喜欢的开源项目,为其点赞打 call
② 为自己喜欢的开源项目做贡献(Pull Request)
③ 和开源项目的作者讨论 Bug和提需求 (Issues)
④ 把喜欢的项目复制一份作为自己的项目进行修改(Fork)
⑤ 创建属于自己的开源项目
⑥ etc...
本次实战使用gitee码云作为项目托管平台
3.6.1 申请成为项目开发者
注册码云 gitee.com
properties
邀请链接:
https://gitee.com/weiyunfei/bj-ai22_datamining/invite_link?invite=e015fe382b80530932d82f09758bfd0318cb9730a88569beb7993663152babc549008aef05641c9903eac9232b9ccfc5
properties
在申请之前, 首先需求先将自己的账户名字更改为: 组号_姓名 如果不是此格式, 不允许通过
例如名字为: 组名_姓名拼音
如何更改用户名:


3.6.2 配置ssh公钥
前期确认工作:
首先确认在码云是否配置了SSH公钥信息



如何生成公钥:
在windows下我们可以使用Git Bash.exe来生成密钥,可以通过开始菜单或者右键菜单打开Git Bash

git bash 执行命令,生成公钥和私钥
macos打开命令行终端,进入**~/.ssh**目录,执行命令后在.ssh目录下就生成了公钥和私钥
sh
ssh-keygen -t rsa
(四个回车即可)

执行命令完成后,在window本地用户.ssh目录C:\Users\用户名\.ssh下面生成如下名称的公钥和私钥:

id_rsa.pub文件用记事本打开, 复制里面的内容, 放到下面截图中 对应的文本框中既可。
ssh 密钥配置
密钥生成后需要在码云上配置密钥本地才可以顺利访问


在key部分将id_rsa.pub文件内容添加进去,然后点击"Add SSH key"按钮完成配置
配置完后,就可以从Gitee远程仓库拉取代码到本地了。
先成为仓库的开发者,然后才能进行git操作
邀请链接:
properties
https://gitee.com/weiyunfei/bj-ai22_datamining/invite_link?invite=e015fe382b80530932d82f09758bfd0318cb9730a88569beb7993663152babc549008aef05641c9903eac9232b9ccfc5
3.6.3 终端操作Git

在本地磁盘上, 随便找一个目录。右键点击克隆
shell
# 1.拉取代码的命令
git clone git@gitee.com:weiyunfei/bj-ai22_datamining.git

sh
git add test.py # 添加文件
git status # 查看文件状态
git commit -m '注释' # 提交文件
git push # 推送文件
git pull # 拉取文件
git branch # 查看分支
git branch 分支名称 # 创建分支
git branch -d 分支名称 # 删除分支
git checkout 分支名称 # 切换分支
git merge 分支名称 # 合并分支
git log # 查看提交历史, 查看提交版本号
git checkout 版本号 # 回退某个版本
3.6.4 Pycharm操作Git(推荐)
3.6.4.1 克隆Git项目
点击如下按钮,输入git链接,点击clone即可
python
git@gitee.com:weiyunfei/bj-ai22_datamining.git


git clone后,用pycharm打开对应文件夹
设置git,在设置中配置git安装路径

3.6.4.2 新建并切换分支
新建分支
新建分支,然后推送(push)一下, 在gitee中可以看到新建的分支

每个人分子名称格式group组号_姓名拼音,例如:group01_weiyunfei




后续就可以在pycharm中开发, 在自己的分支中开发, 开发后把相关的内容提交到仓库中即可, 并且可以每日推送到远端仓库
切换分支

3.6.4.3 Git操作
-
commit 文件提交到本地 注意:.idea目录下的文件不要提交
-
push 文件推送到远端
-
checkout 回退到某次提交版本
-
pull 拉取/更新远端文件

文件提交(commit)到版本库(本地)


文件推送(push)到远程仓库



- 开发的时候, 多次commit不一定每次都要push,只要commit之后就会有快照, 就可以恢复之前的状态
- 有bug的代码 不要做commit/push的操作
- 不commit直接push, 操作是允许的, 但是没有实际效果
- push的内容, 都是commit之后的
git更新/拉取
提交之前, 要先pull一下,确认把远端最新的代码更新下来

文件回退到之前版本
选择某一次提交, 然后checkout

首次,会提示yes or no,填写yes
3.6.4.4 合并(Merge)分支操作
A 分支的内容Merge到 B (group_0X)分支,A分支内容要先commit->push
checkout签出 到B(group_0x)分支

右键单击文件夹 git → merge


选择从哪个分支里merge,点击Merge,此时是Merge到本地, 再push到远端

merge冲突的解决:
多个人改同一份代码可能就会出现冲突问题
master和group01分支分别修改test.py commit push后,master合并group01时会发生冲突


项目目录tips:

-
code 源代码.py文件、notebook文件、数据集
-
PD(Project document) 项目文档
e
外链图片转存中...(img-pxPAFXel-1768226756629)
外链图片转存中...(img-1Ds9HWso-1768226756629)
选择从哪个分支里merge,点击Merge,此时是Merge到本地, 再push到远端
外链图片转存中...(img-G12FkEex-1768226756629)
merge冲突的解决:
多个人改同一份代码可能就会出现冲突问题
master和group01分支分别修改test.py commit push后,master合并group01时会发生冲突
外链图片转存中...(img-jzkbPsUR-1768226756629)
外链图片转存中...(img-32X1PhU9-1768226756629)
项目目录tips:
外链图片转存中...(img-1KB41Vdx-1768226756629)
-
code 源代码.py文件、notebook文件、数据集
-
PD(Project document) 项目文档
-
memo 开发的过程中, 遇到了哪些问题, 如何解决的, 在这里记录