git(版本控制器)

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更安全一些
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值