项目开发
在项目开发过程中运用git,一般分为以下几种状况。
初始化
- Maintainer创立库房
- 创立首要的几个分支,master(默许就有)、develop
- 设置分支保护规则
导入现有的项目
开发根本操作
- 克隆长途库房
- 切换到开发分支
- 提交到本地库房
- 推送到长途库房
- 建议兼并恳求
- 兼并其它分支到当时分支
- 处理抵触
接下来咱们将针对以上状况分别给出示例。
git作业区介绍
git区域:
本地库:前史版别
暂存区:暂时存储
作业区:写代码的地方
提交流程: 作业区->暂存区->本地库
git文件状况:
在Git中,文件有两种状况:tracked(已盯梢)和untracked(未盯梢)。
Tracked文件是指已被纳入版别操控的文件,这些文件有快照记载,并或许处于不同的状况,如未修正、已修正或已暂存。这些文件是在前次快照中有记载而且在下次要提交的快照(暂缓区)也有记载的文件。
Untracked文件则是指除了已盯梢文件之外的一切文件。这些文件既没有快照记载,也没有被放入暂缓区。一般,新创立的文件或许从其他地方复制过来的文件,假如还没有被Git盯梢,就会处于未盯梢状况。
总的来说,已盯梢文件是那些Git知道其状况的文件,而未盯梢文件则是那些Git尚未开端盯梢其改变的文件。如一般咱们运用Idea修正代码的时分,新建一个文件,就会提示是否要参加到版别操控,假如参加了便是tracked文件,未参加则是untracked跟版别库彻底没有相关。
git常用指令
初始化
git init:在当时文件夹中,初始化一个库房。履行该指令后会生成一个.git的躲藏文件夹。
装备
git config -list:检查一切装备
git的装备分为部分装备和大局装备,差异在于git config 后边是否加上 -gobal参数。
git config 装备项:检查指定装备项,git config -global 装备项,检查装备项在大局中的装备。
git config 装备项 值:设置装备项的值。
常用设置项设置
- git config –global user.name “用户名” # 设置用户名
- git config –global user.email “用户邮箱” #设置邮箱
- git config –global user.name # 检查用户名是否装备成功
- git config –global user.email # 检查邮箱是否装备
本地文件操作
git add 文件名:将当时作业区的文件存入暂存区。
- git add 文件名 将作业区的某个文件增加到暂存区
- git add . 将当时作业区的一切文件都参加暂存区
- git add -u 增加一切被tracked文件中被修正或删去的文件信息到暂存区,不处理untracked的文件
- git add -A 增加一切被tracked文件中被修正或删去的文件信息到暂存区,包含untracked的文件
git commit -m ‘-fix:xxx’:将暂存区的文件,提交到本地库房,该操作首先要履行git add将文件进行版别追寻后才能提交到本地库房,假如要直接将新文件(untracked)提交到本地库房,需求增加一个-a
参数,如git commit -a -m “提交说明”
。
git stash:将暂存区的代码进行存储,这个指令在分支之间切换十分有用。它会将你本地的一切tracked文件进行保存下来,以便切换到其他使命或分支,并在稍后康复之前的状况。
场景:当咱们遇到个突发状况,比方让你去看下出产master分支的问题,可是你本地开发到一半,欠好提交。这个时分直接切换到master是会报错的,由于本地作业区将康复到master分支的代码,现在你开发到一半的会被删去,git是不允许你这样做的。这时分咱们就能够先将本地代码add到暂存区,然后经过git statsh保存起来。
操作过程:
- git add .
- git stash save “xxx”
- git checkout master
- git stash apply
常用参数:
gitstash:直接保存存储区的数据
gitstashsave”补白的内容” #保存当时未commit的代码并增加补白 gitstashlist #列出stash的一切记载 gitstashclear #删去stash的一切记载 gitstashapply #运用最近一次的stash gitstashpop #运用最近一次的stash,随后删去该记载 gitstashdrop #删去最近的一次stash
多条git stash记载:
$gitstashlist stash@{0}:WIPon… stash@{1}:WIPon… stash@{2}:On…
运用到其中一条:gitstashapplystash@{1}
长途库房操作
git clone 长途库房地址:将长途库房克隆到本地。
git remote add origin 长途库房地址:将本地库房和长途库房相相关。默许运用clone后会主动生成origin地址信息,不必特别设置。
顺便操作:
- git remote set-url origin <新的长途Git库房地址>:修正长途库房地址,一般用于长途库房迁移了或许ip地址变了。
- git remote -v:检查长途库房信息。
- git remote rm origin:删去相关信息。
git pull origin 分支称号:从长途库房拉取最新的分支代码,并主动兼并到本地作业区,能够直接在文件中看到改变。
git fetch origin 分支称号:git fetch是将数据拉取到本地库房,它并不会主动兼并或修正当时的作业。在进行检查后再决议是否兼并到本地作业区。
将长途库房代码兼并到本地库房:
git merge origin/master
。这个比git pull愈加细粒度。检查提交记载:git log origin/master
检查文件内容:git show
检查概况:git show –stat
git push origin 分支称号:提交本地库房的代码到长途库房。这儿和svn的不同的是,提交到长途的文件取决于你本地库房的文件改变,而不能像svn相同,一次只提交指定的一两个文件。
-f:加了-f参数后将强推本地库房到长途库房,这个挺有用的。当本地发生过提交的回撤(被本地回撤的递交现已被推送到长途库房),需求运用-f这个强制参数,不然不会成功。强制推送或许会掩盖长途库房中的更改,因而在运用时需求谨慎。
以上是git长途库房的常用操作指令,指的一提的是git的长途库房跟svn不同很大,从开发的视点来说git的长途库房只用于协作和记载保存归于一个存储、同步用的,它与本地联系是一个相关联系,即便没有长途库房,一个人依旧能够运用版别办理东西。而SVN的长途库房,它在存储和同步的基础上还要负责版别办理、日志记载、甚至于兼并等功用。
日志
git log:检查一切的commit记载。
git log -p -记载条数:检查指定条数最近的commit记载。
git log –pretty=oneline:只显示版别号和提交信息
git reflog:这个能够看到你的一切提交记载,包含其commit、reset、checkout等记载。
这个在咱们版别回退后,要反悔十分重要,比方咱们履行了git reset HEAD^回退到了上个版别,此刻再看版别树是没有回退之前的记载了,这时分就能够运用git reflog来检查,然后进行回退。
版别回退
git reset HEAD^: 康复成前次提交的版别。
git reset HEAD^^: 康复成上前次提交的版别,便是多个^,以此类推或用~次数。
git reset –hard 版别号:用于版别回退到指定的版别,会直接将一切都康复到指定版别。
–hard:修正HEAD指针指向,暂存区内容丢掉,作业区康复以前状况;这是用得最多的状况,便是回退到某个指定版别。
–mixed:修正HEAD指针指向,暂存区内容丢掉,作业区不变;该参数是git reset的默许参数也便是说git reset指令后边不加任何参数,便是这个效果。它的效果便是,当咱们文件进行了git add操作后,想要反悔,不将本次add操作commit,就能够运用这种方法清空暂存区。
–soft:只是改变HEAD指针指向,缓存区和作业区不变;它的效果在于mixed重置了暂存区,而运用这个参数它将会重置本地库房commit记载到指定版别,一般用于吊销现已commit的记载,比方你是新来的写完代码现已commit到本地库房,上传到长途库房了,这时分Leader告知你commit的注释内容有严格格局要求不能胡写,这时分就能够运用git reset -soft回退commit记载,然后经过git commit -amend修正commit信息,再次提交即可。
分支操作
git branch :检查本地分支。
git branch -a :检查本地和长途分支。
git branch 分支名:创立一个分支,根据当时分支。
git checkout 分支名:切换到一个分支。
git branch -b 分支名:创立一个分支,并主动切换到新建的分支。
git branch -b 新分支名 已存在的分支:根据现已存在的分支创立一个新分支,并主动切换到新分支上。
在git中分支操作十分常用,比svn要频频得多
分支兼并
git rebase 分支称号:变基兼并,将当时分支改变追加到指定分支后边。
git rebase –continue,在处理抵触后持续兼并。
git rebase -i:能够进入交互式形式,在这个形式下能够履行批量操作,调整commit次序等。
git merge 分支称号:将指定分支兼并到当时分支,假如出现抵触,会生成一条兼并记载。
–no-ff:制止快速兼并参数,加了该参数后运用merge兼并一定会发生一条兼并记载。一般在兼并恳求处理的时分兼并能够这个参数。
它俩的差异:
rebase:会导致当时分支变基到目标分支上,兼并后的commit提交记载,不是原始的commit提交记载。
merge:是归于直接兼并的,假如有抵触或许加了参数–no-ff后会发生一个兼并记载。
一般来说,要求可追溯则运用merge它能够显示出当时分支是根据什么分支checkout出来的,要求线性兼并就能够选用rebase,rebase后是无法追溯的由于它们都被合成一个分支树,可是它不会有剩余的枝丫。在咱们一般就选用merge,这样也便利看追溯,分支太多的时分,会进行修剪操作。
不推荐在公共分支上运用rebase兼并,由于这样会将非公共分支的提交记载悉数复制到公共分支上,运用merge发生一个merge记载更好。
文件比较
git diff 作业区与暂存区的差异
git diff 分支名 作业区与某分支的差异,长途分支这样写:remotes/origin/分支名
git diff HEAD 作业区与HEAD指针指向的内容差异
git diff 提交id 文件途径 作业区某文件当时版别与前史版别的差异
git diff –stage 作业区文件与前次提交的差异(1.6 版别前用 –cached)
git diff 版别TAG 检查从某个版别后都改动内容
git diff 分支A 分支B 比较从分支A和分支B的差异(也支持比较两个TAG)
git diff 分支A…分支B 比较两分支在分开后各自的改动
实际操作
初始化
操作人员:组长|主程序员
新建库房的时分,能够有两种方法创立,一种是直接在gitlab网页端进行创立,还有便是选用git init在本地创立,然后经过git remote add 进行长途相关,并提交到长途库房中。
网页端创立项目:
本地创立项目:
git init git add . git commit -m ‘-chore init’ git remote add origin git@github.com:帐号名/库房名.git git pull origin master git push origin master # -f 强推
git clone git@github.com:git帐号名/库房名.git
创立中心分支:
创立develop分支:
git checkout -b develop master
该操作后会主动切换到develop分支
提交到长途库房中,便于组员兼并:
git push origin develop
操作后在长途库房就能够看到这个分支
设置中心分支为受保护的
简略开发流程
拉取已存在项目
每个成员都拉取项目
git clone http://192.168.x.x:9080/example/example-git.git
设置部分账号:
git config user.name “xxxx” git config user.email “xxxxx@xxx.com“
#完结装备后能够用git config –list 去检查
git config user.name
为了便利不同用户的提交,设置一下
git config credential.helper ""
每次长途pull、push操作都输入账号密码。
创立开发分支
开发成员拉取项目:git clone http://x.x.x.x:9080/example/example-git.git
,此刻开发人员拉取项目默许是master
分支,无法往长途库房中提交的,需求创立自己的开发分支。
开发成员创立开发分支:
检查一切分支:git branch -a
能够看到主分支master以及开发分支develop,还有组长自己创立的开发分支feature/GroupLeader
此刻咱们开发人员刚来的时分需求从develop开发分支上创立
切换到开发分支
git checkout develop
创立自己的开发分支
git checkout -b feature/zhangsan
此刻就能够愉快的写代码了。
提交开发分支到长途库房
将修正文件增加到暂存区:git add .
将暂存区的文件提交到本地库房:git commit -m "-feat:xxx模块新增xxx功用。"
推送到长途库房: git push origin feature/zhangsan
此刻长途库房中就有了zhangsan的分支,而且还有zhangsan提交的代码。
提交代码兼并恳求到develop分支
1、开发人员自己写的代码兼并到develop分支上,需求首先切换到develop分支,切换到develop分支:git checkout develop
注意切换前一定要确保作业区的代码都现已提交到了本地库房或许放入了暂存区,假如没有提交切换分支将会报错。
提交到本地库房:
git add .
git commit -m "xx"
。将作业区放入暂存区:
git stash
。todo:git stash的用法之所以有这个约束是防止数据丢掉,由于分支的切换会改变本地文件内容,假如没有这个约束的话就会导致作业区的文件被掩盖,导致数据丢掉;还有一点隐含的效果便是提醒你这个分支的使命完结了吗就要切换到其它分支,愈加便于分支的办理,防止你兼并一些半吊子文件进去。
2、拉取develop最新的代码: git pull origin develop
在开发这段时间内,或许会有其它开发人员往这个分支上提交代码,因而每次兼并分支前一定要先拉取该分支最新的代码。
3、切换回本地分支:git checkout feature/zhangsan
4、将develop分支最新代码经过变基(rebase)的方法兼并到feature/zhangsan分支:git rebase develop
。
ps:假如确定develop分支没有改变以上四步不必操作
5、将feature/zhangsan推送到长途长途库房中git push origin feature/zhangsan
6、在gitlab提起兼并恳求
ps:假如当时用户具有对develop分支提交兼并的权限比方组长,他自己写完代码后最好仍是经过流程提起兼并恳求进行兼并,指使给自己即可。
处理兼并恳求
当待处理的兼并恳求时,在网页端能够看到兼并恳求的信息。
随意点进去一个,能够看到具体的兼并恳求概况
假如登录用户是指使的处理人的,能够检查处处理兼并的按钮以及处理方法“指令行”。
假如登录用户不是指使的处理人,则只能看到恳求信息,没有处理权限
接受兼并
线上兼并
处理兼并有两种,一种是在网页端,直接点击兼并按钮,这种适用于对代码有底的状况,直接在网页上兼并。
线下兼并
假如摸不定,需求验证测验的最好仍是在本地进行兼并后提交,具体操作方法,能够点击指令行检查具体操作方法。
下载长途最新的代码到本地:git fetch origin
:用于从长途库房(origin)获取最新的更新。这个指令不会主动兼并到当时分支,而是将长途库房的更新下载到本地,以便你能够检查和兼并这些更改。
本地创立zhangsan分支,用于兼并:git checkout -b feature/zhangsan origin/feature/zhangsan
。
切换到develop分支:git checkout develop
。一般切换后再拉一下,最新的代码git pull origin develop
履行兼并:能够用rebase兼并,也能够用merge兼并。处理兼并恳求一般最好仍是用merge方法进行兼并git merge --no-ff feature/zhangsan
履行完兼并后推送到长途库房:git push origin develop
ps:经过上面两种兼并后,在界面上能够看到具体结果,以及操作过程。
回绝兼并
当组长不兼并这个恳求的时分能够选择将这个兼并恳求关闭,并对此做出讨论,等候张三修正后重新提交。
此刻开发成员zhangsan需求依据组长定见进行修正代码再次提交分支兼并,由组长处理新的兼并恳求。
预出产(测验环境)版别发布
这个操作一般由组长即Maintainer操作的,有的在开发到上线这个阶段有两个环境,一个是测验环境,一个是预出产环境。
测验环境,首要便是让内部测验人员进行测验,对数据真实性要求不高,数据价值也不高。
预出产环境,在上线前运用一部分真实数据来进行测验,对经过了测验环境的软件进一步测验,确保可靠性,有时分也会拿这一部分来做暂时灰度发布的场景。
组长对release分支进行操作,首先需求对release分支进行设置保护,不能有开发人员进行搅扰(也能够不设置,具体看测验要求,这儿首要是演示一下运用通配符装备保护分支)。
咱们能够对分支运用通配符匹配的方法对分支进行保护,由于这个分支是需求暴露出去的,所以或许会保护多个版别,而且是需求长久保存的,从这个分支开端就需求重视版别号办理了。
创立预发布分支
- 预发布分支是根据develop分支创立的
- 先确保develop分支是最新的代码
git pull origin develop
- 创立release分支
git checkout -b release/1.0.1 develop
- 提交到长途库房
git push origin release/1.0.1
此刻能够告诉测验人员对分支进行部署测验了。
预发布分支bug修正
在预发布环境下的软件要经历测验小姐姐的不断蹂躏,因而大多数软件的小身板是扛不住的,被测验小姐姐玩坏后是需求修复的,这就进入了修正bug阶段(bugfix)。
这就需求创立bugfix分支,这个分支有的团队是直接从develop分支基础上创立,有的在整个测验阶段都是根据release分支创立的。咱们团队确定了版别后,进入测验-发布阶段了,这段时间的代码都是根据release创立的,由于develop分支或许此刻现已进入了下一个版别功用的迭代了。
拉取最新的长途分支和代码
git pull origin
创立bugfix分支
git checkout -b bugfix/1632 origin/release/1.0.1
;bugfix/后边的数字一般为测验提交bug的编号,有的用禅道便是禅道的编号。修复bug后提交到长途库房
在长途库房上建议兼并恳求,由小组长进行兼并到release/1.0.1分支中,告诉测验持续测验,假如没有主动化部署是需求再部署的;而且在兼并的时分一般来说这种分支兼并后就给其删去了。
版别发布
测验经过后,咱们就需求将release进行发布,将release代码兼并到master分支和develop分支上,master分支永久保持着和出产环境相同的代码,兼并到develop上是为了将测验阶段修正的代码合回去,持续开发。
这一步的操作也彻底由组长来操作,由于这三个分支的兼并只有组长有权限。
同样的操作再对develop分支履行一次。
git东西:一般用Idea或许VSCode插件现已很好用了,假如要用东西的话能够考虑:TortoiseGit小乌龟(免费,跟SVN小乌龟相同,用惯了小乌龟的能够运用这个)、GitKraken(付费,可是好用)。