- From: James Graham <james@hoppipolla.co.uk>
- Date: Wed, 21 Aug 2013 16:39:27 +0100
- To: "public-test-infra@w3.org" <public-test-infra@w3.org>
I just made a mistake merging PR 262 [1]. There is nothing wrong with
the tests that have been submitted; they have been reviewed and fixes
made. However the history on the branch is confusing and the merge ended
up pulling in different versions of a bunch of commits that are already
on mainline. This isn't really trivial to undo so, since I think it is
harmless in this case, I will leave it. However we should prevent this
happening again, which means that test authors need to know what to do
with their branches and mergers need to know to look out for the problem.
My best guess for what happened in this case is that, at some point, the
author rebased master on top of their branch so that a history like
-C - A1 - A2
\
- B1 - B2
ended up like
-C - A1 - A2
\
- B1 - B2 -A1' -A2'
Then when you merge you get both A1 and A1' in the history (and
similarly for A2).
So the first rule is to never rebase any other branch on top of your
branch, unless you want the commits in the other branch to become part
of your review. In particular it is never right to rebase master on top
of your branch.
In general, the simplest rule to follow is "don't merge or rebasing on
your branch *at all*, unless you *know* that there is a conflict between
your work and master".
The above rule should be read to include "rebases" that only rewrite the
branch history but don't actually change the base of the branch. There
seems to be an unfortunate tendency amongst github users to use git
commit --amend to continually rewrite their pull request in such a way
as to only have a single commit on the branch at all times. This is bad
because, as always with a branch that you have pushed, you don't know
who else has pulled that branch and is working on it. In particular
critic pulls all our PR branches and, although I might be able to fix it
to deal with rebases automatically (there is currently a button that
needs to be pushed manually), it makes the reviews ugly and hard to
understand as all commits end up as "equivalent merge commits". It also
makes the github review tools even more useless since you have to
restart the review from scratch each time.
In the case where you know there is a conflict between your branch and
master, there are two options for dealing with it. Option 1) is to merge
master into your branch. This is straightforward (I think, I haven't
actually ever done this, as far as I recall), but makes the history even
more confused than it already is. Option 2) is to rebase your branch on
master (note that this is the opposite way around to the problematic
situation above). This is nice, because it makes the history better, but
is a little more effort. In particular, it is very helpful for critic if
you can push the branch as soon as you do the rebase so that it can tell
the difference between the history change due to merge conflicts and the
history change due to additional commits to the branch.
The one other situation where rebasing is acceptable is after your
review is done, in order to clean up the branch history. Lots of commits
of the form "fixup! remove trailing whitespace" don't add any value, but
do add lots of noise. So doing an in-place rewrite to squash a branch
down into a few logically separate commits is fine. Of course you need
to ensure that no one merges your branch before you do this.
Can we ensure that the essential points here are in the documentation
somewhere prominent? We should have advice both for test authors, and
for reviews to look out for bad history before merging.
(a final aside: I think that the github UI encourages bad style in
repository history. If we weren't constrained by that, I would strongly
advocate using rebases, not merges, to integrate branches with master.
This would have the significant advantage that the history of master
would be linear and therefore easy to follow. In particular I would
suggest a workflow of
(branch) ->- (commit) ->- (get review) ->- (squash) ->- (rebase on
\--------------<-------------/ master)
However since github has a big green "merge" button and no "interactive
rebase onto master" button, that isn't easy to enforce. This makes me
grumpy.)
[1] https://github.com/w3c/web-platform-tests/pull/262
Received on Wednesday, 21 August 2013 15:39:54 UTC