Re: is rebase the same as merging every commit?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This example you provided Matthieu is exactly my confusion with rebase..

If I want to bring a 'broken feature-a' branch into my topic branch to build on
it, one commit of which is this:

> +	int * x = malloc(sizeof(char));

if I merge, my tree looks like:

:         /<--G<--H<--Qj jeske/topic1
:        /           /
:       /<--P<------Q    feature-a
:      /
: -----A<---B<---C master

or if I rebase, it looks like:

:                  /<--G'<--H' jeske/topic1
:                 /
:       /<--P<---Q    feature-a
:      /
: -----A<---B<---C master

-----

..and then through 'fixing' the patch, it ends up rebased and accepted onto the
mainline origin/master, as a single patch, which (among other things) changed
this line to:

> +	int * x = malloc(sizeof(int));

...if I merged above, it will look like,

:         /<--G<--H<--Qj jeske/topic1
:        /           /
:       /<--P<------Q    feature-a
:      /
: -----A<---B<---C<---Q' master

...if I rebased above, it will look like:

:                  /<--G'<--H' jeske/topic1
:                 /
:       /<--P<---Q    feature-a
:      /
: -----A<---B<---C<---Q' master


However, in both cases, because Q' is not connected to Q, I don't see how git
will do anything sane to help me accept Q' correctly.

If I rebased my merge-q-branch against the master, I would expect to get this
(which will cause a conflict I have to resolve):

:           /<--G<--H<--Qj jeske/topic1
:          /
: <--C<---Q' master

If I rebased my rebase-q-branch against master, I would expect to get this
(which will cause a conflict I have to resolve):

:                     /<--G'<--H' jeske/topic1
:                    /
:          /<--P<---Q    feature-a
:         /
: --C<---Q' master

However, if that Q' rebase contained a link back to (P,Q), it would know that
the Q' rebase was replacing (P,Q), and would know to back them out of my tree
when I rebased back onto the head, producing this in BOTH cases above (whether
I rebased or merged from the feature-a branch):


:          /<--G'<--H' jeske/topic1
:         /
: --C<---Q' master

This operation above of "working will pulling uncompleted patches into my tree"
seems like a fairly common thing for developers. I've never provided any
patches to linux-kernel, but when I did try hacking on it years ago, I was
doing exactly this. (pulling unaccepted patches into my kernel, then building
on those patches). When I read about the DAG and its universal naming, I always
assumed that the above workflow was what it was DESIGNED to make automatic. I'm
confused, how does this work in git?



-- Matthieu Moy wrote:
> Well, look at the [PATCH] messages on this list, and how they evolve.
> Patch series give a clean way to go from a point to another. That's
> what you want to see in upstream history.
>
> Then, patch series usually get reviewed, and the patches themselves
> are modified. There's a kind of meta-history: the changes you make to
> your own changes.
>
> Suppose I send a patch containing
>
> +	int * x = malloc(sizeof(char));
>
> and someone notices how wrong it is. I send another patch with
>
> +	int * x = malloc(sizeof(int));
>
> The first version was basicaly a mistake, and if it hasn't been
> released, no one want to bother with it longer that the time to resend
> the patch. No one want to be hit by the bug while using bisect later
> on the upstream repository. And no one wants to see both patches when
> reviewing or "git blame"-ing.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux