1*3f982cf4SFabien Sanglard# Advanced Gerrit Usage 2*3f982cf4SFabien Sanglard 3*3f982cf4SFabien SanglardThis file gives some examples of Gerrit workflows. This includes uploading 4*3f982cf4SFabien Sanglardpatches with Gerrit, using Gerrit dependency chains, and managing local git 5*3f982cf4SFabien Sanglardhistory. 6*3f982cf4SFabien Sanglard 7*3f982cf4SFabien Sanglard## Managing patches with Gerrit 8*3f982cf4SFabien Sanglard 9*3f982cf4SFabien SanglardThe instructions in [README.md](README.md) using `git cl upload` are preferred 10*3f982cf4SFabien Sanglardfor patch management. However, you can interact manually with the Gerrit code 11*3f982cf4SFabien Sanglardreview system via `git` if you prefer as follows. 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard### Preliminaries 14*3f982cf4SFabien Sanglard 15*3f982cf4SFabien SanglardYou should install the 16*3f982cf4SFabien Sanglard[Change-Id commit-msg hook](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.7/cmd-hook-commit-msg.html). 17*3f982cf4SFabien SanglardThis adds a `Change-Id` line to each commit message locally, which Gerrit uses 18*3f982cf4SFabien Sanglardto track changes. Once installed, this can be toggled with `git config 19*3f982cf4SFabien Sanglardgerrit.createChangeId <true|false>`. 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien SanglardTo download the commit-msg hook for the Open Screen repository, use the 22*3f982cf4SFabien Sanglardfollowing command: 23*3f982cf4SFabien Sanglard 24*3f982cf4SFabien Sanglard```bash 25*3f982cf4SFabien Sanglard curl -Lo .git/hooks/commit-msg https://chromium-review.googlesource.com/tools/hooks/commit-msg 26*3f982cf4SFabien Sanglard chmod a+x .git/hooks/commit-msg 27*3f982cf4SFabien Sanglard``` 28*3f982cf4SFabien Sanglard 29*3f982cf4SFabien Sanglard### Uploading a new patch for review 30*3f982cf4SFabien Sanglard 31*3f982cf4SFabien SanglardYou should run `git cl presubmit --upload` in the root of the repository before pushing for 32*3f982cf4SFabien Sanglardreview (which primarily checks formatting). 33*3f982cf4SFabien Sanglard 34*3f982cf4SFabien SanglardAfter verifying that presubmission works correctly, you can then execute: 35*3f982cf4SFabien Sanglard`git cl upload`, which will prompt you to verify the commit message and check 36*3f982cf4SFabien Sanglardfor owners. 37*3f982cf4SFabien Sanglard 38*3f982cf4SFabien SanglardThe first time you upload an issue, the issue number is associated with the 39*3f982cf4SFabien Sanglardcurrent branch. If you upload again, it uploads on the same issue (which is tied 40*3f982cf4SFabien Sanglardto the branch, not the commit). See the [git-cl](https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/HEAD/README.git-cl.md) documentation for more information. 41*3f982cf4SFabien Sanglard 42*3f982cf4SFabien Sanglard## Uploading a new dependent change 43*3f982cf4SFabien Sanglard 44*3f982cf4SFabien SanglardIf you wish to work on multiple related changes without waiting for them to 45*3f982cf4SFabien Sanglardland, you can do so in Gerrit using dependent changes. There doesn't appear to 46*3f982cf4SFabien Sanglardbe any official documentation for this, but the rule seems to be: if the parent 47*3f982cf4SFabien Sanglardof the commit you are pushing has a Change-Id line, that change will also be the 48*3f982cf4SFabien Sanglardcurrent change's parent. This is useful so you can look at only the relative 49*3f982cf4SFabien Sanglarddiff between changes instead of looking at all of them relative to master. 50*3f982cf4SFabien Sanglard 51*3f982cf4SFabien SanglardTo put this into an example, let's say you have a commit for feature A with 52*3f982cf4SFabien SanglardChange-Id: aaa and this is in the process of being reviewed on Gerrit. Now 53*3f982cf4SFabien Sanglardlet's say you want to start more work based on it before it lands on master. 54*3f982cf4SFabien Sanglard 55*3f982cf4SFabien Sanglard``` bash 56*3f982cf4SFabien Sanglard git checkout featureA 57*3f982cf4SFabien Sanglard git checkout -b featureB 58*3f982cf4SFabien Sanglard git branch --set-upstream-to featureA 59*3f982cf4SFabien Sanglard # ... edit some files 60*3f982cf4SFabien Sanglard # ... git add ... 61*3f982cf4SFabien Sanglard git commit 62*3f982cf4SFabien Sanglard``` 63*3f982cf4SFabien Sanglard 64*3f982cf4SFabien SanglardThe git history then looks something like this: 65*3f982cf4SFabien Sanglard 66*3f982cf4SFabien Sanglard``` 67*3f982cf4SFabien Sanglard ... ---- master 68*3f982cf4SFabien Sanglard \ 69*3f982cf4SFabien Sanglard A 70*3f982cf4SFabien Sanglard \ 71*3f982cf4SFabien Sanglard B <- HEAD 72*3f982cf4SFabien Sanglard``` 73*3f982cf4SFabien Sanglard 74*3f982cf4SFabien Sanglardand `git log` might show: 75*3f982cf4SFabien Sanglard 76*3f982cf4SFabien Sanglard``` 77*3f982cf4SFabien Sanglardcommit 47525d663586ba09f40e29fb5da1d23e496e0798 (HEAD -> featureB) 78*3f982cf4SFabien SanglardAuthor: btolsch <[email protected]> 79*3f982cf4SFabien SanglardDate: Fri Mar 23 10:18:01 2018 -0700 80*3f982cf4SFabien Sanglard 81*3f982cf4SFabien Sanglard Add some better things 82*3f982cf4SFabien Sanglard 83*3f982cf4SFabien Sanglardcommit 167a541e0a2bd3de4710965193213aa1d912f050 (featureA) 84*3f982cf4SFabien SanglardAuthor: btolsch <[email protected]> 85*3f982cf4SFabien SanglardDate: Thu Mar 22 13:18:09 2018 -0700 86*3f982cf4SFabien Sanglard 87*3f982cf4SFabien Sanglard Add some good things 88*3f982cf4SFabien Sanglard 89*3f982cf4SFabien Sanglard Change-Id: aaa 90*3f982cf4SFabien Sanglard``` 91*3f982cf4SFabien Sanglard 92*3f982cf4SFabien SanglardNow you can push B to create a new change for it in Gerrit: 93*3f982cf4SFabien Sanglard 94*3f982cf4SFabien Sanglard``` bash 95*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master 96*3f982cf4SFabien Sanglard``` 97*3f982cf4SFabien Sanglard 98*3f982cf4SFabien SanglardIn Gerrit, there would then be a "relation chain" shown where the feature A 99*3f982cf4SFabien Sanglardchange is the parent of the feature B change. If A introduces a new file which 100*3f982cf4SFabien SanglardB changes, the review for B will only show the diff from A. 101*3f982cf4SFabien Sanglard 102*3f982cf4SFabien Sanglard## Examples for maintaining local git history 103*3f982cf4SFabien Sanglard 104*3f982cf4SFabien Sanglard``` 105*3f982cf4SFabien Sanglard D-E --- feature B 106*3f982cf4SFabien Sanglard / ^N 107*3f982cf4SFabien Sanglard A-B-C-F-G-H --- feature A 108*3f982cf4SFabien Sanglard / ^M ^O 109*3f982cf4SFabien Sanglard / 110*3f982cf4SFabien Sanglard ... ---- master 111*3f982cf4SFabien Sanglard /| 112*3f982cf4SFabien Sanglard M O 113*3f982cf4SFabien Sanglard | 114*3f982cf4SFabien Sanglard N 115*3f982cf4SFabien Sanglard``` 116*3f982cf4SFabien Sanglard 117*3f982cf4SFabien SanglardConsider a local repo with a master branch and two feature branches. Commits M, 118*3f982cf4SFabien SanglardN, and O are squash commits that were pushed to Gerrit. The arrow/caret (`^`) 119*3f982cf4SFabien Sanglardindicates whence those were created. M, N, and O should all have Change-Id 120*3f982cf4SFabien Sanglardlines in them (this can be done with the [commit-msg 121*3f982cf4SFabien Sanglardhook](https://gerrit-documentation.storage.googleapis.com/Documentation/2.14.7/cmd-hook-commit-msg.html)). 122*3f982cf4SFabien SanglardM and O are separate patchsets in one review (M containing A, B, C and O 123*3f982cf4SFabien Sanglardcontaining A, B, C, F, G) and N is the first patchset in a new review that is 124*3f982cf4SFabien Sanglarddependent on the first patchset of the first review. 125*3f982cf4SFabien Sanglard 126*3f982cf4SFabien SanglardStarting without M, N, or O, the commands to create them are as follows: 127*3f982cf4SFabien Sanglard 128*3f982cf4SFabien Sanglard``` bash 129*3f982cf4SFabien Sanglardgit checkout C 130*3f982cf4SFabien Sanglardgit checkout -b M 131*3f982cf4SFabien Sanglardgit rebase -i origin/master # squash commits 132*3f982cf4SFabien Sanglard# Note: make sure a Change-Id line exists on M at this point since N will need 133*3f982cf4SFabien Sanglard# it. You can git commit --amend with the commit-msg hook active or add it via 134*3f982cf4SFabien Sanglard# git commit --amend after pushing. Don't git commit --amend after creating N 135*3f982cf4SFabien Sanglard# though. 136*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master 137*3f982cf4SFabien Sanglardgit checkout E 138*3f982cf4SFabien Sanglardgit checkout -b N 139*3f982cf4SFabien Sanglardgit rebase -i C --onto M # squash commits 140*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master 141*3f982cf4SFabien Sanglardgit checkout G 142*3f982cf4SFabien Sanglardgit checkout -b O 143*3f982cf4SFabien Sanglardgit rebase -i origin/master # squash commits and copy the Change-Id line from M 144*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master 145*3f982cf4SFabien Sanglard``` 146*3f982cf4SFabien Sanglard 147*3f982cf4SFabien Sanglard``` 148*3f982cf4SFabien Sanglard D-E --- feature B 149*3f982cf4SFabien Sanglard / ^Q 150*3f982cf4SFabien Sanglard A-B-C-F-G-H --- feature A 151*3f982cf4SFabien Sanglard / ^P 152*3f982cf4SFabien Sanglard / 153*3f982cf4SFabien Sanglard ... ---- master 154*3f982cf4SFabien Sanglard /|\ 155*3f982cf4SFabien Sanglard M O P 156*3f982cf4SFabien Sanglard | | 157*3f982cf4SFabien Sanglard N Q 158*3f982cf4SFabien Sanglard``` 159*3f982cf4SFabien Sanglard 160*3f982cf4SFabien SanglardThe next example shows an additional patchset being uploaded for feature A 161*3f982cf4SFabien Sanglard(commit P) and feature B being rebased onto A, then uploaded to Gerrit as commit 162*3f982cf4SFabien SanglardQ. 163*3f982cf4SFabien Sanglard 164*3f982cf4SFabien SanglardStarting from the endpoint of the previous commands, this point can be reached 165*3f982cf4SFabien Sanglardas follows: 166*3f982cf4SFabien Sanglard 167*3f982cf4SFabien Sanglard``` bash 168*3f982cf4SFabien Sanglardgit checkout H 169*3f982cf4SFabien Sanglardgit checkout -b P 170*3f982cf4SFabien Sanglardgit rebase -i origin/master # squash commits, same note as M about Change-Id 171*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master 172*3f982cf4SFabien Sanglardgit checkout featureB # E 173*3f982cf4SFabien Sanglardgit rebase # assume featureA is set as featureB's upstream branch 174*3f982cf4SFabien Sanglardgit checkout -b Q 175*3f982cf4SFabien Sanglardgit rebase -i H --onto P 176*3f982cf4SFabien Sanglardgit push origin HEAD:refs/for/master 177*3f982cf4SFabien Sanglard``` 178