提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理
本文先对XXX做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章
提示:以下是本篇文章正文内容
Git是一个软件,所以需要安装。
Git的作用是代码版本控制。如:代码多版本保存,代码托管,代码回滚、代码合并
Git是分布式的。如:本地库管理、远程库管理(两个库都有历史版本)
git如果装在自己电脑上就可以进行自己电脑的代码版本控制,但是不可以上传远程仓库(远程仓库就是github和gitlab的网站形式)
linux和mac使用的是命令行安装,win使用的是安装包安装
1、linux装git方法
$ sudo apt-get install git
2、Mac装git方法
$ sudo yum install git
3、win装git方法
官网
https://git-scm.com/downloads
工作区:正在执行修改操作的文件
暂存区:托管暂时修改完成的文件
版本库:发布整个工程完整的文件
其中工作区和暂存区的文件可以使用
g
i
t
s
t
a
t
u
s
查看,版本库的文件可以使用
git status查看,版本库的文件可以使用
gitstatus查看,版本库的文件可以使用git log查看
.
.
cd XXX
$git init
之后会出现.git的隐藏文件,该文件是用于版本管理的
$git status
用于检测改文件夹下各个文件的修改状态
【红色:未被管理的文件或者你修改过的文件】
【绿色:已经被管理的并且没有被修改的文件,并且没有commit生成版本的文件】
【若出现nothing to commit.working tree clean,代表了现在是最新的版本,文件夹中的任何文件都没有被修改过】
$git add XXX
已经被管理的是绿色的,未被管理的是红色的
$git add .是添加所有未被管理的文件
理论上修改过内容的文件都要添加到管理中
$ git commit -m”XXX”
查看详细信息
$git log
把版本提交记录以图形的方式显示出来
$git log --graph
(1)历史版本回滚的目的
开发了一个业务,但是后面这个业务不需要了,就不用在现在的版本上进行删除,直接拿上一个版本的代码用就行了。
(2)回滚历史版本指令
$git reset --hard <版本号>
其中,版本号可以通过$git log中的commit查看到
(3)回滚到现在版本的指令
1、先使用$git reflog查看
2、再使用$git reset --hard 版本号
注意:git的终端信息是按着倒序排版的
(1)个人信息配置:用户名、邮箱(按照run来输入指令来配置就行)
配置成功后,每次显示版本号的时候都会显示用户名和邮箱了
开发新的业务功能和单独修复bug的时候会用到
新建分支是为了并行处理多功能开发(或者bug修复)的需求的–开发一个功能不影响另外的功能开发
分支的本地管理是相互独立的! 切换分支和回滚的操作都会使得代码改变
$git branch
$ git branch <分支名>
注意:在某分支代码上新建一个空的分支要先切花至被继承的分支上
$git chekout<分支名>
(1)先切换回去主分支。如:$git chekout <主分支名>
(2)在主分支上把子分支的代码合并过来。如$git merge <子分支名>
Merge 要分清楚是哪个分支合并那个分支
当前在哪个分支就是把其他分支merge进来那个分支。如:把dev分支merge进来master分支,就在master分支上输入指令$git merge dev
1、由于主分支master是大家维护的,主分支master上的更新速度是比个人开发的dev分支要快的,当个人的dev分支开发完成后,想要合并merge到主分支master上时master会产生很多冲突。
如:当同一个master分支中前后代码不一致的时候就会产生冲突,如你copy了master1.0的代码进行开发,当你开发完成并要进行合并的时候,master分支已经升级为master2.0,当你merge你dev新的代码的时候,不仅仅会把dev的代码加入进去,还会把master1.0的代码加入进去,这时候master1.0和master2.0的代码会产生冲突!
2、在本地仓库和远程仓库的代码不一致,开发的时候没有实时更新两个仓库导致偶然冲突,改变了同一个文件的同一段代码
如:在原有的代码上进行改动就很容易产生冲突(相同名称和文件等等),新增代码不会产生冲突的!
提示
代码注解
1、把修改丰富后的代码merge到以前的代码
2、尽量保证本地仓库的代码合远程仓库的代码保持一致
3、要合并到哪个分支上就切换到哪个分支上进行操作!
遇到代码冲突问题需要手动进行代码对比,找到冲突的地方,沟通解决!!
Code compare! (这时候就需要有人做code review,这时候就要用到vscode的插件或者beyond compare工具)
(1)方法一:【管理的比较好,自动化】先把master主分支的代码合并到个人dev上,把dev分支进行丰富更新【用于添加大家修改过后的代码】(简单的处理一下冲突)。再把自己的dev分支merge到主分支上【用于添加自己修改的代码】
(2)方法二:【管理的比较差,手动化】手动code compare工具来处理冲突,选择代码【merge失败自动在代码上添加冲突的标识符号和对应的代码】
(3)方法三:【管理的比较差,手动化】拉取最新的master代码,在这个基础上加入自己的代码
代码开发最好是一直用一个版本,一口气开发直到开发完毕,不然很难避免要处理合并冲突的问题!
merge代码会产生冲突,push代码也会产生冲突。
1、merge因为推送去主分支上的,要人工排除冲突因为是大家一起写的(小组长code review和沟通)
2、push因为推送去个人分支上的,若都是自己写的可以force(git push origin dev --force)
若推送到master上才需要合并merge(需要解决合并冲突和代码review),若推到自己的分支上则不需要进行review,修改代码后如果出现代码冲突可以强推
$git push origin <自己的分支名> --force
(1)beyond compare
(2)vscode的插件
$git branch -d <要删除的子分支>
注意:要在master分支上进行操作
Git和github\gitlab是两个不同的东西,git是一个软件,Github和gitlab都是一个云端网站而已。
github是开源的公用仓库,gitlab是使用公司硬件服务器自己搭建的一个私有仓库
因此,在本地库建立分支和远程库建立分支的实质是不一样的
在网页上按提示操作就行
推送后,远程仓库和本地仓库的分支还是其他都是一致的(远程仓库可以理解成百度网盘,本地编辑好了代码只管网上推)
1、添加远程链接(给远程仓库的地址起一个别名origin)
$git remote add origin <远程仓库的地址>
注意,origin 代指的就是远程仓库的地址,起了别名之后除非是换了远程仓库,不然不需要重新设置origin
2、向远程仓库推送代码
$git push -u origin <远程仓库的一个分支名>
在origin远程仓库的地址上推送本地库一个分支的所有版本的代码
-u 的意思是默认操作的意思,试过一次git push -u origin <远程仓库的一个分支名>的指令,下一次直接git push就行了,默认推送到上一次的远程仓库和分支,当要修改推送的分支的时候再写一次**git push -u origin <远程仓库的一个分支名>**来重定向一次就行
$git push 如果只有这个指令,就是代表把本地库上的当前分支推送到远程库上次默认的分支上(一般在本地仓库地址当前的分支上操作,默认就是推当前分支!)
养成良好的习惯,一般就每次推送代码都加上远程库的分支名
$git push origin <远程仓库的一个分支名>
(1)过程版本的定义
没有上传远程仓库的版本称为过程版本
(2)rebase作用一
把自己在本地仓库串行开发中的多个提交记录整合成一个提交记录,推送github只有第一个版本和最后一个版本
第一步:git rebase 分支名
方式一:指令:**git rebase -i <倒数第n次的版本号>**
这样就合并最近n次提交的版本信息
方式二【推荐】:指令:**git rebase -i HEAD~n**
这样就合并最近n次提交的版本信息,n是一个数字、
第二步:修改要整合的版本
把要合并的版本的pick 改成S,最后在 vim中保存退出:wq
第三步:修改要整合的信息
(3)rebase作用二
把并行开发的版本的记录强行插入主线分支中,版本提交记录并行边串行
1、先切换到要插入主线的版本分支dev,把要插入主线的版本作为一个“基”
$git cheakout dev
2、然后把要插入主线的版本分支记录插入主分支。
$ git rebase origin master
3、最后把dev合并merge到master上。
$git merge dev
$ git clone <远程库地址>
注意:拉代码是一拉全部分支都拉下来,推送代码是指定远程库分支,一个一个分支去推
$git chekout <分支名>
$git pull origin <远程库的一个分支>
如果你没有下载过工程代码就用$git clone,如果你有下载过代码了就更新一下代码就行了,在最新的代码上进行开发
注意:主要在本地仓库对应的分支上拉取远程仓库对应分支上的代码,保持本地仓库的分支名和远程仓库的分支名一致
拉取代码的原则
$git pull的操作只能一个一个分支进行拉取更新
每一个人都有自己的分支,自己维护自己的分支,在自己的分支上写代码
/master主分支是上线的代码
/dev是架构师merge和review的代码
/self分支
(和上面说的步骤是一样的)
(1)经过以下设置,开发成员想要pull或者merge代码就要先申请权限去code review
(2)开发成员申请小组长review
这个过程就像导师修改你的论文,小组长会看你的代码,审查逻辑和格式有没有问题,然后体格提意见让你修改,你觉得合理的就修改,不合理就说明原因
github如下操作:
注意在Markdown的MR描述中,换行需要结尾添加两个空格(markdown语法)
gitlab如下操作:
提交merge requests的方法在网页上进入merge requests栏,点击右上角的new merge requests即可
(3)小组长进行推送与合并异常处理,并删除开发成员原有的开发分支
(申请把自己的分支合并到master分支上–异常冲突小组长和开发成员沟通处理)
(1)创建一个测试发布版本
$git checkout -b release1.0【在dev开发稳定的分支上】
$git push origin release1.0
(2)测试人员获取版本进行测试,没问题测试人员就提交到master,有问题就反馈bug
(3)开发人员另开一个分支进行修bug【一般在这个阶段不进行新的业务开发】
使用gitlab(github就不用了),在非公司的地方开发代码的方法就是做一个访问公司服务器的vpn
.
.
1、切换到master的分支上
2、git checkout - b <新分支名>
git checkout - b <新分支名> 相当于git branch <新分支名> + git checkout <新分支名>
其中,
$git branch <新分支名>用于创建一个空分支并把master分支上的代码回滚到该分支上(若原来就有这个分支就直接切换,若原来没有这个分支就先创建再切换)
$git checkout <新分支名>用于切换到该分支上
注意:
1、【继承关系】在本地仓库的哪个分支上创建新分支,新分支就是继承哪个分支的代码
2、【搞一个属于自己分支来做开发】继承了主分支的基础上进行代码开发,不要直接在别人的或者上线的代码上进行开发
3、SSH Key
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以在Github官网进行设置
第1步:创建SSH Key
在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Git Bash,创建SSH Key
ssh-keygen -t rsa -C “youremail@example.com”
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可【防盗标记–盒子君hzj】
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面,设置SSH和keys
为什么GitHub需要SSH Key?
因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。【防盗标记–盒子君hzj】
确保你拥有一个GitHub账号后,我们就即将开始远程仓库的学习
.
.
1、在本地仓库上先切换到对应的分支,如$git branch dev
2、代码开发
3、推送至远程仓库上对应的分支上$git push origin dev
【成功后远程仓库就有自己的分支了】
(1)作用
项目仓库的各个版本可视化及操作
.
(2)使用步骤
1、下载vscode的gitgraph插件
2、点击左下角的 Git Graph图标,可以查看该.git文件中各个版本的继承及拓展关系,并可以查看修改的相关代码,或者进行一系列的版本操作
.
.
(1)作用
项目仓库各个版本的操作及历史源代码对比
1、可以看到各个commit的版本中修改了什么文件,与历史的版本对比得到修改的部分是什么(做review)
2、可以对修改后的文件一次进行回退到历史版本(对于编译自动修改的文件)
(2)使用方法
1、安装vscode的gitlens插件
2、在左边点击图标就可以进行版本可视化操作了
这个把之前的异常冲突的地地方进行回退
$ git reset HEAD^
把文本内容退回上一次编辑的位置
$ git reset <版本号>
历史修改的文件对比(用vscode 的gitlens插件更好)
$ git diff <文件名>
重要的是学习git的原理和gitflow使用流程
一般来说,远程仓库的分支名和本地仓库的分支名要一致,本地仓库一般不会存在很久的,所以,最好还是本地仓库和远程仓库的分支是一直的比较好
我们只能切换本地仓库的分支,不能切换远程仓库的分支的!在本地仓库中创建和切换对应的分支直接推送到远程端时,远程端就有对应的分支了
–代码开发版本要进行记录(每天写完或者开发完的功能都要写清楚,commit到自己的本地仓库)
【搞一个属于自己分支来做开发】继承了主分支的基础上进行代码开发,不要直接在别人的或者上线的代码上进行开发
git checkout 和git branch功能很像,$git branch更“厉害些”,git checkout - b是结合体!
git add *.cpp
git add *.h
继承式创建分支推送!(本质上本地仓库的分支名和远程仓库的分支名没有关系,不同分支名也可以推送)
Git push origin stuck_handle:stuck_handle