Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Unified Diff: README.git-cl.md

Issue 2232303002: Overhaul the README files a bit. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Use better example Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« README.gclient.md ('K') | « README.gclient.md ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: README.git-cl.md
diff --git a/README.git-cl.md b/README.git-cl.md
new file mode 100644
index 0000000000000000000000000000000000000000..54e59734fc8c450f9e7dd832a35b80a77f88052f
--- /dev/null
+++ b/README.git-cl.md
@@ -0,0 +1,99 @@
+# git-cl
+
+The git-cl README describes the git-cl command set. This document describes how
+code review and git work together in general, intended for people familiar with
+git but unfamiliar with the code review process supported by Rietveld and
+Gerrit.
+
+
+## Reitveld concepts and terms
+
+A Rietveld review is for discussion of a single change or patch. You upload a
+proposed change, the reviewer comments on your change, and then you can upload a
+revised version of your change. Rietveld stores the history of uploaded patches
+as well as the comments, and can compute diffs in between these patches. The
+history of a patch is very much like a small branch in git, but since Rietveld
+is VCS-agnostic the concepts don't map perfectly. The identifier for a single
+review+patches+comments in Rietveld is called an `issue`.
+
+Rietveld provides a basic uploader that understands git. This program is used by
+git-cl, and is included in the git-cl repo as upload.py.
+
+
+## Basic interaction with git
+
+The fundamental problem you encounter when you try to mix git and code review is
+that with git it's nice to commit code locally, while during a code review
+you're often requested to change something about your code. There are a few
+different ways you can handle this workflow with git:
+
+1. Rewriting a single commit. Say the origin commit is O, and you commit your
+ initial work in a commit A, making your history like O--A. After review
+ comments, you commit --amend, effectively erasing A and making a new commit
+ A', so history is now O--A'. (Equivalently, you can use git reset --soft or
+ git rebase -i.)
+2. Writing follow-up commits. Initial work is again in A, and after review
+ comments, you write a new commit B so your history looks like O--A--B. When
+ you upload the revised patch, you upload the diff of O..B, not A..B; you
+ always upload the full diff of what you're proposing to change.
+
+The Rietveld patch uploader just takes arguments to `git diff`, so either of the
+above workflows work fine. If all you want to do is upload a patch, you can use
+the upload.py provided by Rietveld with arguments like this:
+
+ upload.py --server server.com <args to "git diff">
+
+The first time you upload, it creates a new issue; for follow-ups on the same
+issue, you need to provide the issue number:
+
+ upload.py --server server.com --issue 1234 <args to "git diff">
+
+
+## git-cl to the rescue
+
+git-cl simplifies the above in the following ways:
+
+1. `git cl config` puts a persistent --server setting in your .git/config.
+2. The first time you upload an issue, the issue number is associated with the
+ current *branch*. If you upload again, it will upload on the same issue.
+ (Note that this association is tied to a branch, not a commit, which means
+ you need a separate branch per review.)
+3. If your branch is _tracking_ (in the `git checkout --track` sense) another
+ one (like origin/master), calls to `git cl upload` will diff against that
+ branch by default. (You can still pass arguments to `git diff` on the
+ command line, if necessary.)
+
+In the common case, this means that calling simply `git cl upload` will always
+upload the correct diff to the correct place.
+
+
+## Patch series
+
+The above is all you need to know for working on a single patch.
+
+Things get much more complicated when you have a series of commits that you want
+to get reviewed. Say your history looks like O--A--B--C. If you want to upload
+that as a single review, everything works just as above.
+
+But what if you upload each of A, B, and C as separate reviews? What if you
+then need to change A?
+
+1. One option is rewriting history: write a new commit A', then use git rebase
+ -i to insert that diff in as O--A--A'--B--C as well as squash it. This is
+ sometimes not possible if B and C have touched some lines affected by A'.
+2. Another option, and the one espoused by software like topgit, is for you to
+ have separate branches for A, B, and C, and after writing A' you merge it
+ into each of those branches. (topgit automates this merging process.) This
+ is also what is recommended by git-cl, which likes having different branch
+ identifiers to hang the issue number off of. Your history ends up looking
+ like:
+
+ O---A---B---C
+ \ \ \
+ A'--B'--C'
+
+ Which is ugly, but it accurately tracks the real history of your work, can be
+ thrown away at the end by committing A+A' as a single `squash` commit.
+
+In practice, this comes up pretty rarely. Suggestions for better workflows are
+welcome.
« README.gclient.md ('K') | « README.gclient.md ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698