pull: support rebased upstream + fetch + pull --rebase
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>
Santi Béjar committed
Jul 19, 2009 at 09:45 UTC
d44e71261f91d3cc81293e0976bb40daa8abb583
2 files changed
+13
-6
git-pull.sh
+11
-3
@@ -124,10 +124,18 @@ test true = "$rebase" && {
124
git diff-index --ignore-submodules --cached --quiet HEAD -- ||
125
die "refusing to pull with rebase: your working tree is not up-to-date"
126
127
+ oldremoteref= &&
128
. git-parse-remote &&
128
- reflist="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
129
- oldremoteref="$(git rev-parse -q --verify \
130
- "$reflist")"
129
+ remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
130
+ oldremoteref="$(git rev-parse -q --verify "$remoteref")" &&
131
+ for reflog in $(git rev-list -g $remoteref 2>/dev/null)
132
+ do
133
+ if test "$reflog" = "$(git merge-base $reflog $curr_branch)"
134
+ then
135
+ oldremoteref="$reflog"
136
+ break
137
+ fi
138
+ done
139
}
140
orig_head=$(git rev-parse -q --verify HEAD)
141
git fetch $verbosity --update-head-ok "$@" || exit 1
t/t5520-pull.sh
+2
-3
@@ -117,15 +117,14 @@ test_expect_success '--rebase with rebased default upstream' '
117
118
'
119
120
-test_expect_failure 'rebased upstream + fetch + pull --rebase' '
120
+test_expect_success 'rebased upstream + fetch + pull --rebase' '
121
122
git update-ref refs/remotes/me/copy copy-orig &&
123
git reset --hard to-rebase-orig &&
124
git checkout --track -b to-rebase3 me/copy &&
125
git reset --hard to-rebase-orig &&
126
git fetch &&
127
- test_must_fail git pull --rebase &&
128
- git rebase --abort &&
127
+ git pull --rebase &&
128
test "conflicting modification" = "$(cat file)" &&
129
test file = "$(cat file2)"
130