Re: is rebase the same as merging every commit?
- From
しらいしななこ <nanako3@lavabit.com>
- Date
- Jun 27, 2008, 10:33 UTC
- Message-ID
- <20080627193328.6117@nanako3.lavabit.com>
- In-Reply-To
- <7vzlp7n1j4.fsf@gitster.siamese.dyndns.org>
Quoting Junio C Hamano <gitster@pobox.com>:
Show 19 quoted lines
> "David Jeske" <jeske@willowmail.com> writes: > >> If I understand it right (and that's a BIG if), it's the same as doing a merge >> of C into G where every individual commit in the C-line is individually >> committed into the new C' line. >> >> ...........-------------A---B---C >> ........../ / / / >> ........./ /---A'--B'--C' topic >> ......../ / >> ....D---E---F---G - master >> >> >> (1) Is the above model a valid explanation? > > I would presume that the resulting trees A' in the second picture and in > the first picture would be the same, so are B' and C'. But that is only > true when commits between A and C do not have any duplicate with the > development that happened between E and G.
Sorry, but I think you are wrong, Junio.
Rebase can be used to backport changes, not just porting your changes forward, using --onto option:
..........maint ............1-------A'--B'--C' .........../ . . . <-- ??? ........../.......A---B---C ........./......./ ......../......./ .......0--...--D---E---F---G - master
Here, A, B, C that are based on D (that is way ahead of the top of the maintenance branch 1) is rebased to the maintenance branch.
But in this case, A' is *not* a merge between 1 and A. For A' to be a merge between 1 and A, it *must* contain all the development that happened up to 1 and all the development that happened up to A since these two branches were forked (that is 0 in the above picture).
Instead, the difference to go from 1 to A' is similar to the difference to go from D to A. It does not and must not include anything that happened between 0 and D. That is not a merge.
I agree that your explanation why A is not recorded as a parent of A' is right for the philosophical reason (the purpose of rebasing to create A' is so that you do not have to record them). But from the point-of-view of correctness of commit history, I think A must not be recorded as a parent of A', either.
-- Nanako Shiraishi http://ivory.ap.teacup.com/nanako3/