git-codereview: diagnose local tracking branch ahead of remote

Otherwise the git change error is a bit confusing.

Change-Id: I8bacac175417231284a238a078e5ea9513866943
Reviewed-on: https://go-review.googlesource.com/2786
Reviewed-by: Andrew Gerrand <adg@golang.org>
diff --git a/git-codereview/change.go b/git-codereview/change.go
index 1741b4f..2a66533 100644
--- a/git-codereview/change.go
+++ b/git-codereview/change.go
@@ -142,6 +142,9 @@
 	// Otherwise, inherit HEAD and upstream from the current branch.
 	b := CurrentBranch()
 	if b.HasPendingCommit() {
+		if !b.IsLocalOnly() {
+			dief("bad repo state: branch %s is ahead of origin/%s", b.Name, b.Name)
+		}
 		dief("cannot branch from work branch; change back to %v first.", strings.TrimPrefix(b.OriginBranch(), "origin/"))
 	}
 
diff --git a/git-codereview/change_test.go b/git-codereview/change_test.go
index daf06e3..524c021 100644
--- a/git-codereview/change_test.go
+++ b/git-codereview/change_test.go
@@ -44,6 +44,19 @@
 	testPrintedStderr(t, "invalid branch name \"HeAd\": ref name HEAD is reserved for git")
 }
 
+func TestChangeAhead(t *testing.T) {
+	gt := newGitTest(t)
+	defer gt.done()
+
+	// commit to master (mistake)
+	write(t, gt.client+"/file", "new content")
+	trun(t, gt.client, "git", "add", "file")
+	trun(t, gt.client, "git", "commit", "-m", "msg")
+
+	testMainDied(t, "change", "work")
+	testPrintedStderr(t, "bad repo state: branch master is ahead of origin/master")
+}
+
 func TestMessageRE(t *testing.T) {
 	for _, c := range []struct {
 		in   string