Am 12.07.2015 um 00:17 schrieb Jason Moore:
FYI: We had a discussion at SymPy on how to synchronize with master and
decided that we no longer want to allow or encourage rebasing after a pull
request is made to the main SymPy repo.
I think that's overstated.
I see some reasons against merging:
A) A history with merges is harder to read. You need to track multiple
parallel developments, and that's particularly hard if merge conflicts
were resolved (because some of the code you see didn't get into master,
at least not in the form it's committed initially).
B) The results from `git bisect` become harder to read if a bug stems
from the combination of two changes that were made in parallel branches:
the bisect will point at the merge commit, but the actual problem
happened in some earlier commit.
The more parallel branches in existence, the more prominent this will
become.
The main reason is that we stall too many new contributors by forcing them
to do too much git kung fu.
This problem can be mitigated via interactive rebasing, but I agree it's
an extra hoop to jump through and cannot be asked of everyone.
> But there are additional important reasons too:
- Once a pull request is "public" the history should not change because
other people may have pull it.
Does anybody ever pull from a pull request?
I can see that happening when collaborating on a fix, but it's not
something affecting newbies.
- Rebasing with merge conflicts is much more difficult
Only if you try to rebase everything in a single go. You may end up
resolving the same conflict over and over for each commit, and that can
get confusing very quickly, and it's also annoying and a lot of needless
work.
However, there is a process that's actually quite easy:
1) `git rebase --interactive` first; this is a rebase *within your
working branch*.
I also squash commits that were a continuation of previous work. I.e. if
I have a sequence of 1.code - 2.reformat - 3.code - 4.bugfix -
5.reformat - 6.code - 7.bugfix - 8.reformat, I like to rearrange this to
1.code - 3.code - 4. bugfix - 6.code - 7.bugfix - 5.reformat -
7.reformat, and then I squash this into two commits, one with 13467 for
the coding and 57 for reformatting.
If this still is confusing, this can be broken down into a series of
primitive steps: (a) swap two commits, leaving all others alone, (b)
merge two adjacent commits, leaving all others alone; repeat until the
history is rewritten in a way that's easy to read and review.
2) `git fetch master && git rebase master`. This will expose the merge
conflicts, but now it's far less commits, and it's also giving you much
less pain because most conflicts will apply just in one commit.
- Reviewers are no longer able to see commit by commit changes in a review
process.
Only if you squash everything into a single commit.
Reordering and squashing commits makes sense if some work jumped between
multiple things, such as reformatting, fixing docstrings, and actual
code changes (and if the code changes touched multiple loosely-related
points, it may make sense to keep these in separate commits anyway).
- Github does not manage the diffs in a PR review if a rebase happens.
You mean the "click here to see outdated diffs" thing?
Sure, part of the discussion are removed one more click, which means
that people won't know to look there and usually won't find them.
However, if a discussion is relevant for posteriority, it should have
been merged into the commit in some way, either into the commit comment
or in a code comment or docstring. After all, people who're looking at
`git annotate` or `git log` aren't going to see these discussions either.
If you want to rebase then you should do it before you make a pull request,
either locally or on your fork's branch.
Oh, now I see what's the concern - indeed, rebasing on the main repo is
bad, very bad, and a real no-go. But that's a non-issue!
For pull requests, they're on separate branches, and people don't work
on the PR branch of anybody else (unless they explicitly have agreed to
cooperate in that way, in which case the work branch should indeed not
be rebased anymore unless all downstream collaborators agree).
Newbies don't even have the permissions to modify the main repo.
The one point where I see strong language against rebasing justified is
when merging into master on the main repo. This is merge, and merge
only, and should be written in bold letters into the project maintenance
guidelines.
For people who contribute pull requests, I do not think that applies.
YMMV, but I'd be interested to hear why.
Regards,
Jo
--
You received this message because you are subscribed to the Google Groups
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy.
To view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/55A22B0B.20405%40durchholz.org.
For more options, visit https://groups.google.com/d/optout.