On Sat, Mar 2, 2013 at 2:22 AM, James Hogan <james.ho...@imgtec.com> wrote:
>
> Okay, I've rebased the arch/metag tree onto mainline to make all the
> back-merges unnecessary and applied those simple fixes into "Build
> infrastructure" and "Various other headers" commits (additionally
> trivially removing ARCH_NO_VIRT_TO_BUS which is also now unnecessary).

No, this is *exactly* the wrong thing to do.

You have now based all the new metag stuff on some random potentially
completely broken commit in the middle of a merge window. Which is
exactly what I don't ever want to see, and which is one (of several)
reasons I also absolutely do not want to see back-merges - not to
"next" trees, and not to my "random commit of the day" tree.

Basically, I do not want peoples development trees to worry about some
random crazy merge-window tree of the day. You should always pick a
good starting point that makes sense (where "makes sense" is very much
about "it's stable and well known" and just do  your own thing. What
other people do should simply not concern you over-much. You are the
architecture maintainer, and your job is not integration, it's to make
sure that *your* work is as stable and unsurprising as possible.

Then, when you ask me to pull something that is stable, works, and has
been tested, THEN AND ONLY THEN do we start worrying about merge
issues. And in particular, you do not handle those merge issues
yourself, although it can be very helpful if you look into them and
describe the issues to me, and maybe you can even do an *example*
merge (which I won't actually use).

Why do I not want you making merges? Let me count the ways:

 - I'm usually a day or two behind in my merge queue anyway, partly
because I get tons of pull requests in a short while and I just want
to get a feel for what's going on, and partly because I tend to do
pulls in waves of "ok, I'm going filesystems now, then I'll look at
drivers".

 - I do a *lot* of merges. I try to make them look good, and have
*explanations* in them. And if a merge conflict happens, I want to
know about them.

 - I want to have a gut feel about what goes into the tree when. I
know, for example, that "oops, we had a bug in ext4 that got
discovered only after the merge, and for a while there it didn't work
well with larger disks". When people complain, my job is often to have
that high-level view of "ok, you're hitting this known bug". If people
do back-merges, that basically pulls in my tree at some random point
that I'm not even aware of, and now you mixed up *other* peoples bugs
into your tree.

 - and somewhat most importantly (for me personally): backmerges make
history messy, and it can be a huge pain for me when I do merge
conflict resolution, or when other people do bisects etc. It's *much*
nicer in many ways (visually, and for bisect reasons) to try to have
as much independent development as possible.

Now, rebasing fixes some of this. It fixes the *visual* messiness of
the history, and it does keep the commits together. That helps at one
level. But bisection on top of random points doesn't solve the other
problems: you've now messed up your history with random development
history of other people, and your new commits - instead of being on
top of some stable version that we hopefully know the bugs for - will
now be somewhere in the middle of the whole development mess, so if
people start bisecting something completely independent, it's all
right there in the middle.

Rebasing has other deeper problems too, like the fact that your tree
is no longer something that other people can depend on. That's not a
big issue for a new architecture, but it's a big issue going forward.
Which is why rebasing is generally even *worse* than back-merges (but
both are basically big "just don't do that").

So the rule for both rebasing and back-merging should be:

 - you should have damn good reasons for it, and you should document them

 - you should basically *never* rebase or back-merge random commits in
the merge window. That's *NEVER* a good idea. If you have a conflict,
ignore it. Explain it to me when you ask me to pull, but it is *my*
job to know "ok, I've pulled fiftynine different trees, and trees X
and Y end up conflicting, and this is how it got resolved". Seriously.

 - if you have some really long-lived development tree, and you want
to back-merge just to not be *too* far away, back-merge to actual
releases. Don't pull my master branch. Say "git merge v3.8" or
something like that, and then you write a good merge message that
talks about *why* you wanted to update to a new release.

See why I hate rebasing and back-merges so much?

Right now, I think your best option is to rebase just your own commits
on top of v3.8, and then ask me to pull the result, with explanations
of what the conflicts will be. And while I much prefer explanations
(and also a general over-view, just so that I can put it in the commit
message), I actually even prefer unexplained merge conflicts that I
have to resolve over the "I did a back-merge at some random point
because I was trying to be helpful, or because I wanted to use a new
and untested feature that isn't even in a release kernel yet".

And yes, there are always exceptions. I do end up taking back-merges,
and rebasing does happen, and I dislike it, but I try to not have
black-and-white rules either. Sometimes it needs to be done.

But I do *not* take new trees that do bad things. If I take a new
architecture, I want to feel like I'm not just getting the
architecture, but I'm also getting a maintainer that knows about
keeping his history clean and not mixing with the independent work
other people did, or messing up other people by rebasing public
commits etc.

               Linus
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to