User setting and access
User Settings
登录gitlab.XX-company.com 之后在页面右上角头像处点击∨展开菜单,进入setting。
可以设置相关用户信息,常用的包括profile(基本配置),Account(帐户),Preferences(偏好设置),密码,SSH Keys,Notifications(邮件通知范围),Active Session(有效的连接)
Profile
可以在profile 里修改头像,邮箱,状态,及各平台关联帐号
Account
可以在account里修改用户名,用户名标识着与用户id 唯一关联的名称空间。一般不建议修改,如果修改,可能引起一些未知的影响,如必要修改,请严格按照修改页面的learn more 到“changing-your-username”根据提示做足步骤。
https://gitlab.XX-company.com/help/user/profile/index#changing-your-username
Notifications
全局通知设置:先在全局设置里可以设置通知的级别,然后在然后组/项目里分别设置为不同级别。默认为全局设置,展开可选其他。
Password
密码页面,修改密码后,会收到一个邮件,点击链接可以使用新密码登录(稍有延迟)
SSH Keys
SSH密钥允许您在计算机和GitLab之间建立安全连接,使用较多的情况是,当我们使用SSH 来 Clone 一个项目时,需要先在gitlab里配置好ssh keys。
一般我们在项目主页里展开clone 选项时,有两种方式,一种是clone with SSH,一种是Clone with HTTPS
当我们使用clone with SSH 时,我们需要先配置好ssh keys。
https://gitlab.XX-company.com/help/ssh/README#generating-a-new-ssh-key-pair
步骤是,先在一台linux 设备上生成一个密钥对,公钥拷到gitlab设置页面里,私钥放到需要clone 项目的设置上的默认ssh 配置路径。然后就可以直接使用这样的链接进行clone
Git clone git@gitlab.XX-company.com:vmc/products.git
另有直接使用用户/密码 HTTPS 方式,将在后面的章节介绍。
git clone https://gitlab.XX-company.com/vmc/products.git
Preferences
可自定义导航栏底色,语法显示外观,显示言语等等。
New Group and project
Gitlab url 的组成 :
gitlab 域名+用户名称空间或组名+项目名
Project URL = https://gitlab.XX-company.com/${Groups|USERS}/${project_name}.git
Eg.
https://gitlab.XX-company.com/vmc/products.git
https://gitlab.XX-company.com/gz_lte_sqa/python.git
https://gitlab.XX-company.com/linchuangfeng/LTE_RELEASE.git
https://gitlab.XX-company.com/gang.lu/FIS.git
在顶部导航栏右侧,搜索框的左方,有一个+号,展开有:
NEW Group
当你在如下页面新建了一个组别之后,在顶部导航栏的Group 可入该组别页面,
在左侧导航栏member 中可设置组成员组及角色,在组主页中,可直接new project 和new subgroup
NEW Project
新建空白project。在Blank project 中,可新建project ,再到生成的project 主页中去查看初始化project的指引。Project 可以创建在组和个人名称空间之下,为可选项。一般公用的项目建议选择在组之下,个人名称下如有公共项目,会因个人帐号的变化(如禁用)而有一些权限上的变化,需要在个人帐号被禁用之前,将名下的project 属主权移交才不会影响使用。
根据url 导入另外一个 gitlab 或 其他版本库工具中的仓库,点击“repo by URL” 需要对方库信息的用户名密码进行验证。
Init and clone
Init
当创建完一个空白的仓库之后,打开project 的链接,会有一些引导命令出现在project主页
(默认引导的clone命令使用的是HTTP方式,如果在创建之前已经配置了ssh key,则引导页的clone 命令使用的ssh 的链接)
Git global setup
-- 执行命令前先进行全局配置用户名和邮箱,如果没有配置,后续push 时会有警告提示,需要配置完成之后才能继续push命令。
以下三种方式择其一进行初始化
Create a new repository
-- 先clone此库,直接往空库里提交文件(常规操作,add/commit/push)
Push an existing folder
-- 直接将一个已存在的普通目录初始化为此库的内容,git init命令在本地目录里生成一个.git 的受控信息目录,remote add origin 能将.git 与远程创建的仓库关联起来。
Push an existing Git repository
--将一个已经存在的,从别处导出的,含有.git 的目录,导入为此新建项目的内容
Clone
通过clone 的命令将远程仓库复制下来作为一个本地仓库。
Clone方式
在project主页的页面,有一个下拉菜单 Clone﹀
展开有两种链接,点击右击的按钮可以复制
HTTPS https://gitlab.XX-company.com/${GROUP}/${RPOJECT_NAME}.git
SSH git@gitlab.XX-company.com:${GROUP}/${RPOJECT_NAME}.git
两种不同格式的链接用于两种不同的clone 方式,clone 的命令无区别,都是
ü git clone url(xxxx.git)
Clone with HTTPS
Init章节中的介绍的clone方式,便是HTTP,因为其中的url 是https开头的。
使用这个方式,需要用帐户密码验证。每次与gitlab 通讯时,需要输入密码,可配置它记住密码,第一次验证之后就无需再输入。
在$HOME 目录下会有一个.git-credentials文件存储着认证信息,下次无需输入(但这种方式保存的密码是明文的)
git config --global credential.helper store
git clone https://gitlab.XX-company.com/linchuangfeng/test1.git
Clone with SSH
在“User setting and access”章节中介绍的sse key 就是clone with ssh 的前提。
https://gitlab.XX-company.com/help/ssh/README#generating-a-new-ssh-key-pair
- Linux生成密钥对
ssh-keygen -o -t rsa -b 4096 -C "username@casachina.com.cn"
连按三次回车(1.默认密钥存放路径2.空密码3.密码确认,回车表示无密码,可以自己设置路径和密码。)
使用自定义而非默认路径时,需要额外按上文链接配置,使用时git 才能找到私钥的存放位置。创建密钥如有设密码,则clone 时需要输入一次密钥密码。密码为空时,只要私钥存放在设备的默认位置,可直接ssh clone)
- 将公钥添加gitlab SSH Keys 配置页面
cat ~/.ssh/id_rsa.pub,将公钥内容添加到setting-SSH Keys-Key的添加框中,拷贝的内容以邮箱地址结尾 ,然后点击 add key。
https://gitlab.XX-company.com/profile/keys
- 确认私钥在准备clone 项目的设备上
ls ~/.ssh/id_rsa
- Clone
git clone git@gitlab.XX-company.com:${GROUP}/${RPOJECT_NAME}.git
Tips:
可以任意地方执行命令生成密钥对。
公钥内容拷到gitlab 页面添加ssh key
私钥保存在要执行clone的设备上,并存放在$HOME/.ssh目录下,如果不保存在默认SSH目录下,则需要另外配置。执行生成命令时,交互时按第一个回车,表示默认路径
私钥也可以拷到自己的其他设备上的$HOME/.ssh目录,使那台设备也可以通过SSH Clone。
密钥密码设置了值时,执行git clone git@xxxxx 之后,需要再输入一次密钥密码。如果是空密码,则没有这一步,直接clone project的内容。执行生成命令时,交互时按第二三个回车,表示空密码。
Eg. Enter passphrase for key '/home/lcf/.ssh/id_rsa':
ü 如果报的,git@gitlab.XX-company.com's password: ,则SSH key 没有设置正确,需要按步骤重新检查确认。公钥是否添加在gitlab, 私钥是否在设备上。
Eg. git@gitlab.XX-company.com's password:
add and commit
概念
仓库: 在gitlab web page 创建的仓库称为远程仓库,通过clone 复制下来存放在自己设备上的同名git project称为本地仓库。
本地仓库与本地文件的交互操作:add和 commit
本地仓库与远程仓库的交互操作:git pull (= git fetch then git merge ) git push
暂存区和add(rm) : 暂存区的文件能被git 识别为追踪中的变更,通过add 命令可以把一个变更文件放入暂存区。git status 可以看到未放入暂存区但已经有变更的文件及其状态(这里所说的变更,是通指本地文件的增,删,改三种状态)
用git status 看到的在changes to be committed: 下的文件,便是暂存区的文件。
提交 commit:commit 操作就是把暂存区的变更提交到本地仓库,使这些变更受控。只有暂存区中的文件能进行commit操作。
基本的操作:
git pull
rm test1.txt(删除文件)
vi test2.txt (修改文件)
touch test3.txt (新增文件)
git add -A
git commit -m “commit all deleted ,modified,added files”
git push
例子和解析:本地修改 --add--> 暂存区
远程库原有文件test1.txt test2.txt
Clone 了一个本地库,也会有test1.txt test2.txt
在本地库所在的目录操作:
删除test1.txt,修改了test2.txt ,新增一个test3.txt
用git status 查看,有三种状态
所有未放到暂存区的变更都包含在这三种情况里,
我们可以使用 -A 来代替三种所有状态,-u 表示修改和新增的。
git add -A
# -A : include modify+add+delete
熟悉之后一般我们都是使用选项来选择需要add 的文件 (-A)。下面再分解每一种情况单独被add 到暂存区里的情况。
Deleted:删除,原受控的文件被本地删除了,如果确认是要从库里删除了,可以用git rm tes1.txt 来将变更(删除)放到暂存区。执行完之后,再用status 看,它上升到to be commited 的状态分类里。( git add -A 也包含了rm)
Modified: 原受控的文件被本地修改了,如果确认是要修改,可以用git add tes1.txt 来将变更(修改)放到暂存区。执行完之后,再用status 看,它上升到to be commited 的状态分类里。
Unrtrcked: 未追踪未受控的文件,新增文件一般是这个状态。如果确认是要修改,可以用git add tes3.txt 来将变更(新增)放到暂存区。执行完之后,再用status 看,它上升到to be commited 的状态分类里。
以上 : git add -A = git rm test1.txt + git add test2.txt + git add test3.txt
例子:暂存区 --commit--> 本地仓库
Git status现在可看到暂存区有三个文件,用git commit 可以将文件提交到本地仓库。
不带文件名 ,会一次提交全部暂存区的文件:
git commit -m “commit all change for test123”
指定提交部分文件,需要要指定文件名:
git commit test1.txt -m “rm test.txt”
用git log -n 1 可以看到刚刚最新的提交记录
pull and push
概念
本地仓库与远程仓库的交互操作:git pull (= git fetch then git merge )和 git push
git push 即 把本地仓库里commits 通过push 操作,推送到远程仓库。
git pull 即 把远程仓库的更新(别人push到远程)同步并合并到本地仓库。
远程仓库包含 各方commit 的推送。
Pull
在操作之后应该进行一次git pull ,远程仓库的更新同步到本地仓库。
Push
如何查看本地仓库还未push到远程仓库的commits 有多少?
用git branch|grep '*' 查看本地仓库所在分支,此例为master
对应的远程分支用origin 区分:origin/master
git log master ^origin/master
- 如果使用git push 会把本地master比origin/master 多出来的commits推送到远程(即上面用add commit 提交到本地仓库的提交),使别人可以通过pull进行更新。
- 如果进行push 时远程有更新没有pull先下来,会有提示,需要先进行更新合并才能push。
Branch
概念
在分布式版本控制系统中,像 Git、Mercurial、Bazaar 以及 Darcs等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
Git 鼓励在工作流程中频繁地使用分支与合并。
以下介绍摘自git-book 分支简介
暂存操作会为每一个文件计算校验和,然后会把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 对象来保存它们),最终将校验和加入到暂存区域等待提交,当使用 git commit 进行提交操作时,Git 会先计算每一个子目录(本例中只有项目根目录)的校验和,然后在 Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。如此一来,Git 就可以在需要的时候重现此次保存的快照。
分支创建便是分配一个新的指针,指向所指定的提交对象(快照),分支的基础代码便是来自此时的快照。往这个分支上增加新的commit 对象,分支指向便会往前移动到新的commit对象上去。
分支创建可以基于某个commit 的校验值,可以基于另外一个分支当前的代码(会指向此分支指针当前指向的commit 对象)。
Default Branch
一般新建库时库的本身为master分支,并且设置master 为默认分支。这表示,后续我们clone 为本地仓库时,它自动切换为默认分支。
git clone url
git branch -a 可以查看本地和远程分支,我们clone 库后处于默认分支下。
“*” 所在行的分支名,即当前分支。可以切换到其他分支。默认是master(只是git init 初始化时第一个分支时规定的名称,与其他分支无异)
默认分支是可以修改的。比如设置成了newMaster , 那么一个clone动作之后,代码所在的分支默认是在newMaster。
设置:setting -- repository -- default Branch
Create and Switch Branch
Gitlab 页面操作
知道了分支创建的原理,此页面需要提交的Create from (Existing branch name, tag, or commit SHA)的值,都是为了找到对应的commit对象所记录的快照,并让新分支的指针指向它。
Git 命令行操作
git branch test1 只创建本地新分支test1
git checkout test1 切换到分支test1
git checkout -b test1 创建新分支test1并切换到test1
git branch -a可以查看本地和远程分支
git branch 可以查看本地分支
git branch -r 可以查看远程分支
本地当前所在分支前面用*标识
切换到需要的本地分支之后,在此目录下所做的add/ commit, push 时会默认推送到对应的远程分支。
第一次不带参数push 时,会有一个警告让你设置一个push.default值。
Matching 表示push 时把本地所有分支的commit 推送到与本地所有分支匹配的远程分支。
Simple 表示push 时把本地当前所在分支的commit 推送到与之匹配的远程分支。Current与 simple 类似。
git config --global push.default matching
git config --global push.default simple
git config --global push.default current (建议设置)
Branch Compare
WEB Page
Source Branch : master
Target Branch:femtocoreMaster
Compare : 比较出来的结果是仅在mastar 上有,femtocoreMaster上没有的。
CLI
git log Target Branch..Source Branch
git clone git clone https://gitlab.XX-company.com/vmc/products.git
git log origin/femtocoreMaster..origin/master
Merge Request
通过分支比较可以得出两个分支的差异,如果要把这些差异合并向一方合并,需要使用merge request 。
创建:
使用issue 创建, 关联到issue
直接创建,与issue 无关,只为做分支间merge
Merge request 的入口有几种方式,不管从哪种方式进行,最终需要确认以下两个信息:
- Source branch 和 target Branch ,从哪到哪
- Compare 出来的结果是不是预想需要的changes
创建了一个merge request 之后,就可以处理merge request 。
- Source Branch(用来处理merge request 的工作分支) 里commit 代码,并push 到 Source Branch。
- 将Source Branch 的commit merge 到Target Branch 。
如果信息编辑有误,可以点击edit 重新编辑。
如果此项目设置了批准步骤,则需要approval 列表的人批准,才能点击下方的merge 操作。
点击merge 之后,如果全无冲突,merge直接完成。
如果两个branch 有冲突(多因为cherry-pick),则需要手动merge ,点击提示中的蓝色提示 command line ,弹框指导如何命令行操作。
ISSUE
每个project 都可以会有一个Issue列表,从#1 开始。
Project 名+ ISSUE # 可以唯一确定一个gitlab 中的bug。
创建ISSUE # :
New Issue: title ,Description ,Assignee 必填
为ISSUE创建merge request :
- 创建干净的工作分支, 分支默认名为issue title,可以编辑。
- Source :可选填基于哪个分支创建,最后合并回哪个分支。
- 创建完成后,在上方有一条记录related merge requests 的链接。
- 去所在的merge request 所要求的工作分支上去提交代码,并merge 到目标上去
CI/CD
gitlab 的CI/CD ,即持续集成,持续构建并部署测试的过程,实质上是
1. 将持续集成的过程阶段(编译构建/打包/部署/测试)写在gitlab.yml中
2. 并将准备执行gitlab.yml脚本内容的服务器配置为gitlab服务器的一个runner。
3. 当gitlab 库中的提交时,便会自动触发一次在runner 上的持续集成过程。
http://blog.leanote.com/post/gua_l/gitlab-CI-CD
其他用法
- Linux Shell中处理json 对象 (分解 gitlab API 返回的json 对象)-- jq
http://blog.leanote.com/post/gua_l/JQ-Linux-Shell
- git 撤销操作
http://blog.leanote.com/post/gua_l/git-revert
- git 查看两个commit 之间的修改
http://blog.leanote.com/post/gua_l/git-commit-history
- GitLab GEO 异地主副服务器同步--文档翻译
http://blog.leanote.com/post/gua_l/57a16a1e7ea6
- git 常用操作
http://blog.leanote.com/post/gua_l/git
No Leanote account? Sign up now.