Gerrit日常操作命令收集
Gerrit代码审核工具是个好东西,尤其是在和Gitlab和Jenkins对接后,在代码控制方面有着无与伦比的优势。
在公司线上部署了一套Gerrit系统,在日常运维中,使用了很多gerrit命令,在此收集下:
一、创建和销毁
(1)分支列表: $: git branch * master prepub product (2)创建分支: $: git branch prepub (3)切换已有分支: $: git checkout prepub Switched to branch 'prepub' (4)创建并切换分支: $: git checkout -b issue1234 Switched to branch 'issue1234' (5)删除分支: $: git branch -d issue1234 Deleted branch issue1234 (was b904c07).
二、合并和冲突
(1)合并前要先切回 要并入 的分支。 以下表示issue1234分支合并入master分支 $: git checkout master $: git merge issue1234 Merge made by recursive. README | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
冲突的时候,git会报出哪些文件冲突,这时候需要手动解决完冲突方可提交。 $: git merge issue1234 Auto-merging index.html CONFLICT (content): Merge conflict in index.html Automatic merge failed; fix conflicts and then commit the result.
通过git status查看冲突文件。
$: git status index.html: needs merge # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # unmerged: index.html # 打开index.html,git会在冲突位置做上标示。 <<<<<<< HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer"> please contact us at support@github.com </div> >>>>>>> iss53:index.html 解决完冲突,这时候需要手动标识该冲突已经解决,类似svn的resolved。 $: git add index.html $: git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: index.html # 这时候就可以提交了。 $: git commit -m "合并issue1234" [master e3ece67] 合并issue1234 1 files changed, 1 insertions(+), 0 deletions(-)
三、管理多个分支 前面提到,git非常推荐频繁使用分支,在大量分支的情况下,我们需要对分支做好管理(曾经一次上线,开了13个分支 = =) 通过-v可以看到最后一次提交日志。
通过--merged和--no-merged来查看分支是否已经合并完成。 $: git branch --merged * master p4popt $: git branch --no-merged prepub product 未合并的分支,在删除时会提示分支未合并。 $: git branch -d product warning: deleting branch 'product' that has been merged to 'refs/remotes/s/product', but it is not yet merged to HEAD. Deleted branch product (was 301ae4e).
分支管理流程 一般情况下,分支可以划分为长分支和短分支两种。 长分支
长期任务 prepub:上线前合并,根据上线列表,从各个分支中集中到该分支,统一部署提测 master:上线后合并,长期保留一个稳定可用的分支应付紧急任务 项目 较难解决的bug 新特性试验田 重构 长分支,经常会落后其他分支一大截,需要养成习惯,适时从其他重要分支进行合并, 尤其是项目分支 。 短分支
临时需求 小bug 分支可视化 git本身的log提供--gragh选项,可以提供字符界面的分支可视化视图。 $: git log --graph --pretty=oneline | * 50cc7a78b7f2704a2014afa3667f6ac5b5b47374 merging refs/remotes/origin/prepub into HEAD | | | | * 8f685bd1be3757effe32d6ff37f86bd07dd2b549 又被无情地冲掉了代码 | * | 75a17b4ad610327a9b0e1eecfc6c4bf9cade7359 修改icon | |/ | * 146a0990de450c854b1a7d9995e12979fff2d537 merging refs/remotes/origin/prepub into HEAD | | | | * 93b379680796eb443961bb8c59008f8ae5678be4 Merge branch 'prepub' of search.ued.taobao.net:projects/search into prepub | | | | | * | 8b93380ccfb9020bf8f8e1e8a4a553601de3c788 p4p加上refpid,开发给出来的配置是 P4P_refpid | * | | 08201de89834f6fecb195c2b7c3546b5cafccc85 秒杀折扣浮动层样式 | | |/ | |/| | * | 0f4d1df17f79c7aa3ca3d36ab848c10b78029010 修改icon | * | ae719fc29cc550321f284323db06a294b97c1398 p4p创意优化 | |/ | * a6d4501e1456589d30ab1a5800b651876629c8ca 修改icon git还有很多GUI工具,可以提供可视化地分支走势图,比如gitk,qgit,GitX等等。 远程分支
至今为止,前面所有提到的概念都是直接本地操作的,并不需要任何网络连接。 而git本身是一个分布式代码管理工具(DVCS),所以分支管理上,存在本地分支和远程分支两种概念。 可以简单的理解,远程分支就是别人的本地分支push到服务器上的时候产生的。比如master就是一个最典型的远程分支(默认)。 $: git push origin master 除了master之外,我们还可以随便创建分支,然后push到服务器上去。 $: git push origin prepub Counting objects: 27, done. Delta compression using up to 2 threads. Compressing objects: 100% (15/15), done. Writing objects: 100% (15/15), 7.30 KiB, done. Total 15 (delta 10), reused 0 (delta 0) To git@search.ued.taobao.net:projects/search.git 1b95a57..779dbe1 prepub -> prepub 远程分支的标识形式为{remote/branch},比如origin/product。 $: git branch -a master p4popt * prepub product remotes/origin/HEAD -> origin/master remotes/origin/master remotes/origin/p4popt remotes/origin/prepub remotes/origin/product 远程分支和本地分支需要区分,所以,在从服务器上拉取特定分支的时候,需要指定本地分支名字。 $: git branch product origin/product Branch product set up to track remote branch product from origin. 而1.6.2以上版本的git,可以通过--track选项,简化这一过程。这也是为什么直接执行git clone的时候,会自动创建本地master分支的原因。(实际上,pull操作相当于fetch+merge。) $: git checkout --track origin/product Branch product set up to track remote branch refs/remotes/origin/product. Switched to a new branch "product" 远程分支和本地分支是松散的结构,可以把任意远程分支合并到任意本地分支里;同样,也可以把任意本地分支push到任意远程分支上。 # THIS WILL MESS UP YOUR REPO!! $: git branch master * prepub p4popt product $: git pull origin product $: git push origin master 同步本地远程分支。 $: git fetch origin 删除远程分支。 $: git push origin :p4popt To git@search.ued.taobao.net:projects/search.git - [deleted] p4popt 补充:git cherry-pick和git rebase git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我 们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0 中的功能到v2.0中,这里就可以使用cherry-pick了。
# 先在v3.0中查看要合并的commit的commit id git log # 假设是 commit f79b0b1ffe445cab6e531260743fa4e08fb4048b
# 切到v2.0中 git check v2.0
# 合并commit git cherry-pick f79b0b1ffe445cab6e531260743fa4e08fb4048b git rebase有点类似git merge,但是两者又有不同,打个比方,你有两个抽屉A和B,里面都装了衣服,现在想把B中的衣服放到A中,git merge是那种横冲直撞型的,拿起B就倒入A里面,如果满了(冲突)再一并整理;而git rebase就很持家了,它会一件一件的从B往A中加,会根据一开始放入的时间顺序的来加,如果满了你可以处理这一件,你可以继续加,或者跳过这一件,又 或者不加了,把A还原。所以merge适合那种比较琐碎的,简单的合并,系统级的合并还是用rebase吧。
# 合并b git rebase b
# 处理完冲突继续合并 git rebase --continue
# 跳过 git rebase --skip
# 取消合并 git rebase --abort
- 配置多个网卡的OpenStack VM
- .NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象
- 游戏用户中心开发
- .NET Core采用的全新配置系统[4]: “Options模式”下各种类型的Options对象是如何绑定的?
- js运算符优先级笔记
- 通过协同绘制用GAN合成高分辨率无尽道路
- ASP.NET MVC的Model元数据与Model模板:预定义模板
- 为您的组织选择正确的企业云解决方案
- 搞定这些疑难杂症,向css3动画说yes
- 前十一个网络游戏业务收入1341亿 同比增22.1%
- ASP.NET MVC Model元数据及其定制:一个重要的接口IMetadataAware
- 使用Docker 1.12.x构建多容器Web应用程序
- 基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用
- 深度解剖dubbo源码
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux下快速安装Python3和pip
- 面试官:谈一谈java中基于AQS的并发锁原理
- kubernete编排技术三:StatefulSet
- Qt网络聊天室客户端
- 聊聊java中的StampedLock并发锁原理
- tomcat对AQS的扩展:使用LimitLatch控制连接数
- kubernete编排技术五:DaemonSet
- 深度剖析github上15.1k Star项目:redux-thunk
- 在不影响程序使用的情况下添加shellcode
- [K8s 1.9实践]Kubeadm 1.9 HA 高可用 集群 本地离线镜像部署
- ansible模块command、shell、raw、script
- systemd - CentOS 7进程守护&监控
- Java 8的新特性还不了解?快进来!
- 【Vulnhub】Play XML Entities
- 一切皆是映射:詳解 Kotlin Map 集合類