共计 6301 个字符,预计需要花费 16 分钟才能阅读完成。
引入
1. 版本控制器
版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一
2. 功能简介
-
版本控制最主要的功能就是追踪文件的变更
-
它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来
-
每一次文件的改变,文件的版本号都将增加
-
除了记录版本变更外,版本控制的另一个重要功能是并行开发:
- 往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率
- 并行开发中最常见的不同版本软件的错误 (Bug) 修正问题也可以通过版本控制中分支与合并的方法有效地解决
3. 版本控制器软件
- SVN
- GIT
4. 采用 git 版本控制器管理代码的公共平台
github
: 远程仓库,全球最大的开源代码库(国外)gitee
: 中国的版 github(很多公司在用)(国内)gitlab
: 公司自己搭建的远程仓库,公司内部的代码放在上面
一.GIT
1.git 简介
-
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目
-
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
-
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持
二.Git 与 SVN 的区别
Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等
- Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别
- Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里
- Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录
- Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征
- Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏
三.Git 安装
下载地址 : https://git-scm.com/download
- 点击响应的版本进行安装
四.Git 的使用
1.Git 工作流程
- 工作区 -----> 暂存区 -----> 版本库
2.Git 分支管理
- 创建子分支开发的目的 : 分支开发是独立的, 不会影响到其他分支, 要将子分支的内容同步到主分支时, 只需要完成分支合并
五.Git 基础命令
1. 将已有的文件夹 - - 初始化为 git 仓库
cd [目标文件夹] # 现进入想要初始化 (想要使用 git 管理) 的文件夹
git init # 进行初始化, 会在当前路径下创建一个 .git 隐藏文件夹
2. 在指定目录下 - - 初始化 git 仓库
cd [目标目录]
git init [仓库名] # 初始化某个仓库
3. 在仓库目录终端下 -- 设置全局用户
- 在家路径新建一个
.gitconfig
文件,把用户名邮箱写进去
git config --global user.name '[用户名]'
git config --global user.email '[用户邮箱]'
- 在全局文件
C:\Users\[用户文件夹]\.gitconfig
新建用户信息,在所有仓库下都可以使用
4. 在仓库目录终端下 -- 设置局部用户
- 在项目路径的
.git
文件夹下的config
文件中加入了用户名和邮箱
git config user.name '[用户名]'
git config user.email '[用户邮箱]'
- 在当前仓库下的 config 新建用户信息,只能在当前仓库下使用
- 一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户
5. 查看仓库状态
- 当仓库中有文件增加、删除、修改,都可以在仓库状态中查看
- 红色:新建,修改,删除,在工作区没有放到暂存区
- 绿色:放到暂存区,没有提交到版本库
- 没有东西:说明所有变更都被版本管理起来了
git status
git status -s # 查看仓库状态的简约显示
- 工作区
- 暂存区
- 版本库
6. 工作区内容提交到暂存区
git add . # 添加项目中所有文件
git add [文件名] # 添加指定文件
7. 提交暂存区内容到版本库
git commit -m " 版本描述信息 " # 没有描述提交不了
8. 撤销工作区操作:改、删
- 回到当前本地版本库内最新版本
git checkout . # 撤销所有暂存区的提交
git checkout [文件名] # 撤销某一文件的暂存区提交
9. 撤销暂存区提交:add 的逆运算(很少使用)
git reset HEAD . # 撤销所有暂存区的提交
git reset [文件名] # 撤销某一文件的暂存区提交
git reset . # 撤销所有暂存区的提交
10. 查看版本库操作日志 (两种)
git log # 显示作者,版本号,注释
gitreflog # 显示精简信息,显示的更多(版本切换也会显示)# 查看时间点前或后的日志
git log --after 2020-6-1
git log --before 2020-6-1
git reflog --after 2020-6-1
git reflog --before 2020-6-1
# 查看指定开发者日志
git log --author [author_name]
git reflog --author [author_name]
git log
git reflog
11. 撤销版本库提交:commit 的逆运算
- 可以回滚到指定版本
# 回滚到上一个版本:git reset --hard HEAD^
git reset --hard HEAD~
# 回滚到上三个版本:git reset --hard HEAD^^^
git reset --hard HEAD~3
# 回滚到指定版本号的版本:git reset --hard [版本号] (重点)
例 : git reset --hard 35cb292
12. 注意
- 工作区内, 空文件夹不会被 git 管理
- git 的任何操作与没有被 git 管理的文件无关
六.Git 的过滤文件
1. 过滤文件介绍
.gitignore
文件- 过滤不想被 git 管理的文件或文件夹
- 需要在仓库根目录下创建该文件
- 文件与文件夹都可以被过滤
2. 过滤语法书写
- 在文件中直接写文件名字或文件夹名字, 表示忽略这个文件
#
表示注释*
表示通配符,表示任意数量任意字符 , 例:*.log
表示以.log
结尾的都忽略?
表示单个字符, 例:?.log
!
表示取反
.DS_Store
node_modules
/dist
.idea # 使用 IDE 编辑器会生成, 如果是 vscode 则会生成.vscode 这样的文件
__pychche__/*.py
!__pycache__/__init__.py # 取消忽略__init__.py
七. 多分支开发
1. 创建分支
git branch [分支名]
2. 查看分支
git branch # 前面带 "*" 号, 并且是绿色代表是当前分支
3. 切换分支
git checkout [分支名]
4. 创建并切换到分支
git checkout -b [分支名]
5. 删除分支
git branch -d [分支名]
6. 查看远程分支
git branch -a
7. 合并分支
git merge [分支名] # 将当前分支合并到另一个分支, 需要退出当前分支进行
# 例: 把 dev 分支合并到 master 分支:切换到 master 分支,执行合并 dev 分支的命令
8. 合并分支注意
- 多个开发者都是在一个分支上进行开发,不出意外,该分支一定叫 dev(协同开发)
- 如果出现一个特殊任务(敏感任务), 与正常业务关系不紧密, 甚至可能大的影响正常的 dev 分支开发, 可以依赖 dev 开一个子分支, 进行开发, 开发完毕后合并到 dev 分支, 再删除该分支即可
- 所有的开发任务都可以在 dev 分支上进行(除非公司硬性要求不能直接在 dev 分支开发, 只能在 dev 子分支开发, 测试通过后才能合并给 dev)
八. 远程 Git 开发, remote 源操作
1. 本地库与远端库同步的两种情况
- 你作为项目仓库初始化人员
# 线上要创建空仓库
# 本地初始化好仓库
# 建立 remote 链接(remote add)
# 提交本地仓库到远程(push)
- 你作为项目后期开发人员
# 远程项目仓库已经创建成功
# 复制远程仓库到本地(clone)
# 进入仓库就可以进行接下来的开发
2. 查看 remote 命令帮助文档
git remote -h
3. 查看仓库已配置的远程源
git remote # 只查看到远程源名字
git remote -v # 可以查看到远程源的地址
4. 添加远程源
git remote add [源名] [源地址] # 原名随便取, 不要一样, 一般取 origin
git remote add orgin git@gitee.com:shawn_one/luffyapi.git # 示例
5. 删除远程源
git remote remove [源名]
git remote remove origin # 示例
6. 提交代码到远程源
git push [源名] [分支名]
7. 拉取远程源代码
git pull [源名] [分支名]
8. 克隆远程源
git clone [远程源地址]
9.remote 操作注意
- 通过克隆方式连接远程源,默认远程源名就叫 origin; 所以主动添加远程源来连接远程仓库,原名也用 origin
- 本地一个仓库只需要和远程一个源进行同步,所以只需要连接一个远程源,如果还想把本地代码同步给第三个平台,那么可以通过主动添加远程源来连接第三个平台的远程仓库,此时的源码就不能再叫 origin 了
- pull 和 push 都可以提供选择不同的源码,和不同的远程仓库交互
10.gitee 创建远程仓库示例
11. 问题
-
git.exe pull --progress --no-rebase -v "origin"fatal: unable to access 'https://github.com/konsumer/arduinoscope.git/': error setting certificate verify locations:
CAfile: D:\Program Files\Git\mingw64/bin/curl-ca-bundle.crt
CApath: none -
原因 : 可能是之前安装过 Git, 现在从新安装, 导致环境错误
- 解决 : 先打开 git bash 窗口, 执行命令:
git config --system http.sslverify false
九. 设置 SSH 协议来连接远程源
1.HTTPS 和 SSH
- 我们默认使用的是
https
协议来连接远程仓库, 但需要输入用户名和密码, 有时候稍稍先的不方便, 于是我们就可以使用ssh
协议进行连接远程源 ssh
采用的是非对称加密方式, 比较安全
2. 对称加密
- 加密与解密用的同样的密钥
- 通常使用的密钥是较小的密钥, 一般小于 256bit
- 原理 :
- 因为密钥越大,加密越强,但加密与解密的过程越慢
- 如果你只用 1 bit 来做这个密钥,那黑客们可以先试着用 0 来解密,不行的话就再用 1 解
- 但如果你的密钥有 1 MB 大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间
- 密钥的大小既要照顾到安全性,也要照顾到效率,是一个权衡
- 优点 : 快速, 高效
- 缺点 : 管理与分配不安全
- 使用 : 把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人
3. 非对称加密
- 分为两部分: 公钥, 私钥
- 解密的原理: 公钥给需要加密的成员, 加密的成员加密以后, 只能通过持有私钥的成员进行解密
举例 :
- 你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人 --- 银行才能对你的消息解密
- 与对称加密不同的是,银行不需要将私钥通过网络发送出去(只由银行自己保管),因此安全性大大提高
- 优点 : 安全
- 缺点 : 速度慢
- 优化 : 使用对称加密方式传递消息, 但对对称加密的秘钥进行非对称加密
举例 :
- A 生成对称密钥
- A 向 B 发起请求生成公钥
- B 将公钥发送给 A
- A 使用 B 发送过来的公钥加密自己加密过后的对称密钥
- A 将加密后的结果发给 B
- B 使用私钥解开 A 通过公钥发送过来对称密钥, 使用对称密钥解密 A 发送的数据
- A 与 B 就实现了通过对称密钥来对沟通的内容进行加密与解密了
4. 生成电脑的公钥、私钥
# 本机生成命令
ssh-keygen -t rsa -C "*@*.com" # 邮箱可以任意填写
# linux 查看公钥命令
cat ~/.ssh/id_rsa.pub
- windows 生成的公钥私、钥位置 :
C:\Users\[用户名]\.ssh
5.gitee (码云) 上添加公钥
配置好后, 以后就不需要密码了
6. 如何成为其他码云项目的开发者
- 生成自己电脑的公钥,配置到自己的码云个人公钥中
- 把自己的码云用户名提供给别人,别人添加你成为项目开发者
- 自己确认添加,成为开发者,克隆开发项目,进行开发
7. 如何成为公司自建 git 服务器的开发者
- 生成自己电脑的公钥(公钥生成一次就可以了),把它提交给项目管理者
- 项目管理者添加你公钥,加入开发者,提供给你项目克隆地址
- 克隆开发项目,进行开发
十. 协同开发及冲突解决
1. 协同开发
- 开发者, 第一次同步项目
git clone [项目地址] # 将项目克隆下来
- 保证自己本地有 dev 分支,且与远程仓库版本同步(没有就自己新建)
- 本地开发的代码,必须执行 add、commit 命令到本地版本库后,才和远程仓库进行交互
- 交互顺序 : 必须先拉(pull) 后提(push)
- 交互注意 : 必须切换到要交互 (一般与远程同名) 的分支进行交互, 如本地 dev 与远程 dev 交互
git checkout dev
git add .
git commit -m '本次提交的注释'
git pull origin dev
git push origin dev
2. 冲突解决
- 在远程仓库和本地仓库版本不一致时,拉取远程仓库版本到本地时,两个版本进入融合,可能会出现版本冲突
一般是修改同一个文件的同一行代码会产生冲突
要么删掉你的, 要么删掉别人的, 要么换行合并(需要与同事进行沟通)
- 先定位冲突文件冲突代码,线下沟通冲突代码,整合代码解决冲突
- 再将解决冲突后的代码重新提交到本地版本库
- 然后拉取远程仓库,直到没有冲突,提交本地版本库到远程
# 版本冲突产生
<<<<<<< HEAD # 冲突的开始
# 自己的代码
======= # 分割线
# 别人的代码
>>>>>>> b63c408abd05b87fc492d40523240561999dba50 # 冲突的结束(版本号)
ps : 有业务交际时,版本合并不一定会出现冲突相关的标识,但是可能会带着代码运行崩溃,所有理论上每一次版本合并,都要测试合并后的所有功能(及其之少的情况)
十一. 线上分支合并
1. 线上新建分支
2. 分支进行开发, 然后合并
十二. 远程仓库回滚
- 先在本地切换到我们想要回滚的远程分支所对应的本地分支
git checkout dev
- 然后回滚本地分支
git reset --hard [版本号]
- 本地版本强行提交给服务器 (谨慎使用)
git push origin dev -f
十三. 补充
1.Git flow 简介
- Git flow 是 Git 版本管理一个清晰的流程和规范, 是 一种建分支的方案(特别复杂)
- Git flow 常用分支 : 预览分支、开发分支、bug 分支、主分支、测试分支......
并非所有分支模型都适用于所有团队和所有情况, 团队需要反思: 使用分支模型的最终目的都是方便软件开发过程中的合作,因此,需要考虑使用它的特定人群的需求
2.pull 与 fetch 的区别
- git fetch : 拉代码, 需要手动合并
- git pull : 拉代码 + 合并
3. 变基 rebase
- 扁平化合并, 合并分支的时候, 不保留之前分支提交的日志, 只保留合并的日志