git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Use reflog in 'pull --rebase . foo'

From
Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>
Date
Nov 12, 2010, 19:38 UTC
Message-ID
<1289590708-11064-1-git-send-email-martin.von.zweigbergk@gmail.com>

Since c85c792 (pull --rebase: be cleverer with rebased upstream branches, 2008-01-26), "git pull --rebase" has used the reflog to try to rebase from the old upstream onto the new upstream.

Make this work if the local repository is explicitly passed on the command line as in 'git pull --rebase . foo'. --- I removed some seemingly unnecessary variables. I couldn't find any uses of them in the callers' code either, so it should be safe...

I apparently introduced a call to sed as well. I think I remember seeing some guideslines about the use of sed in Git, but I can't remember what. I couldn't find anything in the CodingGuidelines either. Is the code below ok?

 git-parse-remote.sh |   24 ++++++++++--------------
 t/t5520-pull.sh     |    7 +++++++
 2 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 5f47b18..0565edd 100644
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -63,33 +63,29 @@ get_default_remote () {
 get_remote_merge_branch () {
 	case "$#" in
 	0|1)
-	    origin="$1"
-	    default=$(get_default_remote)
-	    test -z "$origin" && origin=$default
 	    curr_branch=$(git symbolic-ref -q HEAD)
-	    [ "$origin" = "$default" ] &&
+	    test -z "$1" || test "$1" = $(get_default_remote) &&
 	    echo $(git for-each-ref --format='%(upstream)' $curr_branch)
 	    ;;
 	*)
 	    repo=$1
 	    shift
-	    ref=$1
 	    # FIXME: It should return the tracking branch
 	    #        Currently only works with the default mapping
-	    case "$ref" in
-	    +*)
-		ref=$(expr "z$ref" : 'z+\(.*\)')
-		;;
-	    esac
-	    expr "z$ref" : 'z.*:' >/dev/null || ref="${ref}:"
-	    remote=$(expr "z$ref" : 'z\([^:]*\):')
+	    remote=$(echo "$1" | sed -e 's|+\?\([^:]*\):\?|\1|g')
 	    case "$remote" in
 	    '' | HEAD ) remote=HEAD ;;
 	    heads/*) remote=${remote#heads/} ;;
 	    refs/heads/*) remote=${remote#refs/heads/} ;;
 	    refs/* | tags/* | remotes/* ) remote=
 	    esac
-
-	    [ -n "$remote" ] && echo "refs/remotes/$repo/$remote"
+	    [ -n "$remote" ] && case "$repo" in
+		.)
+		    echo "refs/heads/$remote"
+		    ;;
+		*)
+		    echo "refs/remotes/$repo/$remote"
+		    ;;
+	    esac
 	esac
 }
diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
index 0b489f5..0470a81 100755
--- a/t/t5520-pull.sh
+++ b/t/t5520-pull.sh
@@ -222,4 +222,11 @@ test_expect_success 'git pull --rebase does not reapply old patches' '
 	)
 '
 
+test_expect_success 'git pull --rebase against local branch' '
+	git checkout -b copy2 to-rebase-orig &&
+	git pull --rebase . to-rebase &&
+	test "conflicting modification" = "$(cat file)" &&
+	test file = "$(cat file2)"
+'
+
 test_done
-- 
1.7.3.2.167.ga361b
Next: Andreas Schwab
Message 1 of 6 in “Use reflog in 'pull --rebase . foo'”
  1. Use reflog in 'pull --rebase . foo'Martin von Zweigbergk, Nov 12, 2010
  2. Andreas SchwabNov 13, 2010
  3. Martin von ZweigbergkNov 13, 2010
  4. Santi BéjarNov 13, 2010
  5. Martin von ZweigbergkNov 13, 2010
  6. Santi BéjarNov 13, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.