1. 版本管理
1.1 人工版本管理

人工管理: 费时费力。
1.2 git 概述
git是一款版本管理软件, 可以在任何时间点保存文件,也能够恢复到以前任何时间点保存的文档

main.cpp 在不同的时间点进行了保存,那么就能恢复到任意一个时间点保存的文件
2. git安装
下载地址: https://git-scm.com/downloadshttps://git-scm.com/downloads

下载文件:

安装过程是傻瓜安装,全部next即可。
但是如果要调整安装路径,必须不能包含中文。
安装完成后右键菜单会多出两个选项:

点击 Git Bash Here 可以打开git命令行工具。

学习git 就是学习git命令

3. git 基本操作
3.1 配置 git 用户信息
-
配置提交人姓名:
git config --global user.name 姓名
-
配置提交人邮箱:
git config --global user.email 邮箱地址
-
查看git信息:
git config --list
-
git配置文件路径:
C:\Users\Administrator\.gitconfig
3.2 git工作流程

-
工作目录: 自己的项目目录
-
暂存区: 存放临时修改的文件
-
git仓库: 用来保存编写好的项目文件,任何一个文件都能在任何时间点进行保存
工作流:
-
在项目目录下创建项目文件
-
将项目文件提交到暂存区
注意: 存放在暂存区的文件只有一份,后提交的会覆盖之前提交的文件
-
暂存区文件才能再提交到 Git 仓库
注意:git 仓库中,同一个文件会有多份,都有自己的id号(版本号)
3.3 git基本操作命令
-
git init -初始化git仓库
-
git status -查看文件状态
-
git add 文件名 -添加文件到暂存区,该文件被git管理起来
-
git commit -m 提交信息 -向仓库中提交代码,需要添加提交日志信息
-
git log -查看提交记录
1.创建项目,并创建 git仓库

2.仓库状态

-
On branch master --- 分支相关信息,暂不用看
-
No commits yet --- 尚没有文件提交到仓库
-
Untracked files --- 未追踪文件,即还没有被 git 仓库管理的文件
- 重点:红色代表该文件还没有被 git 管理
3.将main.cpp 添加到暂存区

new file: 代表该文件已增加到暂存区
4.将main.cpp 文件提交到 git 仓库
5.查看日志

3.4 git忽略清单
在实际开发中,有些 文件/文件夹 是不需要被 git 管理的
实际开发时,在项目根目录下创建一个 .git ignore 文件,在文件中写入不希望git管理的文件或者文件夹名称即可
查看状态,此时已经看不到 myapp.pro.user 文件了

3.5 一次性提交多个文件
git add . : . 代表任意文件


3.6 修改文件后再次提交
1.修改 widget.cpp 文件

2.查看文件状态

modified: 说明哪些文件发生了改变,并且在修改之后并没有提交到git
3.再次提交
4. 文件恢复
4.1 暂存区-->项目目录
目标: 使用暂存区中的文件,覆盖当前项目目录中的文件
应用场景: 在时间点A向暂存区进行了一次提交, 之后继续编写代码,在时间点B发现代码有错,需要恢复成时间点A的代码
cpp
git checkout 文件名
示例:
- 修改 widget.cpp 文件中的代码
重点:代码修改完成后并未再次添加到暂存区

- 查看文件状态

3.从暂存区恢复

- 回到Qt编辑器会提示文件被修改过

选择 "Yes to All" 时,恢复成原来的状态(暂存区的版本)

4.2 删除暂存区文件
git rm --cached 文件名
示例1: git rm --cached widget.cpp 从暂存区删除 widget.cpp 文件
示例2: git rm --cached -r . 从暂存区删除所有文件
4.3 git仓库 --> 项目目录(版本穿越)
git log 查看已有版本
git reset --hard commitID
该命令能够从仓库恢复文件,从仓库恢复的文件会同时覆盖暂存区和项目目录的文件。同时,git log命令只能查看到恢复到的版本号。之后的版本号无法看到。
1.使用 git log 查看之前提交的版本

2.要穿越到哪个版本就复制哪个版本号

3.再次查看日志
只能看到第一次提交的版本号

4.4 精简版信息查看
git reflog 查看精简版
查看精简版,能够看到所有的操作

该命令读取的是 .git/logs/HEAD 文件
如果要穿越回其他的任意版本号,都可以从该文件中找到
5. 分支
5.1 分支概述
分支概念: 为项目创建多个副本,每个副本完成一个独立的工作。 分支能够做到多件事情同时进行,且互不影响

-
主分支(master)
-
主分支是系统默认使用的分支,之前示例中的代码提交全部都是在主分支中完成的
-
主分支上最终会保存整个项目的完整代码,项目开发完成后要上线运行,也是运行的主分支上得完整代码
-
-
开发分支(develop)
-
开发分支是为了完成某个功能模块的开发而单独建立的副本。例如:开发用户管理模块(users.cpp)页面时,就能创建 users 分支。
-
开发分支是基于主分支创建的,当然一个开发分支下还能再创建另一个开发分支,形成 父-子-孙-... 结构
-
开发分支上工作完成后,一定会合并回主分支
-
主分支: 系统默认是在主分支(master)上的

开发分支

小结
-
主分支是Git自动帮我们创建的 master,这条分支上的代码一般用于都是线上的项目
-
开发分支,在主分支上进行创建,一般用于我们开发的时候使用,也需要尽量保证其稳定性
5.2 分支命令
-
查看分支:
git branch
-
创建分支:
git branch 分支名
-
在哪条分支上输入的命令,就是在哪条分支上进行的创建
-
git branch users 创建了一个叫做 users 的分支
-
-
切换分支:
git checkout 分支名
-
git checkout users 切换到 users 分支上
-
在 users 分支上只能看到 主分支 和 当前分支(users)上的文件
-
-
注意:当切换分支的时候,需要把暂存区里面的文件进行提交,不然会暂存区里面的文件会跟着到切换的这条分支上
- 当切换回主分支的时候,就看不到其他分支里面的文件了
-
注意: 切换分支时,必须保证当前分支的文件全部提交到仓库。
创建和使用分支案例,步骤如下 :
-
创建项目,并在创建时选择 git 作为版本管理工具
-
新建一个 MyButton 自定义控件,将项目提交到暂存区,再提交到仓库
-
查看分支,创建 users 分支,切换到 users 分支
-
创建 Users模块,并将Users模块提交到users分支上
-
切换 master/users 分支, 查看编辑器中文件显示的情况
1.创建项目,并在创建时选择 git 作为版本管理工具
使用git时会自动生成一个master分支,也叫主分支。项目默认创建在master分支上
- 新建一个 MyButton 自定义控件,将项目提交到暂存区,再提交到仓库
注意: 创建的自定义空间也要交给 git 管理
通过 Qt Creator 创建的项目和文件已经添加到 暂存区

将文件提交到暂存区,再提交到git仓库
3.查看分支,创建 users 分支,切换到 users分支

- 创建 Users模块,并将Users模块提交到users分支上
查看git 状态

将 Users 模块提交到users分支

- 切换 master/users 分支, 查看编辑器中文件显示的情况
① 查看编辑器中的状态

② 切换回主分支

③ 回到编辑器中
编辑器中提示保存文件,一定要选择 关闭项。
④ 切换至 users 分支,观察编辑器

- 同理,创建 goods分支、Goods 模块
5.3 合并分支
-
合并分支:
git merge 分支名
-
git merge users 合并 users 分支
-
注意: 合并分支时,要在 master 分支上
-
5.4 删除分支
-
删除分支:
git branch -d 分支名
-
分支如果没有被合并则不允许删除
-
如果要强制删除使用 -D 参数

强制删除 goods 分支

5.5 临时存储分支
当在某一分支上进行开发时,如果该分支上的文件没有提交到 git 仓库,则不允许进行分支切换。
当你在一个分支工作时,临时出现了一个更紧急的任务需要马上完成。而此时,当前分支的工作并没有完成,也不希望提交,这时就可以进行临时存储。
-
将当前所有的改动临时存储: git stash
-
将临时存储进行恢复: git stash pop
注意:
- 在其他的分支中也能执行恢复改动,但是会把这些文件恢复到当前命令的分支,所以我们在恢复的时候需要注意,我们当时在哪个分支进行的开发
示例:
- 创建 test分支,创建 Test 模块,将 Test模块添加到 test分支

- 对 test.cpp 进行修改

3.因为 test.cpp 被修改了,如果在未提交到仓库前就进行分支切换,会报错

4.此时如果要切换分支,则需要将修改保存到临时存储分支

5.切换分支

6.切换回test分支,并恢复

6. 远程仓库
6.1 远程仓库(github/gitee)
-
企业开发项目时,通常都是若干人组成一个项目组进行开发。
-
git 只能在本地电脑上创建仓库,管理个人编写的项目代码,而实际开发时需要团队协作,这时就需要一个共用的仓库,这个仓库会单独放在一台服务器上,在这台服务器上搭建的仓库就是远程仓库。
-
远程仓库可以是公司内部自行搭建的,也可以使用互联网上的远程仓库。github 和 gitee 是最常用的互联网远程仓库。
-
github是国外的网站,所以速度相对慢一些;gitee(码云),是国内的网站,速度快一些。

6.2 注册 gitee 账号
6.3 多人协作流程

-
项目经理(PM)在本地创建项目主体架构,并提交到本地git仓库;再将项目推送(push)到远程仓库(github、gitee)上
-
邀请程序员 A、B、C 加入项目组
-
程序员 A、B、C 可以远程克隆(clone)项目,然后按照之前分配好的任务完成自己的功能
-
程序员完成功能后,将自己写的代码再推送(push)到远程仓库中
-
项目经理从远程仓库中拉取(pull)所有完成好的项目代码
6.4 PM创建本地仓库
目标:PM创建本地仓库,并将代码提交到本地仓库
步骤:
-
PM创建本地仓库
-
PM将项目代码添加到暂存区
-
PM将项目代码提交到本地仓库
-
PM创建远程仓库 (github)
cpp
# 初始化仓库
git init
# 将项目代码添加到暂存区,
git add .
# 将项目代码提交到本地仓库
git commit -m PM创建项目仓库提交原型
6.5 PM创建远程仓库
1.创建远程仓库

2.填写仓库信息

3.仓库创建成功

6.6 PM将项目文件推送到github
cpp
# 将本地仓库中的最新版本推送到远程仓库
git push https://gitee.com/hhb1218/pm.git master
向远程仓库推送数据时,需要填写用户名和密码

提交成功提示

重载远程仓库页面

6.7 windows凭据
windows凭据中记录了github的账号和密码,所以再向github中推送数据时,不需要再添加账号和密码

6.8 简化推送命令
为远程仓库地址设置别名:git remote add 别名 远程仓库地址
示例:
cpp
# 为远程仓库设置一个简单的别名
git remote add origin https://gitee.com/hhb1218/pm.git
# 使用别名进行推送
git push origin master
# -u 能够保存提交地址和分支下一次直接使用
git push -u origin master
# 使用过 -u 参数后,再次提交,直接使用 git push 即可
git push
6.9 组员clone项目
clone 不需要权限
cpp
git clone https://gitee.com/hhb1218/pm.git
6.10 组员修改程序后提交回远程仓库
PM必须将codeA、codeB、codeC邀请为组员,否则codeA、codeB、codeC没有权限向远程仓库提交数据。

PM 邀请 codeA、B、C 成为开发者:

复制邀请链接并发送给 codeA、B、C

codeA、B、C 接收邀请:
codeA、B、C 登录 gitee后,将PM发送的邀请链接地址复制到浏览器地址栏中
codeA、B、C 接受邀请

6.11 PM拉取最新版本
cpp
git pull origin master
-
git clone 是在第一次加入项目时使用,从远程仓库下载完整的项目代码
-
git pull 是在已有代码基础上执行的,只拉取新增或者修改的文件
6.12 冲突解决
解决办法: coderB 将冲突文件修改后再向 github 进行提交
coderB 要先拉取(git pull) 远程仓库的代码; 手动修改文件解决冲突;再 commit 到本地仓库,再git push 到远程仓库
报错信息:
拉取时提示的冲突信息:
7. ssh免密登陆
-
ssh: 不需要输入用户名和密码也能登录
-
ssh 通过验证公钥和私钥的配对情况决定是否登录
-
公钥和私钥需要开发者使用命令生成
-
公钥:保存在远程仓库
-
私钥:保存在开发者电脑
步骤:
-
生成秘钥: ssh-keygen
-
将公钥复制到 github 中
第一步:生成公钥和私钥:
第二步: 找到公钥并复制公钥字符串:
使用编辑器打开公钥文件,复制文件内容 :
第三步:在gitee仓库中找到 ssh :
第四步: 将公钥添加到网站中 :
使用 ssh 提交文件:
cpp
# 为远程仓库地址起一个别名
git remote add alishow_ssh git@github.com:hhb1218/alishow.git
# 使用 git push 提交文件
git push -u alishow_ssh master
git push
8. readme.md
