{"id":361,"date":"2026-10-13T21:11:03","date_gmt":"2026-10-13T21:11:03","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2014\/07\/22\/using-gerrit-to-enhance-your-git\/"},"modified":"2026-10-13T21:11:03","modified_gmt":"2026-10-13T21:11:03","slug":"using-gerrit-to-enhance-your-git","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/using-gerrit-to-enhance-your-git\/","title":{"rendered":"Using Gerrit to Strengthen Git Code Review and Automated Code Analysis"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Gerrit adds a structured review gate on top of Git, helping teams run human review and automated checks before code reaches shared branches. If you manage CI\/CD or repository governance, this walkthrough shows how Gerrit can improve code analysis quality and traceability without replacing Git itself.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Originally published on 2014-07-22; fully revised and updated.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2014\/07\/gerrit-git-code-analysis.png\" alt=\"Gerrit and Git code analysis\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What Gerrit adds beyond plain Git<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Git handles version control. Gerrit adds a review system where each proposed change is evaluated before merge. Instead of pushing directly to a branch, developers push to a review reference (commonly <strong>refs\/for\/branch<\/strong>), and Gerrit creates a reviewable change.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Patch set iterations:<\/strong> update the same review with amended commits.<\/li><li><strong>Review labels:<\/strong> teams can use labels such as Code-Review and Verified to gate submit.<\/li><li><strong>Audit trail:<\/strong> comments, votes, and CI outcomes are attached to each change.<\/li><li><strong>Submit control:<\/strong> merge can be blocked until required approvals and checks pass.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Typical Gerrit review and analysis workflow<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Developer commits locally] --> B[Push to refs\/for\/main]\n    B --> C[Gerrit creates change and patch set]\n    C --> D[Reviewers comment and vote]\n    C --> E[CI runs lint tests and security scans]\n    D --> F{Approvals and CI green}\n    E --> F\n    F -- no --> G[Developer amends commit and pushes again]\n    G --> C\n    F -- yes --> H[Submit and merge to main]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Core commands: from local commit to Gerrit review<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1) Clone and install the commit-msg hook<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The commit-msg hook adds a Change-Id, which Gerrit uses to track new patch sets for the same review.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">git <span class=\"hljs-keyword\">clone<\/span> ssh:<span class=\"hljs-comment\">\/\/USER@gerrit.example.com:29418\/myteam\/myrepo.git<\/span>\ncd myrepo\nscp -p -P <span class=\"hljs-number\">29418<\/span> USER@gerrit.example.com:hooks\/commit-msg .git\/hooks\/<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">2) Push a new change for review<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript language-bash\">git checkout -b feature\/improve-parser\ngit add .\ngit commit -m <span class=\"hljs-string\">\"Refactor parser error handling\"<\/span>\ngit push origin HEAD:refs\/<span class=\"hljs-keyword\">for<\/span>\/main<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">3) Update the same change as a new patch set<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">git add parser.py\ngit commit --amend\ngit push origin HEAD:refs\/for\/main<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">4) Fetch a specific patch set locally<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs language-bash\">git fetch origin refs\/changes\/45\/12345\/3\ngit checkout FETCH_HEAD<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">5) Example CI vote back to Gerrit<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Many CI systems report status back to Gerrit as a review vote and message.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">ssh<\/span> <span class=\"hljs-selector-tag\">-p<\/span> 29418 <span class=\"hljs-selector-tag\">USER<\/span><span class=\"hljs-keyword\">@gerrit<\/span>.example.com gerrit review \\\n  --verified +<span class=\"hljs-number\">1<\/span> \\\n  --message <span class=\"hljs-string\">\"CI passed: lint, unit tests, sast\"<\/span> \\\n  <span class=\"hljs-number\">12345<\/span>,<span class=\"hljs-number\">3<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Where to run code analysis: pre-submit vs post-submit<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Strategy<\/th><th>What runs<\/th><th>Main advantage<\/th><th>Main trade-off<\/th><\/tr><\/thead><tbody><tr><td>Pre-submit (on Gerrit change)<\/td><td>Lint, tests, security scans before merge<\/td><td>Blocks bad changes early<\/td><td>Long checks can slow review turnaround<\/td><\/tr><tr><td>Post-submit (after merge)<\/td><td>Analysis on main branch only<\/td><td>Faster review cycle<\/td><td>Defects can land in shared branch<\/td><\/tr><tr><td>Hybrid<\/td><td>Fast checks pre-submit, deep scans post-submit<\/td><td>Balanced speed and risk control<\/td><td>Requires clearer policy and pipeline design<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Gerrit and PR-style platforms: quick comparison<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Platform model<\/th><th>Review unit<\/th><th>Iteration style<\/th><th>Common governance pattern<\/th><\/tr><\/thead><tbody><tr><td>Gerrit<\/td><td>Change with patch sets<\/td><td>Amend and push new patch sets to same change<\/td><td>Label-based submit gating (human plus CI votes)<\/td><\/tr><tr><td>GitHub<\/td><td>Pull request<\/td><td>Push new commits to PR branch<\/td><td>Branch protection and status checks<\/td><\/tr><tr><td>GitLab<\/td><td>Merge request<\/td><td>Push new commits to MR branch<\/td><td>Approval rules and pipeline status gates<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Original video resource<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The original post was a short teaser that pointed to a video demonstration. You can still access that reference here: <a href=\"https:\/\/www.youtube.com\/watch?v=Wxx8XndqZ7A&amp;t=216s\" target=\"_blank\" rel=\"noopener\">Gerrit video link<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices and common pitfalls<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Keep pre-submit checks fast; move heavy scans to asynchronous or staged pipelines.<\/li><li>Define clear submit rules so reviewers know what is required to merge.<\/li><li>Standardize label usage (for example, who can vote Verified vs Code-Review).<\/li><li>Document how developers should update patch sets (amend vs new commit strategy).<\/li><li>Avoid bypass pushes to protected branches except for controlled emergency paths.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Gerrit extends Git with patch-set based code review and CI gating so teams can catch quality issues before merge. This guide shows the workflow, key commands, and practical integration patterns.<\/p>\n","protected":false},"author":1,"featured_media":3653,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[62],"tags":[517,1003,784,846,945,1974,1977,1978,1976,545,1975,1973,1467,1035,1972],"class_list":["post-361","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code-analysis","tag-analysis","tag-code","tag-code-analysis","tag-enhance","tag-gerrit","tag-gerrit-for-code-analysis","tag-gerrit-guide","tag-gerrit-reference","tag-gerrit-tutorials","tag-how","tag-how-to-use-gerrit-for-code-analysis","tag-how-to-use-gerrit-in-code-analysis","tag-implement","tag-improve","tag-using-gerrit-to-enhance-your-code-analysis"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/361","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=361"}],"version-history":[{"count":3,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/361\/revisions"}],"predecessor-version":[{"id":79235,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/361\/revisions\/79235"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3653"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=361"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=361"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=361"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}