From: Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>,
git@vger.kernel.org, santi@agolina.net,
Thomas Rast <trast@student.ethz.ch>
Subject: Re: [PATCH] rebase: be cleverer with rebased upstream branches
Date: Tue, 15 Feb 2011 22:03:23 -0500 (EST) [thread overview]
Message-ID: <alpine.DEB.2.00.1102152040370.14950@debian> (raw)
In-Reply-To: <7vzkpxm45e.fsf@alter.siamese.dyndns.org>
On Tue, 15 Feb 2011, Junio C Hamano wrote:
> Martin von Zweigbergk <martin.von.zweigbergk@gmail.com> writes:
>
> > diff --git a/git-rebase.sh b/git-rebase.sh
> > index 5abfeac..1bc0c29 100755
> > --- a/git-rebase.sh
> > +++ b/git-rebase.sh
> > @@ -466,6 +466,19 @@ esac
> >
> > require_clean_work_tree "rebase" "Please commit or stash them."
> >
> > +test -n "$upstream_name" && for reflog in \
> > + $(git rev-list -g $upstream_name 2>/dev/null)
>
> Ugly.
Very. Fixed. Thanks.
> test -n "$upstream_name" &&
> for reflog in $(git rev-list ...)
> do
> ...
> done
>
> Don't you need to make sure $upstream_name is a branch (or a ref in
> general that can have a reflog), or does it not matter because the
> "rev-list -g" will die without producing anything and you are discarding
> the error message?
Exactly as you suspect. Is it too ugly?
> Now, a handful of random questions, none of them rhetorical, as I don't
> know the answers to any of them.
>
> Would it help if the code is made just as clever as the patch attempts to
> be, when the user says
>
> git rebase origin/next~4
>
> IOW, use the reflog of origin/next even in such a case?
Not sure. I think it seems too rare to worry about. In those cases,
one could still use the good old '--onto' option manually. Also, if we
don't handle the ref~4 case, the "cleverness" can be disabled by using
ref~0.
> > +do
> > + if test $reflog = $(git merge-base $reflog $orig_head)
> > + then
> > + if test $reflog != $(git merge-base $onto $reflog)
> > + then
> > + upstream=$reflog
> > + fi
> > + break
> > + fi
>
> Do we always traverse down to the beginning of the reflog in the worst
> case?
Yes.
> Would bisection help to avoid the cost?
I don't think the straight-forward use of bisection would work. If the
history looks something like below, where 'b' is the branch to rebase
and 'u' is the upstream, we have to go through each entry in the
reflog to find u@{3}.
.-u@{0}
/
.---u@{1}
/
x---y-----u@{2}
\
.---u@{3}---b
\
.-u@{4}
I have an idea inspired by bisection, Thomas's exponential stride, and
what someone (you?) mentioned the other day about virtual merge
commits. I haven't tried it out, but let me know what you think. I'll
try to explain it using an example only:
Exponential stride phase:
1. candidates={ u@{0} }
merge-base b $candidates -> y, _not_ in $candidates
2. candidates={ u@{1} u@{2} }
merge-base b $candidates -> y, _not_ in $candidates
3. candidates={ u@{3} u@{4} u@{5} u@{6} }
merge-base b $candidates -> u@{3}, in $candidates
Bisection phase:
1. candidates={ u@{3} u@{4} }
merge-base b $candidates -> u@{3}, in $candidates
2. candidates={ u@{3} }
merge-base b $candidates -> u@{3}, in $candidates, done
It works for the few cases I have thought of, but it may break in
other other cases. I just read about the virtual merge commits, so I'm
not sure I understand correctly how that works eiter.
Would it even perform better than searching linearly? I tried stepping
through it manually a few times and it seems faster.
Maybe something based on timestamps would be better?
/Martin
next prev parent reply other threads:[~2011-02-16 3:03 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-14 13:51 [PATCH] rebase: be cleverer with rebased upstream branches Martin von Zweigbergk
2011-02-15 11:28 ` Santi Béjar
2011-02-16 1:37 ` Martin von Zweigbergk
2011-02-16 9:26 ` Santi Béjar
2011-02-15 20:30 ` Junio C Hamano
2011-02-16 3:03 ` Martin von Zweigbergk [this message]
2011-02-16 12:10 ` Santi Béjar
2011-02-16 13:22 ` Santi Béjar
2011-02-16 19:07 ` Junio C Hamano
2011-02-16 21:16 ` Santi Béjar
2011-02-16 16:45 ` Martin von Zweigbergk
2011-02-17 10:24 ` Santi Béjar
2011-03-12 21:15 ` Martin von Zweigbergk
2011-03-12 23:51 ` Santi Béjar
2011-03-13 1:32 ` Martin von Zweigbergk
2011-03-13 3:14 ` Martin von Zweigbergk
2011-03-13 22:57 ` Junio C Hamano
2011-03-13 23:42 ` Santi Béjar
2011-03-13 23:09 ` Santi Béjar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.00.1102152040370.14950@debian \
--to=martin.von.zweigbergk@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=santi@agolina.net \
--cc=trast@student.ethz.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox