Gerrit上分支操作记录(创建分支、删除分支)

Git分支对于一个项目的代码管理而言,是十分重要的!许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉。 在此,我将自己的一些操作经历做一梳理,希望能帮助到有用到的朋友们。

gerrit分支操作常用的命令可以参考:http://www.cnblogs.com/kevingrace/p/5690820.html

1)首先,利用gitlab进行创建分支 登陆gitlab,创建组test,在这个组上创建工程apptest,然后让这个工程里添加内容 注意:在添加内容的使用,我们可以自定义分支名,这个分支就是我们想要创建的分支 如下截图:

这样,就创建了三个分支:master(默认),test,dev

特别注意:

后面创建的分支都是以前面当前分支为源创建的

所以新创建分支的文件都会包括前面的分支的文件,应该将和前面分支重复的文件删除!

如:

master分支下是testfile文件

test分支下是testfile文件、123文件,应该将testfile文件删除

dev分支下是testfile文件、123文件、zhonghon文件,应该将testfile文件和zhonghon文件删除

如下:

在linux客户机上操作分支,修改分支下的代码并上传到远程的git分支上

[gerrit@115~]$  git clone git@103.10.86.30:test/apptest.git

[gerrit@115~]$ git branch -av         #查看当前分支情况,发现了上面在gitlab里面创建的三个分组master,dev,test

* master 1c2ecde 12                       #发现当前在master分支下(*指向master) remotes/origin/HEAD -> origin/master remotes/origin/dev 6eae416 234 remotes/origin/master 1c2ecde 12 remotes/origin/test d5b51b9 Delete zhonghogn

[gerrit@115~]$ vim .gitrevirw

[gerrit@115~]$ vim .testr.conf

[gerrit@115~]$ git add .

[gerrit@115~]$ git commit -m “add on master"

[gerrit@115~]$ git push -u origin master          #提交到master分支下,查看gitlab上apptest工程下的master分支,已经有这两个文件

接着选择一个非master的分支,如dev分支,修改里面的代码

[gerrit@115~]$ git branch dev remotes/origin/dev      #先将远程gitlab上创建的分支在本地别名化

[gerrit@115~]$ git checkout dev         #使用git checkout命令切换到dev分支下 Switched to branch 'dev' [gerrit@115~]$ git branch -av        #查看当前分支,发现本地有了dev分支了(上面设置过的分支别名) * dev 6eae416 234 master 1c2ecde 12 remotes/origin/HEAD -> origin/master remotes/origin/dev 6eae416 234 remotes/origin/master 1c2ecde 12 remotes/origin/test d5b51b9 Delete zhonghogn

[gerrit@115~]$ vim .gitrevirw            #修改dev分支下的代码  

[gerrit@115~]$ vim .testr.conf

[gerrit@115~]$ git add .

[gerrit@115~]$ git commit -m “add on dev"

[gerrit@115~]$ git push -u origin dev  #注意,这里提交到dev分支下 Counting objects: 5, done. Delta compression using up to 32 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 535 bytes, done. Total 4 (delta 0), reused 0 (delta 0) To git@103.10.86.30:test/apptest.git 7a4b6e6..6eae416 dev -> dev Branch dev set up to track remote branch dev from origin.

git push -u origin dev Counting objects: 5, done. Delta compression using up to 32 threads. Compressing objects: 100% (4/4), done. Writing objects: 100% (4/4), 535 bytes, done. Total 4 (delta 0), reused 0 (delta 0) To git@103.10.86.30:test/apptest.git 7a4b6e6..6eae416 dev -> dev Branch dev set up to track remote branch dev from origin.

这样就能push到远程的remotes/origin/dev 上了,去gitlab上看看dev分支下已经有了这两个文件.gitreview和.testr.conf

如下:

其他的分支如上面gitlab里的test分支,要想弄到本地,操作和上面的dev分支操作一样

*******************************************************

线上部署了gerrit+gitlab环境(代码同步),将git代码放到上面进行维护管理了!

应开发同事要求,要在他们的项目下创建除master默认分支之外的其他分支

在gerrit上创建分支,这里我总结了下面两种情况的操作,在此做一详细记录:

 (1)

第一种情况:gerrit上还没有创建项目

《gerrit上的项目最好是从gitlab上git clone --bare过来,并且项目不要为空》

思路:

先在gitlab上创建分支(上面截图),然后在linux服务器(这里选择gerrit本机)git clone下载gitlab里的项目(如上面的apptest)

最后将整个项目发布到gerrit上

关于怎么在gerrit上设置项目,大家可参考我的另一片博客,里面有详细介绍(http://www.cnblogs.com/kevingrace/p/5651447.html

《注意,上面在新分支下添加的.gitreview文件一定要有,不然就不能使用git review命令提交代码审核了,具体上面参考的另一篇博客中有说明》

在gerrit的一个普通用户如wangshibo下操作:

如果修改apptest项目的非master分支下的代码,如上面的dev分支

用 gerrit用户在 Gerrit 上创建 test-project1 项目 要知道 review 是在 gerrit 上,而 gerrit 上现在是没有项目的,想让 gitlab 上的项目能在 gerrit 上 review 的话,必须在 gerrit 上创建相同的项目,并有相同的仓库文件.

用 gerrit用户在 Gerrit 上创建 apptest 项目 [gerrit@115]$ ssh-gerrit gerrit create-project apptest      #这时候gerrit上其实已经有apptest项目了 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ssh-gerrit是别名 [gerrit@115r ~]$ cat ~/.bashrc # .bashrc

# Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi alias ssh-gerrit='ssh -p 29418 -i ~/.ssh/id_rsa 103.10.86.30 -l gerrit' # User specific aliases and functions <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

虽然上面创建了apptest项目,并且gerrit界面里已经有这个项目,但是个空目录 我们需要将Gitlab上的apptest项目发布到gerrit上 在此需要用到git clone –bare 命令 [gerrit@115]$ cd /home/gerrit/gerrit_site/git/        #即登陆到gerrit安装目录的git下 [gerrit@115 git]$ rm -fr apptest.git [gerrit@115 git]$ git clone --bare git@103.10.86.30:test/apptest.git [gerrit@115 git]$ ls All-Projects.git All-Users.git apptest.git [gerrit@115 git]$ cd apptest.git/ [gerrit@115 git]$ ls              #即test-project1工程和gerrit里默认的All-Projects.git工程结构是一样的了 branches config description HEAD hooks info objects packed-refs refs

登陆gerrit界面,发现apptest工程已经创建了。

接着修改非master分支,比如dev分支的代码并提交到gerrit里审核

[root@115~]# su - wangshibo    #切换到gerrit的用户用户wangshibo下

[wangshibo@115~]$ git branch -av            #查看本地的分支结构

* master 1c2ecde 12 remotes/origin/HEAD -> origin/master remotes/origin/dev 6eae416 234 remotes/origin/master 1c2ecde 12 remotes/origin/test d0ef218 444

[wangshibo@115~]$ git branch dev remotes/origin/dev    将远程分支本地别名化

[wangshibo@115~]$ git checkout dev           # 切换到dev分支下

[wangshibo@115~]$ vim haha

[wangshibo@115~]$git add haha

[wangshibo@115~]$git commit -m "23232323"

[wangshibo@115~]$git review dev             #提交代码审核的时候,注意要指定提交到分支dev上审核

然后用wangshibo用户登录gerrit,进行审核

审核通过后,通过apptest的dev分支的gitweb就能查看到提交的代码,如下:

Gerrit里面分支代码审核通过后,会自动同步到Gitlab上相应工程的分支下的

也就是说:Gerrit到Gitlab的同步策略包含所有的分支!

***************************************************************************

第二种情况:gerrit上已经创建好了项目,后续创建分支并插入到gerrit的项目里:

【gerrit上对应项目的access的refs/heads/*的“push”权限可以运行推送代码和分支到gerrit上;“Create Reference”权限运行创建分支;】

首先在gerrit界面创建分支(这里新创建分支ops),如下:

管理员帐号登陆gerrit,点击apptest项目的Branches->Create Branch  (默认的initial Revision是HEAD)

刚创建后,会发现新分支和mater分支的Revision一致,HEAD指针是一致的

接着在本地git clone把代码重新克隆下来,

比如上面在gerrit里已经创建好了apptest项目,将这个项目clone到本地

[gerrit@115~ ]$ git clone ssh://gerrit@103.10.86.30:29418/apptest && scp -p -P 29418 gerrit@103.10.86.30:hooks/commit-msg apptest/.git/hooks/

[gerrit@115~ ]$ cd apptest

[gerrit@115~ apptest]$ git branch -av         #查看分支情况,已经可以发现gerrit界面里创建的新分支ops * master 486e140 Merge "123"         #当前在master分支下 remotes/origin/HEAD -> origin/master remotes/origin/dev 27a1d5c 343434 remotes/origin/master 486e140 Merge "123"     #新分支刚创建时,跟当前所在分支的ID是一致的 remotes/origin/ops 486e140 Merge "123" remotes/origin/test d0ef218 444

[gerrit@115~ apptest]$ git checkout -b ops remotes/origin/ops     #将新建分支在本地别名化,并切换进去 Branch ops set up to track remote branch ops from origin. Switched to a new branch 'ops' [gerrit@115~ apptest]$ git branch -av      再查看,发现当前分支就是ops了 master 486e140 Merge "123" * ops 486e140 Merge "123" remotes/origin/HEAD -> origin/master remotes/origin/dev 27a1d5c 343434 remotes/origin/master 486e140 Merge "123" remotes/origin/ops 486e140 Merge "123" remotes/origin/test d0ef218 444

千万记住一点::

新分支创建后,是和创建时的当前所在分支下的内容是一致的。

切换到新建分之以后,如果不清空当前内容,直接push上去,那该分支代码和你切换之前的分支是一样的。

所以要删除新分支里的内容,然后再push提交,提交后查看分支情况,就会发现新建分支和之前的分支的 Revision指向就不一样了,如下:

[gerrit@115~apptest]$ rm -rf ./* [gerrit@115~ apptest]$ git add . [gerrit@115~ apptest]$ git commit -am "222"    #因为前面是直接rm删除的,所以这里commit要多加一个-a,如果是git rm删除就不用加-a [ops 3a26276] 222 2 files changed, 0 insertions(+), 2 deletions(-) delete mode 100644 haha delete mode 100644 zhonghogn [gerrit@Zabbix-server apptest]$ git push -u origin ops       #这里是gerrit管理员下,所以可以直接push,普通用户就git review ops了 Counting objects: 3, done. Delta compression using up to 32 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (2/2), 246 bytes, done. Total 2 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1) remote: Processing changes: refs: 1, done To ssh://gerrit@103.10.86.30:29418/apptest 486e140..3a26276 ops -> ops Branch ops set up to track remote branch ops from origin.

这时候再查看分支情况,就会发现ops分支和master分支的ID不一样了

[gerrit@Zabbix-server apptest]$ git branch -av master 486e140 Merge "123" * ops 3a26276 222 remotes/origin/HEAD -> origin/master remotes/origin/dev 27a1d5c 343434 remotes/origin/master 486e140 Merge "123" remotes/origin/ops 3a26276 222 remotes/origin/test d0ef218 444

再次登录gerrit界面,就会发现Revision自然也就不一致了,ops分支下的内容和master分支下的内容也不一样了

 ops分支下这个时候还是空的(上面已经清空了)

image.png

接着就可以往ops分支里创建或修改代码了,如下:

[root@115~ ]# su - wangshibo                 #切换到gerrit普通用户wangshibo账号下操作 [wangshibo@115~ ]$ git clone ssh://gerrit@103.10.86.30:29418/apptest && scp -p -P 29418 gerrit@103.10.86.30:hooks/commit-msg apptest/.git/hooks/ [wangshibo@115~ ]$ cd apptest/ [wangshibo@115~ ]$ git branch -av              #查看分支,当前分支是master * master 486e140 Merge "123" remotes/origin/HEAD -> origin/master remotes/origin/dev 27a1d5c 343434 remotes/origin/master 486e140 Merge "123" remotes/origin/ops 3a26276 222 remotes/origin/test d0ef218 444 [wangshibo@115~ ]$ git checkout -b ops remotes/origin/ops          #将远程分支本地别名化 Branch ops set up to track remote branch ops from origin. Switched to a new branch 'ops' [wangshibo@115~ ]$ git branch -av              #发现当前分支已经是ops了 master 486e140 Merge "123" * ops 3a26276 222 remotes/origin/HEAD -> origin/master remotes/origin/dev 27a1d5c 343434 remotes/origin/master 486e140 Merge "123" remotes/origin/ops 3a26276 222 remotes/origin/test d0ef218 444 [wangshibo@115~ ]$ ls                                 #没有内容,上面已经提到,切换后就讲内容清空了 [wangshibo@115~ ]$ vim testfile                   #新增内容 [wangshibo@115~ ]$ git add testfile [wangshibo@115~ ]$ git commit -m "branch test" [ops ba9572e] branch test 1 files changed, 2 insertions(+), 0 deletions(-) create mode 100644 testfile [wangshibo@115~ ]$ git review ops                #提交代码审核,提交是指定到分支ops里 Creating a git remote called "gerrit" that maps to: ssh://wangshibo@103.10.86.30:29418/apptest.git remote: Processing changes: new: 1, refs: 1, done remote: remote: New Changes: remote: http://103.10.86.30:80/64 branch test remote: To ssh://wangshibo@103.10.86.30:29418/apptest.git * [new branch] HEAD -> refs/publish/ops

登陆gerrit,就会发现有个review的审核请求了

通过审核

这个时候,review审核已经通过了

通过apptest项目的ops分支的gitweb就能看到新增的代码了

最后,登陆Gitlab,就能发现相应项目的分支代码也都同步过来了(前提是gerrit里面做了相应的replication同步配置)!很神奇的~~~~~

*********************************************************************** ************** ********* 

如何删除gerrit界面上创建的分支?也可以理解在本地如何删除远程分支:

git 删除远程分支 一不小心把本地的临时分支push误提交到server上去了,想要删除。 [wangshibo@115 ~]$ git branch -av master remote/origin/master remote/origin/origin/master     #这个就是误提交的分支

这个时候,执行下面命令即可删除远程分支 [wangshibo@115 ~]$git push origin :origin/master

冒号前面的空格不能少,原理是把一个空分支push到server上,相当于删除该分支。其实也是一个push推送过程,只不过是推送的空的而已!

比如下面一例,在本地误提交了一个分支到远程的gerrit上了!现在需要删除。

[wangshibo@115 GItLearn]$ git branch -av * master 44f4b3a Add new file remotes/origin/HEAD -> origin/master remotes/origin/dev 44f4b3a Add new file remotes/origin/master 44f4b3a Add new file remotes/origin/remotes/origin/devlop dc21d7f 123          #删除这个多余的分支

[wangshibo@115 GItLearn]$ git push origin :remotes/origin/devlop remote: Processing changes: refs: 1, done To ssh://wangshibo@103.11.186.130:29418/GItLearn - [deleted] remotes/origin/devlop [wangshibo@115 GItLearn]$ git branch -av #再次查看,上面多余的分支已经删除了! devlop dc21d7f 123 * master 44f4b3a Add new file remotes/origin/HEAD -> origin/master remotes/origin/dev 44f4b3a Add new file remotes/origin/master 44f4b3a Add new file

再次登陆gerrit查看,上面多余的分支就没有了!

************************************************************************************************

如何在本地创建分支,然后上传到gerrit上?也可以理解为在本地创建分支,然后推送到远程新分支上:

命令格式如下: #git push origin local_branch:remote_branch

注意: 这个操作,local_branch必须为你本地存在的分支,remote_branch为远程分支,如果remote_branch不存在则会自动创建分支。

只不过这个上传到远程后,分支内容是和master分支内容是一样的!

另外: #git push origin :remote_branch 上面的local_branch留空(即冒号前面留有空格),则是删除远程remote_branch分支。(上面已经提到了!)

如下面的例子: [wangshibo@115 GItLearn]$ git branch -av * master 44f4b3a Add new file remotes/origin/HEAD -> origin/master remotes/origin/dev 44f4b3a Add new file remotes/origin/master 44f4b3a Add new file

本地创建分支devlop,然后上传到gerrit上: [wangshibo@115 GItLearn]$ git branch devlop                #新建devlop分支 [wangshibo@115 GItLearn]$ git branch -av devlop 44f4b3a Add new file * master 44f4b3a Add new file remotes/origin/HEAD -> origin/master remotes/origin/dev 44f4b3a Add new file remotes/origin/master 44f4b3a Add new file [wangshibo@115 GItLearn]$ git push origin devlop:devlop     #上传到远程gerrit上,gerrit上若没有devlop,则会自动创建 Total 0 (delta 0), reused 0 (delta 0) remote: Processing changes: refs: 1, done To ssh://wangshibo@103.10.86.30:29418/GItLearn * [new branch] devlop -> devlop [wangshibo@115 GItLearn]$ git branch -av         #再次查看,发现已经上传到远程gerrit上了 devlop 44f4b3a Add new file * master 44f4b3a Add new file remotes/origin/HEAD -> origin/master remotes/origin/dev 44f4b3a Add new file remotes/origin/devlop 44f4b3a Add new file remotes/origin/master 44f4b3a Add new file

登陆gerrit查看,发现已经有了这个分支了!【这样上传后,分支内容和master分支内容是一样的,因为在本地创建devlop分支的时候,当前分支是master】

************************************************************************************************

将远程gerrit上的代码分支迁移到本地新的gerrit分支上 迁移流程: 1.先将远程gerrit整个代码clone到本地(默认迁移过来后的当前分支是master) 2.clone到本地后,查看分支列表 3.在本地gerrit上创建同名分支 4.切换到clone下来的代码的各个分支,然后将分支内容push到本地新gerrit上的同名分支上

******* 把本地仓库提交到远程仓库的master分支中(其他分支操作一样) git push ssh://gerrit@103.10.86.30:29418/apptest_ios.git master #或者像上面一样,将远程分支本地化,然后一步步提交

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏埋名

Git 常用命令清单笔记

这里是我的笔记,记录一些git常用和一些记不住的命令,这个笔记原本是基于 颜海镜的文章增加的,后面慢慢增加了许多内容,可以看出的的学习轨迹。分享出来方便自己查看...

1173
来自专栏青玉伏案

Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase

上篇博客聊了《git分支管理之rebase 以及 cherry-pick相关操作》本篇博客我们就以Learning Git中的关卡进行展开。下方列举了Learn...

2866
来自专栏青玉伏案

Git知识总览(二) git常用命令概览

上篇博客我们从 git clone 和 git status 两个命令开始,引出了一系列的git操作命令, 请参见:《Git知识总览(一) 从 git clon...

2988
来自专栏友弟技术工作室

Git从0到1

本文只是帮助你入门,从一个不会使用git的小白,到会解决开发中常见的使用。 废话不多说,直接进入正题。 ? 最远处 git git是用于Linux内核开发的...

43512
来自专栏xcywt

记录我学github的路程(二)

2015-12-09 更新 1,现在,本地有了一个库,你可能会想到GitHub创建一个库,并且关联起来。这样,远程的库既可以当作备份,又可以让其他人通过该仓库来...

20210
来自专栏维C果糖

IntelliJ IDEA 中的版本控制介绍(下)

在「IntelliJ IDEA 中的版本控制介绍」中,我们已经简单了解了 IntelliJ IDEA 的版本控制机制,那么接下来,就让我们一起看看在 Intel...

2616
来自专栏玩转JavaEE

Spring Cloud Zuul中路由配置细节

上篇文章我们介绍了API网关的基本构建方式以及请求过滤,小伙伴们对Zuul的作用应该已经有了一个基本的认识,但是对于路由的配置我们只是做了一个简单的介绍,本文我...

6425
来自专栏游戏杂谈

shell删除指定目录下的svn目录

在发布或是部署一些项目时,需要先将资源上传到服务器。环境一般分为:本机、内网、公网,公网的话,考虑带宽问题,一般不允许将.svn目录和Thumbs.db文件上...

3055
来自专栏Java后端技术

谈谈分布式版本管理工具Git

Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的...

1332
来自专栏信安之路

教你如何去掉git历史中的敏感信息

本章教大家如何使用 GIT 进行一些关于已提交历史的修改、删除操作。比如碰到下列情况时,如何使用 GIT 实现想要的操作:

1690

扫码关注云+社区

领取腾讯云代金券