路飞:git 多分支开发、git远程仓库、ssh方式连接远程仓库、协同开发、冲突解决、线上分支合并、远程仓库回滚
一、git 多分支开发
git分支管理
为什么要有分支?
- 可以保证,主分支的版本都是可以查看的版本
- 我们都在开发分支开发,开发完成,合并到主分支
- 如果出现一个特殊任务(敏感任务),与正常业务关系不紧密,甚至可能大的影响正常的dev分支开发,可以依赖dev开一个子分支,进行开发,开发完毕后合并到dev分支,再删除该分支即可
- 所有的开发任务都可以在dev分支上进行(除非公司硬性要求不能直接在dev分支开发,只能在dev子分支开发,测试通过后才能合并给dev)
分支操作
- 1、查看分支
git branch
- 2、创建分支
git branch 分支名
git branch dev
- 3、切换分支
git checkout dev # 切换到dev分支
git checkout -b 分支名 # 创建并切换到分支
git branch checkout 分支名称 # 跟上面的命令一个作用
- 4、删除分支
git branch -d dev
ps:删除分支的时候需要处于master分支下才能删除别的分支
- 5、合并分支(重要)
git merge 分支名
把dev分支合并到master分支:切换到master分支,执行合并dev分支的命令
先来到master分支:
-git checkout master
如果合并内容进来的对象还没创建可以使用下方命令
-git branch checkout 分支名称
执行合并命令:
-git merge dev
把dev合并到我(master,处在哪个分支就会合并到哪个分支)身上
ps:分支合并可能会出冲突(后面会讲)
公司里使用的分支方案
小公司
-master分支,dev分支,bug分支 ,所有人在dev分支开发,开发完成合并到主分支
中小公司
-master分支,dev分支,bug分支 ,个人分支,个人在个人分支上开发,开发完成合并到dev分支
二、git远程仓库
我们在使用远程git开发的时候,需要把本地版本库的数据提交到服务器版本库,而这个服务器版本库通常有以下三种:
- gitee
- github
- gitlab
gitlab是公司自行搭建的,gitee和github(网站访问困难,服务器在国外)是第三方的网站
gitlab的搭建教程
https://zhuanlan.zhihu.com/p/413217715
我们后续的操作以gitee作为远程仓库
把我们写了一部分的luffy项目上传到gitee
上传项目到本地版本库
步骤一
打开git bash,进入到路飞项目的文件夹内,这里我先进入了后端项目的文件夹中
步骤二
执行命令,把当前文件夹初始化为git仓库
步骤三
去项目文件夹中,配置.gitignore忽略文件
当前状态下我们去pycharm中会看到文件的颜色发生了变化,被管理的文件都会变成红色,忽略管理的文件会变成黄色,已经提交到暂存区的文件会变成绿色
步骤四
把需要git管理的文件添加到暂存区
ps:这里我们务必要先配置好忽略文件,否则修改起来比较麻烦(不想要被管理的文件删了,上传,然后再给他弄回来)
git add .
步骤五
提交代码到本地版本库中
git commit -m '第一次提交'
这个时候代码提交到了本地版本库中,已经被版本管理了
上传项目到远程仓库
步骤一
登陆gitee创建自己的仓库,点击右上角的+号,然后点进新建仓库
步骤二
配置一下仓库信息,后面三样不要勾选,保证仓库是空的(勾选了之后就不是空仓库了,相当于有了别的版本信息)
步骤三
根据gitee的提示进行配置,这里的git用户设置我们已经在之前配置过了
步骤四
进入被git管理的项目路径内,执行命令,把本地的版本库推送到远程仓库(这里的origin只是一个名称,可以换)
git remote add origin https://gitee.com/cengmuduoqing/luffy_api.git
步骤五
把本地当前所在分支,推送到 origin对应的远程的master上(这里我们就是把本地的master分支推送到远程仓库的master分支)
git push origin master
执行命令后会出现一个窗口需要我们输入用户名和密码,因为gitee是第三方远程仓库,为了安全考虑他不能让人随便上传代码进行修改
这里的用户名和密码只需要输入一次,就可以永久使用,这是因为他在电脑的凭据管理器中保存了(windows系统),如果在这里删除了凭据,就需要重新登陆了
需要被忽略管理的文件如果已经提交了如何修改
# 如果提交了,再写忽略文件的步骤
luffy.log--->暂存区---》版本库
.gitignore---》写上忽略,但是不好被忽略,只要luffy.log有变化还是会被监控到
删除luffy.log---》会被监控到---》add,commit---》版本库中已经没有luffy.log
再出的luffy.log,就不会被管理了
三、ssh方式连接远程仓库
在上面,我们提交代码到远程仓库使用的是https协议的链接
我们还可以使用ssh链接提交代码,同时ssh链接的安全性更高,使用更广泛
使用ssh需要用到公钥和私钥
操作流程
步骤一
点击右上角的头像,点击设置
步骤二
在设置界面点击左侧的ssh公钥,这时候我们可以点击右侧界面的怎样生成公匙了解怎么获取公钥
公钥教程:https://gitee.com/help/articles/4181
步骤三
执行命令生成公钥私钥
ssh-keygen -t ed25519 -C "1227479574@qq.com"
注意:这里的 xxxxx@xxxxx.com
只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。
现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。
执行命令后什么都不需要输入,按三次回车即可
根据创建时的提示,我们可以得知生成的公私钥保存在:C:\Users\asus.ssh
步骤四
接着我们使用记事本打开后缀名为.pub的公钥文件,复制公钥到gitee网站上进行添加
步骤五
在本地版本库推送的时候,可以删除之前的origin库连接,创建新的连接提交代码到远程仓库
git remote remove origin
git remote add origin git@gitee.com:cengmuduoqing/luffy_api.git
git push origin master
也可以直接创建一个新的库连接,提交代码到远程仓库,我用的就这种方式
git remote add zzh git@gitee.com:cengmuduoqing/luffy_api.git
git push zzh master
remote源操作
1)查看仓库已配置的远程源
>: git remote
>: git remote -v
2)查看remote命令帮助文档
>: git remote -h
3)删除远程源
>: git remote remove 源名
eg: git remote remove origin
4)添加远程源
>: git remote add 源名 源地址
>: git remote add orgin git@gitee.com:doctor_owen/luffyapi.git
5)提交代码到远程源
>: git push 源名 分支名
6)克隆远程源
>: git clone 远程源地址
- 1)通过克隆方式连接远程源,默认远程源名就叫origin;所以主动添加远程源来连接远程仓库,源码也用origin
- 2)本地一个仓库只需要和远程一个源进行同步,所以只需要连接一个远程源,如果还想把本地代码同步给第三个平台,那么可以通过主动添加远程源来连接第三个平台的远程仓库,此时的源码就不能再叫origin了,比如online都可以
- 3)pull和push都可以提供选择不同的源码,和不同的远程仓库交互
四、协同开发
协同开发介绍
- 我[仓库管理员]创建了仓库,我对仓库有各种权限
- 我们要多人开发(张三,李四),张三李四在自己的仓库中,能看到我的项目吗?看不到
- 我[仓库管理员],把张三李四设置为该仓库的开发者,设置完成后,在张三李四的仓库中就能看到这个项目了
ps:当我们邀请的别的开发者,这些开发者就对这个仓库就有读写权限,他们就可以开发代码,提交代码
当我们作为开发者被邀请的时候,我们本地是没有代码的,因此我们需要从远程仓库拿代码
从远程仓库获取代码
步骤一
使用git clone命令把代码从远程仓库克隆下来
ps:执行命令之前需要进入想要保存该项目的路径中
步骤二
使用pycharm打开,并配置解释器及依赖
步骤三
开发代码并保存
步骤四
开发结束后跟之前一样,提交到远程仓库即可
ps:交互顺序:必须 先拉(pull)后提(push)
必须切换到要交互的分支,在与远程同名的分支进行交互,如本地dev与远程dev交互
>: git checkout dev
>: git add .
>: git commit -m '本次提交的信息提示'
>: git pull origin dev
>: git push origin dev
ps:在提交的时候如果需要更改身份信息,可以使用局部身份信息
# 设置用户名和邮箱
git config user.name lqz
git config user.email 3@qq.com
局部用户的信息存储在.git文件夹中的config文件中
全局用户的信息存储在C:\Users\用户名.gitconfig文件中
公司中的git操作流程介绍
# 你刚去公司,你的步骤
1 自己注册,hr给你 gitlab 账号和密码
-自己去你的账号里,配置ssh
2 老大会把一个仓库地址给你 【它已经把你加成开发者了】 https ssh
3 clone下来代码
4 使用pycharnm打开,配置环境===》代码运行起来
5 开发代码,本地提交---》push到远端
add
commit
push
五、冲突解决
出现冲突的原因
- 1、多人在同一分支开发,提交的代码相似
- 2、远程仓库分支合并的时候出现冲突
多人在同一分支开发出现冲突
同一分支的冲突是因为不同的人在提交代码的时候,有一部分代码出现了相似的情况,git检测到之后会出现报错提示让我们修改
这里我们假设张三对项目进行了一些修改:
-张三:
git pull origin master
'把远程仓库的代码拉下来'
在test.py,最后一行加入 print('刘亦菲')
'对test.py文件进行修改'
git add .
git commit -m
git push origin master
'把修改后的代码推送到远程仓库的master分支上'
接着李四也做了相似的操作
-我:
git pull origin master
'把远程仓库的代码拉下来'
在test.py,最后一行加入 print('彭于晏')
'对test.py文件进行修改'
git add .
git commit -m
git pull origin master
'把修改后的代码推送到远程仓库的master分支上'
这时候李四的pycharm中就会出现报错信息,内容就是产生冲突了
冲突出现的样子
<<<<<<< HEAD 我的代码
print('刘亦菲')
======= 它的代码
print('彭于晏')
>>>>>>> 6f720edbd84c8744b1c7c10767fb89a5d0fa98f5
强调:有业务交际时,版本合并不一定会出现冲突相关的标识,但是可能会带着代码运行崩溃,所有理论上每一次版本合并,都要测试合并后的所有功能(及其之少的情况)
解决冲突
基本流程
- 1)在远程仓库和本地仓库版本不一致时,拉取远程仓库版本到本地时,两个版本进入融合,可能会出现版本冲突
- 2)定位冲突文件冲突代码,线下沟通冲突代码,整合代码解决冲突
- 3)将解决冲突后的代码重新提交到本地版本库
- 4)再拉去远程仓库,直到没有冲突,提交本地版本库到远程
当我们出现冲突的时候,需要手动修改代码,比如两块代码类似的时候,我们需要删除多余的代码
- 1)删除冲突相关标识:冲突的开始、分割线、冲突的结束(版本)
- 2)线下沟通,根据实际需求完成代码整合
- 3)测试整合后的代码
修改完代码后把代码推送到远程仓库即可
ps:如果删除的是别人的代码,需要提前跟人家沟通,否则容易出事
如何避免出现冲突
如果我们想要减少冲突,就需要勤拉代码,保证本地的项目跟远程仓库的版本接近
分支合并出现冲突
原理跟第一种冲突的情况相似,解决方法也类似,只是是在分支合并的时候出现冲突
-你:
1 创建dev分支
git branch dev
2 在dev分支的views.py 中第2行加入代码
3 提交到本地仓库
-我:
1 在主分支的views.py 中第2行加入代码
2 提交到版本库
3 在主分支合并代码 git merge dev
4 冲突了,解决冲突
5 再提交代码,到此结束
六、线上分支合并
线上分支合并
步骤一
创建线上分支
我们在网站中创建一个新的分支
步骤二
然后用pull命令把这个分支拉下来
ps:这里我们会发现,把dev分支拉下来之后,查看不到,但是当我们进入dev分支后就可以查看到他了
步骤三
对项目的代码做出修改,然后提交到远程仓库
这里我添加了一些文本到README.txt中
接着提交代码到远程仓库
git add .
git commit -m '修改了README.txt'
git push zzh dev
步骤四
在远程仓库中把dev分支的内容合并到master的分支中去
在公司中我们把先上分支合并成为pr或rr(gitlab上叫rr)
点击上方的Pull Requests,然后点击右上方的新建按钮
步骤五
填写合并的配置信息后点击创建Pull Request
步骤六
接着会进入审查和测试界面,只有通过了审查和测试才能成功合并分支
步骤七
点击合并按钮后会要求我们添加介绍,接着点击接受即可
这时候我们就可以看到master中的README也出现了文本内容
ps:上述情况是在合并分支的时候没有出现冲突的情况
先上合并出现冲突的解决方案
把两个分支的代码拉到本地,然后分别进行修改,解决冲突后提交到远程仓库,再次合并分支即可
如果只需要修改一个项目,拉一个项目即可
七、远程仓库回滚
这个功能,一般用不到,用了容易出事情
基本情况就是,我们这个版本的代码除了问题,所以需要回滚代码
回滚的时候是把代码拉到本地后,回退版本
查看分支
git checkout dev
根据版本号回退
git reset --hard 版本号
接着我们使用强推,把代码发到远端
git push origin master -f
ps:这个-f很危险,出了问题就是执行-f的人担责