From: Santi Béjar Date: Thu, 12 Aug 2010 14:37:25 GMT Subject: Re: [PATCHv4 2/2] pull --rebase: Avoid spurious conflicts and reapplying unnecessary patches Message-ID: In-Reply-To: On Thu, Aug 12, 2010 at 3:34 PM, Santi Béjar wrote: > On Thu, Aug 12, 2010 at 7:56 AM, Elijah Newren wrote: [...] >> >> Signed-off-by: Elijah Newren >> --- >>  git-pull.sh     |   34 ++++++++++++++++++++++------------ >>  t/t5520-pull.sh |    4 ++-- >>  2 files changed, 24 insertions(+), 14 deletions(-) >> >> diff --git a/git-pull.sh b/git-pull.sh >> index a09a44e..54da07b 100755 >> --- a/git-pull.sh >> +++ b/git-pull.sh >> @@ -206,18 +206,6 @@ test true = "$rebase" && { >>                git diff-index --ignore-submodules --cached --quiet HEAD -- || >>                die "refusing to pull with rebase: your working tree is not up-to-date" >>        fi >> -       oldremoteref= && >> -       . git-parse-remote && >> -       remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" && >> -       oldremoteref="$(git rev-parse -q --verify "$remoteref")" && >> -       for reflog in $(git rev-list -g $remoteref 2>/dev/null) >> -       do >> -               if test "$reflog" = "$(git merge-base $reflog $curr_branch)" >> -               then >> -                       oldremoteref="$reflog" >> -                       break >> -               fi >> -       done >>  } >>  orig_head=$(git rev-parse -q --verify HEAD) >>  git fetch $verbosity $progress $dry_run --update-head-ok "$@" || exit 1 >> @@ -273,6 +261,28 @@ then >>        exit >>  fi >> >> +if test true = "$rebase" >> +then >> +       oldremoteref= && >> +       . git-parse-remote && >> +       remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" && >> +       oldremoteref="$(git rev-parse -q --verify "$remoteref")" && >> +       for reflog in $(git rev-list -g $remoteref 2>/dev/null) >> +       do >> +               if test "$reflog" = "$(git merge-base $reflog $curr_branch)" >> +               then >> +                       oldremoteref="$reflog" >> +                       break >> +               fi >> +       done >> + >> +       o=$(git show-branch --merge-base $curr_branch $merge_head $oldremoteref) >> +       if test "$oldremoteref" = "$o" >> +       then >> +               unset oldremoteref >> +       fi >> +fi >> + > > You've moved all the lines after the call to "git fetch". It changes > the behavior when the reflog is not enabled, as the old value of > remoteref is lost. Something like this? Fix the non-rebased upstream case by only setting $old_remote_ref with commits not ancestors of $remoteref or $merge_head. This should have no affect on the rebased upstream case. diff --git c/git-pull.sh w/git-pull.sh index a09a44e..c1617d5 100755 --- c/git-pull.sh +++ w/git-pull.sh @@ -214,7 +214,10 @@ test true = "$rebase" && { do if test "$reflog" = "$(git merge-base $reflog $curr_branch)" then - oldremoteref="$reflog" + if test "$reflog" != $(git merge-base $reflog $remoteref) + then + oldremoteref="$reflog" + fi break fi done @@ -273,6 +276,14 @@ then exit fi +if test true = "$rebase" +then + if test "$oldremoteref" = $(git merge-base $oldremoteref $merge_head) + then + unset oldremoteref + fi +fi + merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit case "$rebase" in true) (also attached because of whitespace damage) HTH, Santi