文章目录
1、版本控制器
1.1、定义
完成协同开发项目,帮助程序员整合代码
1、帮助开发者合并开发的代码
2、如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突
软件: SVN、GIT(都是同一个人的个人项目)
github、gitee(两个采用git版本控制器管理代码的公共平台)
github、gitee、gitlab区别:
github: 一般开源的代码放在github,代码托管平台(公有仓库,私有仓库),公司代码不会放在这上面
gitee(码云): 中国的github,开源代码放在公有仓库,有一部分公司代码托管到gitee的私有仓库(你们公司代码放在码云上)
gitlab: 公司自己的搭建github,公司内部自己访问(docker拉一个gitlab镜像,跑起来即可)
git: 集群化、多分支
版本控制器就是控制的对象是开发的项目代码
代码开发时间轴: 需求1 => 版本库1 ==> 需求2 => 版本库2 => 版本库3(版本库1) => 版本库4(版本库2)
1.2、git与svn比较
2、git的工作流程
工作区: 工作的目录,文件夹下放一些文件,文件中写内容
暂存区: 工作区的更改,提交到暂存区(在暂存区临时存储)
版本库: 本地文件,内容变更记录
git相关操作(指令)
git init # 初始化仓库,把当前路径,被git管理起来
git init a # 创建出一个文件夹,该文件夹被git管理(.git隐藏文件)
# 当仓库中有文件增加、删除、修改,都可以在仓库状态中查看
git status # 查看仓库状态
git status -s # 查看仓库状态的简约显示
红色: 更改没有被提交到暂存区
绿色: 更改被提交到暂存区,但是没有被提交到版本库
# 提交到暂存区
git add a.txt # 把a.txt提交到暂存区,即添加指定文件
git add . # 当前路径下所有更改,提交到暂存区,即添加项目中所有文件
# 撤销所有暂存区的提交
git reset HEAD .
# 撤销某一文件的暂存区提交
git reset 文件名
# 把提交到暂存区的数据拉回到工作区(使用频率较少),即撤销所有暂存区的提交
git reset .
# 从暂存区提交到版本库(不能从工作区直接提交到版本库)
要往版本库提变更,需要先配置用户
# 全局配置(用户家路径记录: .gitconfig)
git config --global user.email "邮箱"
git config --global user.name "用户名"
注: 在全局文件 C:\Users\用户文件夹\.gitconfig新建用户信息,在所有仓库下都可以使用
# 局部配置(当前路径下配置文件中记录: .git --> config)
git config user.email "邮箱"
git config user.name "用户名"
# 从暂存区提交到版本库(必须添加注释,不加注释提交不上去)
git commi -m '注释注释一定要加,并且有意义'
注: 1、在当前仓库下的config新建用户信息,只能在当前仓库下使用
2、一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户
# 查看log
git log # 看到版本库中谁提交了什么,写了什么注释,在什么时间,每个版本都有一个id号
git reflog # 精简(详细)展示
# 查看时间点之前/之后的日志:
git log --after 2018-6-1
git log --before 2018-6-1
git reflog --after 2018-6-1
git reflog --before 2018-6-1
# 查看指定开发者日志
git log --author author_name
git reflog --author author_name
# 回滚(回滚到版本管理的最新的位置),撤销所有暂存区的提交
# git add文件后还没有执行git commit命令,此时如果又修改了该文件,可以使用git checkout放弃修改或git add重新添加到暂存区
git checkout .
# 撤销某一文件的暂存区提交
git checkout 文件名
3、版本库间的通信
4、git分支管理
1、创建分支
git branch 分支名
2、查看分支
git branch # 绿色表示当前所在分支
3、切换分支
git checkout 分支名 # 创建分支的代码,基于master创建出来的,代码就会跟master一样
注: 在哪个分支上创建分支,目前新分支和所在分支代码一样
4、创建并切换到分支(两步并作一步)
git checkout -b 分支名
5、删除分支
git branch -d 分支名
6、查看远程分支
git branch -a
7、合并分支
git merge 分支名
把dev分支合并到master分支: 切换到master分支,执行合并dev分支的命令
(1) 多个开发者都是在一个分支上进行开发,不出意外,该分支一定叫dev(协同开发)
(2) 如果出现一个特殊任务(敏感任务),与正常业务关系不紧密,甚至可能大的影响正常的dev分支开发,可以依赖dev开一个子分支,进行开发,开发完毕后合并到dev分支,再删除该分支即可
(3) 所有的开发任务都可以在dev分支上进行(除非公司硬性要求不能直接在dev分支开发,只能在dev子分支开发,测试通过后才能合并给dev)
5、git提交代码出现冲突的两种情况
1、合并分支造成冲突
2、在同一条分支上,你和同事修改了同一个文件的同一段代码造成冲突
6、忽略文件
项目中加忽略文件,添加以后,被排除的文件或文件夹不被git管理
在windows平台写成 .gitignore. 其它平台不用
(1) 在仓库根目录下创建.gitignore 文件(写过滤规则)
(2) 文件与文件夹均可以被过滤
(3) 文件过滤语法
过滤文件内容
# 表示注释
忽略某个文件夹(写文件夹名字): 代表所有目录下的同名文件或文件夹都被过滤
忽略某个文件(直接写文件名): 代表仓库根目录下的文件或文件夹被过滤
忽略以npm-debug.log开头的所有文件 npm-debug.log*
忽略所有后缀名为.sln的文件 *.sln
举例:
a.txt: 项目中所有a.txt文件和文件夹都会被过滤
/a.txt: 项目中只有根目录下a.txt文件和文件夹会被过滤
/b/a.txt: 项目中只有根目录下的b文件夹下的a.txt文件和文件夹会被过滤
/aaa/aa.txt: 忽略这个文件夹下的文件
*.json: 忽略以json结尾的所有文件
*x*: 名字中有一个x的都会被过滤(*代表0~n个任意字符)
注: 空文件夹不会被提交,空包会被提交,包可以被提交(包中有一个init空文件)
7、远程git开发
7.1、本地与远程仓库同步的两种方式
1、你作为项目仓库初始化人员:
线上要创建空仓库 => 本地初始化好仓库 => 建立remote链接(remote add) => 提交本地仓库到远程(push)
2、你作为项目后期开发人员:
远程项目仓库已经创建成功 => 复制远程仓库到本地(clone) => 进入仓库就可以进行接下来的开发
7.2、remote源操作
1、查看仓库已配置的远程源
git remote
git remote -v
2、查看remote命令帮助文档
git remote -h
3、删除远程源
git remote remove 源名
git remote remove origin
4、添加远程源
git remote add 源名 源地址
git remote add orgin xxx.git
5、提交代码到远程源
git push 源码 分支名
6、克隆远程源
git clone 远程源地址
说明:
(1) 通过克隆方式连接远程源,默认远程源名就叫origin,所以主动添加远程源来连接远程仓库,源码也用origin
(2) 本地一个仓库只需要和远程一个源进行同步,所以只需要连接一个远程源,如果还想把本地代码同步给第三个平台,那么可以通过主动添加远程源来连接第三个平台的远程仓库,此时的源码就不能再叫origin了,比如online都可以
(3) pull和push都可以提供选择不同的源码,和不同的远程仓库交互
7.3、采用ssh协议连接远程源
7.3.1、创建电脑的公钥私钥
官网: https://gitee.com/help/articles/4181#article-header0
本机命令,生成公钥: ssh-keygen -t rsa -C "*@*.com"
邮箱可以任意填写
本机命令,查看公钥: cat ~/.ssh/id_rsa.pub
码云线上添加公钥: 项目仓库 => 管理 => 部署公钥管理 => 添加公钥 => 添加个人公钥
git remote remove origin # 如果以前拉取项目是https,把以前的origin删掉
git remote add origin xxx.git # 添加ssh的地址
git push origin master # 重新推送到远程
7.3.2、提交本地代码到远程仓库
命令: git push origin master
7.4、如何成为其他码云项目的开发者
1、生成自己电脑的公钥,配置到自己的码云个人公钥中
2、把自己的码云用户名提供给别人,别人添加你成为项目开发者
3、自己确认添加,成为开发者,克隆开发项目,进行开发
git clone xxx.git
写代码,提交即可
7.5、如何成为公司自建git服务器的开发者
1、生成自己电脑的公钥(公钥生成一次就可以了),把它提交给项目管理者
2、项目管理者添加你的公钥,加入开发者,提供给你项目克隆地址
3、克隆开发项目,进行开发
git clone xxx.git
写代码,提交即可
总结
1、你是仓库创建者
cd 项目文件夹
git init
git add .
git commit -m "first commit"
git remote add origin xxx.git
git push origin master
2、你是协同开发者(本地有代码)
git clone xxx.git
代码copy过来,新建.gitignore,处理忽略文件
git add .
git commit -m '注释'
git remote add origin xxx.git
git push origin master
3、你是协同开发(本地没有代码)
git clone xxx.git
开发,写代码
git add .
git commit -m '注释'
git push origin master
7.6、git远程分支合并
7.6.1、线上分支合并
直接在远程创建: 同步到本地
直接在远程基于master分支创建dev分支:同步到本地
此时你的本地编辑器中就有远程分支了
如上操作就会把远程的dev分支拉到本地了
然后在dev分支开发,将代码推送到远程的dev分支,此时远程的master和dev分支不一样,合并!
7.6.2、本地合并完,再提交到远程
在本地dev分支继续开发,开发完成后合并到本地的master分支,最后由本地的master分支合并到远程的master分支
然后在本地master分支上执行 git merge dev
此时本地dev分支上的内容合并到了master分支
将本地的master分支推送到远程master分支
8、协同开发
1、作为开发者,第一次同步项目(前台已经是项目开发者了)
>: git clone 项目地址
2、保证自己本地有dev分支,且与远程仓库版本同步(没有就需要自己新建)
3、本地开发的代码,必须add、commit到本地版本库后,才和远程仓库进行交互
4、交互顺序: 必须先拉(pull)后提(push)
5、必须切换到要交互的分支,在与远程同名的分支进行交互,如本地dev与远程dev交互
>: git checkout dev
>: git add .
>: git commit -m '本次提交的信息提示'
>: git pull origin dev
>: git push origin dev
9、冲突解决
1、在远程仓库和本地仓库版本不一致时,拉取远程仓库版本到本地时,两个版本进入融合,可能会出现版本冲突
2、定位冲突文件冲突代码,线下沟通冲突代码,整合代码解决冲突
3、将解决冲突后的代码重新提交到本地版本库
4、再拉去远程仓库,直到没有冲突,提交本地版本库到远程
# 冲突样式文件:
<<<<<<< HEAD # 冲突的开始
# 自己的代码
======= # 分割线
# 别人的代码
>>>>>>> b63c408abd05b87fc492d40523240561999dba50 # 冲突的结束(版本)
(1) 删除冲突相关标识: 冲突的开始、分割线、冲突的结束(版本)
(2) 线下沟通,根据实际需求完成代码整合
(3) 测试整合后的代码
出现冲突的前提:
(1) 不同开发者同时操作了同一文件
(2) 并且在相同行写了代码
强调: 有业务交际时,版本合并不一定会出现冲突相关的标识,但是可能会带着代码运行崩溃,所有理论上每一次版本合并,都要测试合并后的所有功能(及其之少的情况)
线上分支合并,不能自动合并
线下合并完,解决完冲突,再提交
10、远程仓库回滚(以dev分支举例)
1、本地切换到远程要回滚的分支对应的本地分支
git checkout dev
2、回滚本地分支
git reset --hard 版本号
3、本地版本强行提交给服务器(慎重)
git push origin dev -f
11、fetch和pull的区别
git fetch 相当于是从远程获取最新到本地,不会自动merge
git pull 相当于从远程获取最新版本并merge到本地
在实际使用中,git fetch更安全一些