Gerrit�Concepts and Workflows�(for Googlers: go/gerrit-explained)���Edwin Kempin�Google Munich�ekempin@google.com
This presentation is based on a Git/Gerrit workshop that was developed by SAP.
Credits go to sasa.zivkov@sap.com, matthias.sohn@sap.com and christian.halstrick@sap.com
PUBLIC - SHARED WITH GERRIT COMMUNITY
Gerrit Code Review
Gerrit Code Review
Target Audience
This presentation is for:
Required pre-knowledge:
Content
YES
NO
Agenda
Welcome
Q: What is Gerrit?
?
?
?
?
?
Gerrit
Gerrit is a Git server that provides
Code Review:
Access Rights:
NOT Gerrit
Gerrit does not provide
Gerrit allows integration with third-party tools that provide additional functionalities (see list on the left).
Gerrit
In the Gerrit installation folder on the server (review_site) you can find a git folder that contains all Git repositories that are managed by Gerrit:
At Google the repositories are not stored in the file system, but in a database.
Gerrit
Gerrit is built on top of Git
Modern Code Review
Code Review Benefits
Gerrit Concepts
Q: Since code review is optional, how does Gerrit know if you push directly to Git or for code review?
GitHub Pull Requests is another workflow for working with Git (not supported by Gerrit).
Push for Code Review
Push for code review:
Push directly to Git (bypassing code review):
Whether pushing directly to Git, and hence bypassing code review, is allowed can be controlled by access rights (direct push requires the Push permission on refs/heads/*).
Using HEAD in the push command means that the current commit/branch is pushed. Instead you can also specify a branch or SHA1.
Further details about the git push command are discussed in the Git - Concepts and Workflows presentation.
Push for Code Review
git push origin HEAD:refs/for/master
Push for Code Review - Case 1
Situation:
B
A
featureX
C
HEAD
local repository
remote repository
git push origin HEAD:refs/for/master
B
A
master
origin/master
Q: What happens on push for code review?
Push for Code Review - Case 1
Push for Code Review:
B
A
featureX
C
HEAD
local repository
remote repository
B
A
refs/changes/35/135/1
origin/master
C
master
git push origin HEAD:refs/for/master
Push for Code Review - Case 2
B
A
featureX
C
HEAD
local repository
remote repository
B
A
master
origin/master
D
Q: Which commits get pushed?
git push origin HEAD:refs/for/master
Situation:
Push for Code Review - Case 2
B
A
featureX
C
HEAD
local repository
remote repository
B
A
origin/master
D
Push for Code Review:
C
D
master
refs/changes/36/136/1
refs/changes/35/135/1
depends on
git push origin HEAD:refs/for/master
Push for Code Review - Case 3
B
A
featureX
HEAD
local repository
remote repository
B
A
origin/master
C
Q: What happens on push for code review?
git push origin HEAD:refs/for/master
Situation:
D
master
Push for Code Review - Case 3
B
A
featureX
HEAD
local repository
remote repository
B
A
origin/master
C
git push origin HEAD:refs/for/master
The push succeeds:
D
master
C
refs/changes/35/135/1
Change
Numeric ID: 135
Commit
Metadata: project, target branch, owner, etc
1 or more patch sets
Change-Id
...
comments
votes
Review and Vote
Changes can be inspected in the Gerrit WebUI:
Review and Vote
Changes can be inspected in the Gerrit WebUI.
B
A
refs/changes/92/208892/1
C
master
Compared versions:
Review and Vote
Changes can be inspected in the Gerrit WebUI.
Voting
Voting is done on review labels:
Q: What can the change owner do if a negative vote is received?
Voting
Abandoning a change means that the modifications are discarded and the change doesn’t get submitted. Abandoned changes are still accessible and can be restored if needed.
Q: When you push a commit for code review how does Gerrit know if you push� a new change or a new version of an existing change?
Change-Id
The Gerrit commit-msg hook that generates and inserts Change-Ids on git commit must be installed once in a repository after it was cloned:
Change-Id
First line is the subject, should be shorter than 70 chars
Separate the body from the subject by an empty line. The commit message should describe why you are doing the change. That's what typically helps best to understand what the change is about. The details of what you changed are visible from the file diffs.��The body can have as many paragraphs as you want. Lines shouldn't exceed 80 chars. This helps command line tools to render it nicely. Paragraphs are separated by empty lines.
�Change-Id: I3eefa6661010058d3684b2983f5b38bf3233d0f7
Bug: Issue 123
Change-Id:
Q: What is a patch set?
Patch Set
Often the term revision is used as synonym for patch set, or the Git commit of a patch set.
Push new Patch Set
Situation:
B
A
featureX
C
HEAD
local repository
remote repository
B
A
refs/changes/35/135/1
origin/master
C
master
Q: How is a new a patch set created?
Push new Patch Set
The user fixes the code and create a new commit by using�git commit --amend:
B
A
featureX
C
local repository
remote repository
B
A
refs/changes/35/135/1
origin/master
C
master
D
featureX
HEAD
Push new Patch Set
The new commit D is pushed for code review:
B
A
C
local repository
remote repository
B
A
refs/changes/35/135/1
origin/master
C
master
D
featureX
HEAD
D
refs/changes/35/135/2
git push origin HEAD:refs/for/master
Change ref
refs/changes/35/135/1
Ref prefix that is used for all change refs.
Sharded numeric change ID. The numeric change ID is 135, the last 2 digits are used as prefix for sharding.
The patch set number.
Review of new Patch Set
Compared versions:
B
A
refs/changes/32/206232/1
C
master
D
refs/changes/32/206232/2
Patch Set Selector:
Comparing Patch Sets
B
A
refs/changes/32/206232/1
C
master
D
refs/changes/32/206232/2
Compared versions:
Patch Set Selector:
Submit
Submit integrates a change into its target branch (more precisely integrates the current patch set into the target branch):
B
A
refs/changes/32/206232/1
C
master
D
refs/changes/32/206232/2
master
Pre-conditions for submit:
+2
-1
Submit
Situation:
B
A
refs/changes/32/206232/1
C
master
D
refs/changes/32/206232/2
Q: What happens on submit if fast-forwarding the target branch is not possible?
E
master
+2
-1
Submit Type / Submit Strategy
The behaviour on submit is configurable per repository:
Submit - MERGE_IF_NECESSARY
Since a fast-forward of the target branch is not possible a merge commit is created :
B
A
refs/changes/32/206232/1
C
D
refs/changes/32/206232/2
Q: How would the result look like with REBASE_IF_NECESSARY?
F
master
E
master
+2
-1
Submit - REBASE_IF_NECESSARY
Since a fast-forward of the target branch is not possible the current patch set, commit D, is rebased which creates patch set F:
B
A
refs/changes/32/206232/1
C
D
refs/changes/32/206232/2
F
master
E
master
∆D
∆D
+2
-1
Submit - MERGE_ALWAYS
Although a fast-forward of the target branch to the current patch set, commit D, is possible a merge commit F is created:
B
A
refs/changes/32/206232/1
C
D
refs/changes/32/206232/2
E
master
master
+2
-1
Submit - REBASE_ALWAYS
Although a fast-forward of the target branch to the current patch set, commit D, is possible a rebase is done which creates commit E:
B
A
refs/changes/32/206232/1
C
D
refs/changes/32/206232/2
E
master
master
∆D
∆D
+2
-1
Submit - CHERRY_PICK
Situation:
B
A
refs/changes/32/206232/1
C
D
refs/changes/31/206231/1
master
Q: What happens on submit of the change for commit D?
+2
-1
Submit - CHERRY_PICK
B
A
refs/changes/32/206232/1
C
D
refs/changes/31/206231/1
E
master
master
∆C
∆D
∆D
+2
-1
Conflict Resolution
Situation:
B
A
refs/changes/32/232/1
C
D
refs/changes/32/232/2
E
master
B
A
C
local repository
remote repository
origin/master
D
featureX
HEAD
Q: How is the conflict resolved so that the change becomes submittable?
+2
-1
Conflict Resolution - Rebase Change
B
A
refs/changes/32/232/1
C
D
refs/changes/32/232/2
E
master
B
A
C
local repository
remote repository
origin/master
D
featureX
HEAD
E
origin/master
git fetch origin
+2
-1
Conflict Resolution - Rebase Change
B
A
refs/changes/32/232/1
C
D
refs/changes/32/232/2
E
master
local repository
remote repository
B
A
C
origin/master
D
featureX
E
origin/master
F
featureX
HEAD
∆D
∆D + conflict resolution
+2
-1
Conflict Resolution - Rebase Change
B
A
refs/changes/32/232/1
C
D
refs/changes/32/232/2
E
master
B
A
C
local repository
remote repository
D
E
origin/master
F
featureX
HEAD
∆D
∆D + conflict resolution
F
refs/changes/32/232/3
git push origin HEAD:refs/for/master
+2
-1
Comparing Patch Sets after Rebase
Situation:
When comparing patch sets after rebase
B
A
refs/changes/32/232/1
C
E
refs/changes/32/232/2
D
master
∆C + conflict resolution or rework
∆C
master
∆D
If patch sets are compared after a rebase was done the diff includes:
Compared versions:
Diff:
Comparing Patch Sets after Rebase
The example on the left side shows the diff of a file that changed between two patch sets both by rework and by rebase:
Standard Workflow (Summary)
Situation:
B
A
B
A
local repository
remote repository
origin/master
master
Standard Workflow (Summary)
B
A
B
A
local repository
remote repository
origin/master
master
featureX
HEAD
Standard Workflow (Summary)
B
A
B
A
local repository
remote repository
origin/master
master
featureX
C
featureX
HEAD
Standard Workflow (Summary)
B
A
B
A
local repository
remote repository
origin/master
master
C
featureX
HEAD
C
refs/changes/23/123/1
Standard Workflow (Summary)
B
A
B
A
local repository
remote repository
origin/master
master
D
featureX
HEAD
C
refs/changes/23/123/1
C
featureX
Standard Workflow (Summary)
B
A
B
A
local repository
remote repository
origin/master
master
D
featureX
HEAD
C
refs/changes/23/123/2
C
D
refs/changes/23/123/1
Standard Workflow (Summary)
B
A
local repository
remote repository
master
E
refs/changes/23/123/2
C
refs/changes/23/123/1
master
D
B
A
origin/master
D
featureX
HEAD
C
Standard Workflow (Summary)
B
A
B
A
local repository
remote repository
D
featureX
HEAD
E
refs/changes/23/123/2
C
C
refs/changes/23/123/1
B
A
origin/master
D
featureX
HEAD
C
master
D
E
origin/master
Standard Workflow (Summary)
B
A
B
A
local repository
remote repository
D
E
refs/changes/23/123/2
C
C
refs/changes/23/123/1
B
A
origin/master
D
featureX
C
master
D
E
F
featureX
HEAD
featureX
HEAD
∆D
∆D + conflict resolution
Standard Workflow (Summary)
∆D + conflict resolution
B
A
B
A
local repository
remote repository
D
E
refs/changes/23/123/2
C
C
refs/changes/23/123/1
B
A
origin/master
D
C
master
D
E
F
featureX
HEAD
featureX
HEAD
∆D
F
refs/changes/23/123/3
Standard Workflow (Summary)
∆D + conflict resolution
Note that we didn’t use any local master branch. In fact a master branch in the local repository is not needed when working with Gerrit. It’s recommended to delete the local master branch to avoid any confusion with it.
B
A
B
A
local repository
remote repository
D
E
refs/changes/23/123/2
C
C
refs/changes/23/123/1
B
A
origin/master
D
C
master
D
E
F
featureX
HEAD
featureX
HEAD
∆D
F
refs/changes/23/123/3
Alternative Workflow
Same as standard workflow, but don’t create local feature branches and work with detached HEAD instead.
Working with Change Series
B
A
featureX
C
HEAD
local repository
remote repository
B
A
master
origin/master
D
It is common that features are implemented by multiple self-contained commits that are based on each other.
Situation:
E
Working with Change Series
depends on
depends on
local repository
remote repository
B
A
All commits in the featureX branch can be pushed for code review by a single git push command. For each of the pushed commits a change is created. The changes depend on each other the same way as the commits depend on each other.
C
D
master
refs/changes/36/136/1
refs/changes/35/135/1
B
A
featureX
C
HEAD
origin/master
D
E
E
refs/changes/37/137/1
Working with Change Series
depends on
depends on
local repository
remote repository
B
A
If a change in the series needs to be reworked checkout the featureX branch and use interactive rebase to rewrite the commits in the featureX branch:
git rebase -i origin/master
C
D
master
refs/changes/36/136/1
refs/changes/35/135/1
B
A
featureX
C
HEAD
origin/master
D
E
E
refs/changes/37/137/1
+2
-1
+2
Working with Change Series
Opens editor�with rewrite plan
local repository
If a change in the series needs to be reworked checkout the featureX branch and use interactive rebase to rewrite the commits in the featureX branch:
git rebase -i origin/master
B
A
featureX
C
HEAD
origin/master
D
E
git rebase -i origin/master
pick 7888debe88 C
pick 0a12290e7b D
pick deb7e4d61f E
Use edit command for commit C that needs rework
edit 7888debe88 C
pick 0a12290e7b D
pick deb7e4d61f E
Working with Change Series
Opens editor�with rewrite plan
local repository
This rewinds the featureX branch to commit C where the interactive rebase stops so that it can be edited.
B
A
featureX
C
ORIG_HEAD
origin/master
D
E
git rebase -i origin/master
pick 7888debe88 C
pick 0a12290e7b D
pick deb7e4d61f E
Use edit command for commit C that needs rework
edit 7888debe88 C
pick 0a12290e7b D
pick deb7e4d61f E
featureX
HEAD
Working with Change Series
Opens editor�with rewrite plan
local repository
This rewinds the featureX branch to commit C where the interactive rebase stops so that it can be edited:
B
A
featureX
C
ORIG_HEAD
origin/master
D
E
git rebase -i origin/master
pick 7888debe88 C
pick 0a12290e7b D
pick deb7e4d61f E
Use edit command for commit C that needs rework
edit 7888debe88 C
pick 0a12290e7b D
pick deb7e4d61f E
F
featureX
HEAD
Working with Change Series
Opens editor�with rewrite plan
local repository
This rewinds the featureX branch to commit C where the interactive rebase stops so that it can be edited:
B
A
C
ORIG_HEAD
origin/master
D
E
git rebase -i origin/master
pick 7888debe88 C
pick 0a12290e7b D
pick deb7e4d61f E
Use edit command for commit C that needs rework
edit 7888debe88 C
pick 0a12290e7b D
pick deb7e4d61f E
F
featureX
HEAD
G
H
∆D
∆E
∆D
∆E
Working with Change Series
∆D
∆E
local repository
B
A
C
ORIG_HEAD
origin/master
D
E
F
featureX
HEAD
G
H
∆D
∆E
depends on
depends on
remote repository
B
A
C
D
master
.../136/1
.../135/1
E
.../137/1
F
G
H
depends on
depends on
.../136/2
.../135/2
.../137/2
Once the rebase is done the new commits can be push for code review by a single git push command. This creates new patch sets for all 3 changes (remember that the Change-Ids in the commit messages are preserved on rebase).
-1
+2
+2
Q: What happens with the votes on the changes?
Sticky Votes
On upload of a new patch set the current votes are either removed or copied to the new patch set:
Whether a vote is copied depends on the label configuration:
Trivial Rebase
Situation:
A new patch set is considered as trivial rebase if the commit message is the same as in the previous patch set and if it has the same code delta as the previous patch set.
B
A
refs/changes/32/232/1
C
E
refs/changes/32/232/2
D
master
B
A
refs/changes/32/232/1
C
E
refs/changes/32/232/2
D
master
Trivial Rebase
No Trivial Rebase
∆C + conflict resolution or rework
∆C
∆C
∆C
master
master
Repository Configuration
B
A
master
C
2
1
refs/meta/config
Gerrit stores a configuration per repository.
This configuration contains:
Working with Topics
depends on
Situation:
B
A
C
D
master
refs/changes/36/136/1
refs/changes/35/135/1
Q: What happens on submit of the bottom change (change for commit C)?
+2
-1
Working with Topics
depends on
The bottom change can be submitted since it was approved and doesn’t depend on any non-submittable change. The top change stays open.
B
A
C
D
master
refs/changes/36/136/1
refs/changes/35/135/1
Q: Can it be enforced that both changes are only submittable together? If yes, how?
master
+2
-1
Working with Topics
Changes can be grouped by topics to enforce that they can only be submitted together. If both changes share the same topic, the topic can only be submitted when both changes are approved and submittable.
depends on
B
A
C
D
master
refs/changes/36/136/1
refs/changes/35/135/1
MyTopic
+2
-1
Hashtags
Hashtags allow to group arbitrary changes by common tags:
depends on
B
A
C
D
master
refs/changes/36/136/1
refs/changes/35/135/1
E
refs/changes/37/137/1
refactorX
refactorX
refactorX
Working with Stable Branches
If several versions of a project need to be maintained it’s a common practise to have one (central) branch for each major project version:
B
A
C
B
A
C
D
E
remote repository
v1.0
F
G
H
v2.0
master
stable-1.0
stable-2.0
Q: If a bug is discovered where should it be fixed?
release tags
Working with Stable Branches
There are 2 possibilities to do bug-fixes:
B
A
C
B
A
C
D
E
remote repository
v1.0
F
G
H
v2.0
master
stable-1.0
stable-2.0
Working with Stable Branches - Option 1
There are 2 possibilities to do bug-fixes:
B
A
C
B
A
C
D
E
remote repository
v1.0
F
G
H
v2.0
master
stable-1.0
stable-2.0
I
stable-1.0
Working with Stable Branches - Option 1
There are 2 possibilities to do bug-fixes:
B
A
C
B
A
C
D
E
remote repository
v1.0
F
G
H
v2.0
master
stable-2.0
I
stable-2.0
stable-1.0
J
Working with Stable Branches - Option 1
There are 2 possibilities to do bug-fixes:
B
A
C
B
A
C
D
E
remote repository
v1.0
F
G
H
v2.0
master
I
stable-2.0
stable-1.0
J
K
master
Working with Stable Branches - Option 2
There are 2 possibilities to do bug-fixes:
B
A
C
B
A
C
D
E
remote repository
v1.0
F
G
H
v2.0
master
stable-1.0
stable-2.0
I
master
Working with Stable Branches - Option 2
There are 2 possibilities to do bug-fixes:
B
A
C
B
A
C
D
E
remote repository
v1.0
F
G
H
v2.0
stable-1.0
stable-2.0
I
master
J
K
∆I
∆I
∆I
stable-1.0
stable-2.0
Working with Stable Branches
∆I
∆I
There are 2 possibilities to do bug-fixes:
B
A
C
B
A
C
D
E
Option 2
v1.0
F
G
H
v2.0
I
master
J
K
∆I
stable-1.0
stable-2.0
Option 1
B
A
C
B
A
C
D
E
v1.0
F
G
H
v2.0
I
stable-2.0
stable-1.0
J
K
master
Q: Why is option 1 generally preferred? When would you use option 2?
Working with Stable Branches
∆I
∆I
Option 1 is generally preferred because there is exactly one commit that implements the bug-fix (commit I). This means you can easily ask Git for all branches that contain the bug-fix:�git branch -r --contains I
Option 1 assumes that everything that is done in a stable branches should also be applied to master and newer stable branches. Note that merging into the other direction, e.g. master into stable-2.0, is bad since it would bring the features that have been implemented in master into the stable-2.0 branch.
B
A
C
B
A
C
D
E
Option 2
v1.0
F
G
H
v2.0
I
master
J
K
∆I
stable-1.0
stable-2.0
Option 1
B
A
C
B
A
C
D
E
v1.0
F
G
H
v2.0
I
stable-2.0
stable-1.0
J
K
master
Working with Stable Branches
∆I
∆I
With option 2 there are multiple commits that implement the bug-fix (commits I, J, K) but from the version graph you can’t see that they do the same modifications. However since all commits share the same Change-Id you can at least find all of them in Gerrit by searching by the Change-Id.
Option 2 is used if a bug-fix has already been done in master and only then it’s discovered that it’s also needed in a stable branch.
Option 2 is often preferred if it’s known that the affected code has changed in such a way that there will be merge conflicts when merging the bug-fix up to the master branch, since resolving conflicts in a single cherry-pick is easier than resolving conflicts during merge. It also allows to rewrite the bug-fix entirely on stable branches.
B
A
C
B
A
C
D
E
Option 2
v1.0
F
G
H
v2.0
I
master
J
K
∆I
stable-1.0
stable-2.0
Option 1
B
A
C
B
A
C
D
E
v1.0
F
G
H
v2.0
I
stable-2.0
stable-1.0
J
K
master
Review Merge Commits
Auto Merge
Situation:
Patch Set Selector:
Compared versions:
B
A
C
master
D
refs/changes/95/209995/1
E
stable-1.0
F
Auto Merge
stable-1.0
1
2
Change States
In Review�(New)
Merged
Abandoned
Deleted
submit
delete
delete
abandon
restore
open
closed
Private Changes
Changes can be marked as private.
Making Security Fixes
Using private changes for security fixes is not recommended due to the pitfalls discussed on the previous slide. Especially you don’t want the fix to become visible after submit and before you had a chance to make and publish a new release.
If a security vulnerability is discovered you normally want to have an embargo about it until fixed releases have been made available. This means you want to develop and review security fixes in private.
If your repository is public or grants broad read access it is recommended to fix security issues in a copy of your repository which has very restricted read permissions (e.g. myproject-security-fixes). You can then implement, review and submit the security fix in this repository, make and publish a new release and only then integrate the security fix back into the normal (public) repository.
Alternatively you can do the security fix in your normal repository in a branch with restricted read permissions. We don’t recommend this because there is a risk of configuring the access rights wrongly and unintentionally granting read access to the wrong people.
Thank You - Questions?
?
?
?
?
?
Go Links (for Googlers only)
TOPIC | GO LINK |
Alternative Workflow | go/gerrit-explained@alternative-workflow |
Auto Merge | go/gerrit-explained@auto-merge |
CHERRY_PICK Submit Strategy | go/gerrit-explained@cherry_pick, go/gerrit-explained@cherry-pick-strategy |
Change Ref | go/gerrit-explained@change-ref |
Change States | go/gerrit-explained@change-states |
Change-Id | go/gerrit-explained@change-id |
Change | go/gerrit-explained@change |
Code Review Benefits | go/gerrit-explained@code-review-benefits |
Comparing Patch Sets after Rebase | go/gerrit-explained@comparing-patch-sets-after-rebase |
TOPIC | GO LINK |
Comparing Patch Sets | go/gerrit-explained@comparing-patch-sets |
Conflict Resolution | go/gerrit-explained@conflict-resolution |
Gerrit Concepts | go/gerrit-explained@concepts, go/gerrit-explained@gerrit-concepts |
Gerrit | go/gerrit-explained@gerrit |
Hashtags | go/gerrit-explained@hashtags |
MERGE_ALWAYS Submit Strategy | go/gerrit-explained@merge_always, go/gerrit-explained@merge-always |
MERGE_IF_NECESSARY Submit Strategy | go/gerrit-explained@merge_if_necessary, go/gerrit-explained@merge-if-necessary |
Modern Code Review | go/gerrit-explained@modern-code-review |
Not Gerrit | go/gerrit-explained@not-gerrit |
Patch Set | go/gerrit-explained@patch-set |
Go Links (for Googlers only)
TOPIC | GO LINK |
Private Changes | go/gerrit-explained@private-changes |
Push for Code Review | go/gerrit-explained@push-for-code-review, go/gerrit-explained@refs-for |
Push for Code Review (Case 1) | go/gerrit-explained@push-for-code-review-case-1 |
Push for Code Review (Case 2) | go/gerrit-explained@push-for-code-review-case-2 |
Push for Code Review (Case 3) | go/gerrit-explained@push-for-code-review-case-3 |
Push new Patch Set | go/gerrit-explained@push-new-patch-set |
REBASE_ALWYAS Submit Strategy | go/gerrit-explained@rebase_always, go/gerrit-explained@rebase-always |
REBASE_IF_NECESSARY Submit Strategy | go/gerrit-explained@rebase_if_necessary, go/gerrit-explained@rebase-if-necessary |
TOPIC | GO LINK |
Repository Config | go/gerrit-explained@repo-config, go/gerrit-explained@repository-config, go/gerrit-explained@project-config |
Review Merge Commits | go/gerrit-explained@review-merge-commits, go/gerrit-explained@merge-commits |
Review and Vote | go/gerrit-explained@review-and-vote |
Review new Patch Set | go/gerrit-explained@review-patch-set |
Security Fixes | go/gerrit-explained@security-fixes |
Standard Workflow | go/gerrit-explained@workflow, go/gerrit-explained@standard-workflow |
Sticky Votes | go/gerrit-explained@sticky-votes, go/gerrit-explained@sticky-approvals |
Submit Strategy / Submit Type | go/gerrit-explained@submit-strategy, go/gerrit-explained@submit-type |
Go Links (for Googlers only)
TOPIC | GO LINK |
Submit | go/gerrit-explained@submit |
Trivial Rebase | go/gerrit-explained@trivial-rebase |
Voting | go/gerrit-explained@voting |
Working with Change Series | go/gerrit-explained@working-with-change-series, go/gerrit-explained@change-series, go/gerrit-explained@workflow-change-series |
Working with Stable Branches | go/gerrit-explained@working-with-stable-branches, go/gerrit-explained@stable-branches, go/gerrit-explained@workflow-stable-branches |
Working with Topic | go/gerrit-explained@working-with-topic, go/gerrit-explained@topics, go/gerrit-explained@workflow-topics |
License
This presentation is part of the Gerrit Code Review project and is published under the Apache License 2.0.