Gerrit平常維護記錄

 

Gerrit代碼審覈工具是個好東西,尤爲是在和Gitlab和Jenkins對接後,在代碼控制方面有着無與倫比的優點。html

在公司線上部署了一套Gerrit系統,在平常運維中,使用了不少gerrit命令,在此收集下:git

1、建立和銷燬github

(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).服務器

2、合併和衝突網絡

(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查看衝突文件。svn

$: 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(-)工具

3、管理多個分支
前面提到,git很是推薦頻繁使用分支,在大量分支的狀況下,咱們須要對分支作好管理(曾經一次上線,開了13個分支 = =)
經過-v能夠看到最後一次提交日誌。
fetch

經過--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

相關文章
相關標籤/搜索