Skip to content

Commit

Permalink
pull: support rebased upstream + fetch + pull --rebase
Browse files Browse the repository at this point in the history
You cannot do a "git pull --rebase" with a rebased upstream, if you have
already run "git fetch".  Try to behave as if the "git fetch" was not run.

In other words, find the fork point of the current branch, where
the tip of upstream branch used to be, and use it as the upstream
parameter of "git rebase".

This patch computes the fork point by walking the reflog to find the first
commit which is an ancestor of the current branch.  Maybe there are
smarter ways to compute it, but this is a straight forward implementation.

Signed-off-by: Santi Béjar <santi@agolina.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Santi Béjar authored and Junio C Hamano committed Jul 19, 2009
1 parent a418441 commit d44e712
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 6 deletions.
14 changes: 11 additions & 3 deletions git-pull.sh
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,18 @@ 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"

oldremoteref= &&
. 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)" &&
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 --update-head-ok "$@" || exit 1
Expand Down
5 changes: 2 additions & 3 deletions t/t5520-pull.sh
Original file line number Diff line number Diff line change
Expand Up @@ -117,15 +117,14 @@ test_expect_success '--rebase with rebased default upstream' '
'

test_expect_failure 'rebased upstream + fetch + pull --rebase' '
test_expect_success 'rebased upstream + fetch + pull --rebase' '
git update-ref refs/remotes/me/copy copy-orig &&
git reset --hard to-rebase-orig &&
git checkout --track -b to-rebase3 me/copy &&
git reset --hard to-rebase-orig &&
git fetch &&
test_must_fail git pull --rebase &&
git rebase --abort &&
git pull --rebase &&
test "conflicting modification" = "$(cat file)" &&
test file = "$(cat file2)"
Expand Down

0 comments on commit d44e712

Please sign in to comment.