From: Santi Béjar Date: Thu, 16 Jul 2009 23:18:14 GMT Subject: Re: [PATCHv2 2/2] pull: support rebased upstream + fetch + pull --rebase Message-ID: In-Reply-To: <7vhbxc8inp.fsf@alter.siamese.dyndns.org> 2009/7/16 Junio C Hamano : > Johannes Schindelin writes: > >> 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). > > Hmm, I am not sure about that "(which must..." part.  When you have > >          Y---X >         / >        B---o---o---o---H > > wouldn't "rev-list --boundary H --not X^@" give B, not X nor Y? > $git rev-list --boundary H --not X and $git rev-list --boundary H --not X^@ return the same output in this case: o o o -B In this case the correct command is without ^@, because you want the commits in the reflog as boundary commits. In the simpler and usual case, without a rebased upstream:    z---B---o---o---o---H B=upstream@{0} $git rev-list --boundary H --not B^@ o o o B -z and: $git rev-list --boundary H --not B o o o -B Also in the rebased upstream case:      Y---X     /    z---B---o---o---o---H X=upstream@{0} B=upstream@{1} $git rev-list --boundary H --not X^@ B^@ o o o B -z and: $git rev-list --boundary H --not X B o o o -B HTH, Santi