Hi, On Thu, 16 Jul 2009, Santi Béjar wrote: > 2009/7/16 Johannes Schindelin <Johannes.Schindelin@xxxxxx>: > > > On Thu, 16 Jul 2009, Santi Béjar wrote: > > > >> Use the fork commit of the current branch (where > >> the tip of upstream branch used to be) as the upstream parameter of > >> "git rebase". Compute it walking the reflog to find the first commit > >> which is an ancestor of the current branch. > > > > I finally understand what this patch is about. Thanks. > > Thanks, it was hard (at least for me) to provide a short and good > commit message. It is the thing I found quite hard when I started contributing to Git, and it is still not exactly easy for me. > >> diff --git a/git-pull.sh b/git-pull.sh > >> index 4b78a0c..31d3945 100755 > >> --- a/git-pull.sh > >> +++ b/git-pull.sh > >> @@ -125,9 +125,14 @@ test true = "$rebase" && { > >> die "refusing to pull with rebase: your working tree is not up-to-date" > >> > >> . git-parse-remote && > >> - reflist="$(get_remote_merge_branch "$@" 2>/dev/null)" && > >> - oldremoteref="$(git rev-parse -q --verify \ > >> - "$reflist")" > >> + remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" && > >> + num=0 && > >> + while oldremoteref="$(git rev-parse -q --verify "$remoteref@{$num}")" > >> + do > > > > How about > > > > oldremoteref="$(git rev-list --boundary HEAD --not \ > > $(git rev-list -g $remoteref | sed 's/$/^@/') | > > sed -e '/^[^-]/d' -e q)" > > > > Explanation: the "git rev-list -g $remoteref" lists the previous commits > > the remote ref pointed to, and the ^@ appended to them means all their > > parents. Now, the outer rev-list says to take everything in HEAD but > > _not_ in those parents, showing the boundary commits. The "sed" call > > lists the first such boundary commit (which must, by construction, be one > > of the commits shown by the first rev-list). > > It almost works, thanks. In fact this is how I represent it in my > head, but I couldn't find a working command (hint, hint, the > --boundaries trick). Based on yours here it is the one I am using > right now: > > oldremoteref="$(git rev-list --boundary HEAD --not \ > $(git rev-list -g $remoteref 2>/dev/null) | > sed -e '/^[^-]/d' -e 's/^-//;q' )" > > i.e. without the ^@ as you want the commits in the reflog as boundary > commits, and also remove the - in front of the commit. Thanks for fixing it. I should have mentioned that I did not test it (and usually stuff I do not test has blatant bugs in it, such as was the case here). > Your version performs equally than mine for the normal case but much > better if it has to walk many reflog entries. Also mine has the problem, > at least currently, that it does not give up as "git rev-parse -q > --verify $branch@{n}" does not return an error when n is too large: > > $ git rev-parse -q --verify origin/next@{18} ; echo $? > warning: Log for 'origin/next' only has 17 entries. > 37eb784cfce07ba0048d64e352c5137454396d87 > 0 > > even with "-q --verify"! > > So, I'll take yours and will send an updated patch (saying that is is > based on a command by you). With your Signed-off-by? Maybe an ACK instead? Thanks, Dscho