Re: [PATCH] Fix rebase -p --onto
- From
Johannes Sixt <j.sixt@viscovery.net>
- Date
- Jul 17, 2009, 08:40 UTC
- Message-ID
- <4A6038E8.1090402@viscovery.net>
- In-Reply-To
- <7vk52767el.fsf@alter.siamese.dyndns.org>
Junio C Hamano schrieb:
Show 57 quoted lines
> Johannes Sixt <j.sixt@viscovery.net> writes: > >> Greg Price schrieb: >>> In a rebase with --onto, the correct test for whether we can skip >>> rewriting a commit is if it is already on top of $ONTO, not $UPSTREAM. >>> Without --onto, this distinction does not exist and the behavior does >>> not change. >>> >>> >>> In the situation >>> >>> X---o---o---o---M >>> \ / >>> x---x---x---x >>> >>> Y >>> ... >>> The command `git rebase -p --onto Y X M` moves only the >>> first-parent chain, like so: >>> >>> X >>> \ >>> x---x---x---x >>> \ >>> Y---o'--o'--o'--M' >>> >>> because it mistakenly drops the other branch(es) x---x---x---x from >>> the TODO file. This tests and fixes this behavior. >> I think the current behavior is by design. There is nothing to fix. >> >> The purpose of rebase -p is to leave non-first children alone and rebase >> only the first child parenthood chain. It is not the purpose to reseat an >> entire history DAG. > > Hmm, if the original history were > > .---X---o---o---o---M > \ / > x---x---x---x---x > > Y > > and the rebase is about moving history leading to M since X on top of Y, > I would actually have agreed that this > > .---X---o---o---o---M > \ / > x---x---x---x---x > \ > Y---o'--o'--o'--M' > > would be the right thing to do (IOW, I would agree with you). > > Can the current code distinguish the two cases? More generally, can we > always tell these two cases apart, or is it fundamentally not possible to > differentiate the two cases and we should simplify the problem space by > limiting ourselves by treating the first parent in a special way?
I have used rebase -i -p in the past to rewrite history that involves merges of topic branches like this:
---------Y--M--M--F <-- master
/ /
----a--a--a /
/
--b--b--b--bwhere F is a fixup that I want to insert between Y and M, and I thought rebase -i -p was intended for this use-case.
With this in mind, I do not see why should we distinguish the cases. I would even go so far to say that this is OK:
X---a---o---o---M X---a
\ / ===> \
x---x---x x---x---x
\
Y Y---a'--o'--o'--M'