From a418441b4ea2ab69a17636c3020a29394d4c6562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santi=20B=C3=A9jar?= Date: Thu, 16 Jul 2009 02:09:14 +0200 Subject: [PATCH 1/2] t5520-pull: Test for rebased upstream + fetch + pull --rebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If your upstream has rebased you can do: git pull --rebase but only if you haven't fetch before. Mark this case as test_expect_failure, in a later patch it will be changed to test_expect_success. Signed-off-by: Santi Béjar Signed-off-by: Junio C Hamano --- t/t5520-pull.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh index c5a2e66a09..3ebc886bdc 100755 --- a/t/t5520-pull.sh +++ b/t/t5520-pull.sh @@ -117,6 +117,20 @@ test_expect_success '--rebase with rebased default upstream' ' ' +test_expect_failure '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 && + test "conflicting modification" = "$(cat file)" && + test file = "$(cat file2)" + +' + test_expect_success 'pull --rebase dies early with dirty working directory' ' git checkout to-rebase && From d44e71261f91d3cc81293e0976bb40daa8abb583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Santi=20B=C3=A9jar?= Date: Sun, 19 Jul 2009 09:45:16 +0200 Subject: [PATCH 2/2] pull: support rebased upstream + fetch + pull --rebase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Junio C Hamano --- git-pull.sh | 14 +++++++++++--- t/t5520-pull.sh | 5 ++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/git-pull.sh b/git-pull.sh index 4b78a0cd37..0f24182974 100755 --- a/git-pull.sh +++ b/git-pull.sh @@ -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 diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh index 3ebc886bdc..e78d40242a 100755 --- a/t/t5520-pull.sh +++ b/t/t5520-pull.sh @@ -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)"