The initial development of Gerrit started when a code review system for Android was requested. Because many Googledevelopers were involved in the development of Android, the new system needed to have a feature set similar to the Google internal review system Mondrian. For this purpose, Rietveld was started. Because the development of Rietveld was not fast enough, Rietveld was forked and developed separately, then as Gerrit 1.0. The Gerrit 2.x rewrite began development in late 2008, shipping 2.0-rc0 on January 13, 2009. The rewrite changed the implementation from Python on Google App Engine to Java on a J2EE servlet container and a SQL database, making it easier to run Gerrit Code Review on any Linux system. Rietveld was primarily written for SubversionVCS. Gerrit kept Rietveld's main philosophy and supports pre-commit workflow only. This creates significant restrictions on how people publish their work and collaborate.
Design
Originally written in Python like Rietveld, it is now written in Java with SQL since version 2 and a custom-made Git-based db since version 3.
Frontend
In versions 2.0 - 2.16 Gerrit used Google Web Toolkit for its browser-based front-end. After being developed and used in parallel with GWT, for versions 2.14 - 2.16, a new Polymer web UI replaced the GWT UI in version 3.0.
Gerrit Code Review
Gerrit is a commit review tool. Developers amend individual commits in response to feedback; Gerrit tracks each version of each commit, allowing developers to view the differences between versions, and to rebase individual commits while keeping a shared history in the review interface. Developers can pull individual commits and can push groups of related commits as a patch set. This patch-based workflow is avoided in favor of the pull request workflow used by several Git platforms such as GitHub and GitLab. In the pull request workflow, complete branches are reviewed and merged. There are projects, such as Go which use GitHub and Gerrit at the same time. Due to the process used by the Go team to sync GitHub pull requests to Gerrit, the pull request branch is squashed into a single commit. This loss of granular commit information is why the Go team recommends contributors to use their Gerrit instance.