Skip to contentSkip to conversation

rebase --interactive: Compute upstream SHA1 before switching branches

PATCH In review Johannes Sixt 3 participants 4 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 rebase --interactive: Compute upstream SHA1 before switching branches

From: Johannes Sixt <[email protected]>

If the upstream argument to rebase (the first argument) was relative to HEAD and the name of the branch to rebase (the second argument) was given, the upstream would have been interpreted relative to the second argument. In particular, this command

git rebase -i HEAD topic

would always finish with "Nothing to do". (a1bf91e fixed the same issue for non-interactive rebase.)

---

I made this with -U5 so that you can see the checkout in the context.

BTW, methinks, this checkout is unnecessary, since before the rebase begins, there is a 'git checkout $ONTO', and the branch switching is certainly not needed to compute the todo list...

-- Hannes

 git-rebase--interactive.sh |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)
git-rebase--interactive.sh +3 -4
index 8ee08ff..0ca986f 100755
@@ -473,25 +473,24 @@ do
 			;;
 		esac
 
 		require_clean_work_tree
 
+		UPSTREAM=$(git rev-parse --verify "$1") || die "Invalid base"
+		test -z "$ONTO" && ONTO=$UPSTREAM
+
 		if test ! -z "$2"
 		then
 			output git show-ref --verify --quiet "refs/heads/$2" ||
 				die "Invalid branchname: $2"
 			output git checkout "$2" ||
 				die "Could not checkout $2"
 		fi
 
 		HEAD=$(git rev-parse --verify HEAD) || die "No HEAD?"
-		UPSTREAM=$(git rev-parse --verify "$1") || die "Invalid base"
-
 		mkdir "$DOTEST" || die "Could not create temporary $DOTEST"
 
-		test -z "$ONTO" && ONTO=$UPSTREAM
-
 		: > "$DOTEST"/interactive || die "Could not mark as interactive"
 		git symbolic-ref HEAD > "$DOTEST"/head-name 2> /dev/null ||
 			echo "detached HEAD" > "$DOTEST"/head-name
 
 		echo $HEAD > "$DOTEST"/head
Signature · 1 line
1.5.6.rc0.885.gdf17.dirty
Acked-by on v1 1/1
#1 lore raw

Hi,

Quoted 7 lines · Johannes Sixt

From: Johannes Sixt <[email protected]>

If the upstream argument to rebase (the first argument) was relative to HEAD and the name of the branch to rebase (the second argument) was given, the upstream would have been interpreted relative to the second argument. In particular, this command

Quoted 6 lines

git rebase -i HEAD topic

would always finish with "Nothing to do". (a1bf91e fixed the same issue for non-interactive rebase.)

Quoted 5 lines

I made this with -U5 so that you can see the checkout in the context.

BTW, methinks, this checkout is unnecessary, since before the rebase begins, there is a 'git checkout $ONTO', and the branch switching is certainly not needed to compute the todo list...

It is needed to determine which branch to update after finish.

Ciao,
Dscho

#2 lore raw
Quoted 5 lines · Johannes Schindelin
Quoted 3 lines

BTW, methinks, this checkout is unnecessary, since before the rebase begins, there is a 'git checkout $ONTO', and the branch switching is certainly not needed to compute the todo list...

It is needed to determine which branch to update after finish.

I'll apply Hannes's patch for now as I do not want to leave an obvious fix out of -rc1.

I think Hannes is referring to the same issue as the one dealt with with 0cb0664 (rebase [--onto O] A B: omit needless checkout, 2008-03-15) for the non-interactive codepath.

You certainly "need to determine which branch to update after finish", and you do need to remember what branch you were on (if you were not called with the <branch> parameter), or what branch were given from the command line (if you got one as <branch> parameter) in order to do so, but the way to remember these values does not have to involve an extra checkout.

By doing an extra checkout of "the original HEAD", before switching to a detached HEAD state at the $ONTO commit to "clean the slate" to apply the sequence on top, more work tree entries will be smudged, forcinging more recompilations than necessary if the tracked contents are "source" files.

#3 lore raw

Hi,

Quoted 22 lines · Junio C Hamano
Quoted 5 lines · Johannes Schindelin
Quoted 3 lines

BTW, methinks, this checkout is unnecessary, since before the rebase begins, there is a 'git checkout $ONTO', and the branch switching is certainly not needed to compute the todo list...

It is needed to determine which branch to update after finish.

I'll apply Hannes's patch for now as I do not want to leave an obvious fix out of -rc1.

I think Hannes is referring to the same issue as the one dealt with with 0cb0664 (rebase [--onto O] A B: omit needless checkout, 2008-03-15) for the non-interactive codepath.

You certainly "need to determine which branch to update after finish", and you do need to remember what branch you were on (if you were not called with the <branch> parameter), or what branch were given from the command line (if you got one as <branch> parameter) in order to do so, but the way to remember these values does not have to involve an extra checkout.

Quoted 5 lines

By doing an extra checkout of "the original HEAD", before switching to a detached HEAD state at the $ONTO commit to "clean the slate" to apply the sequence on top, more work tree entries will be smudged, forcinging more recompilations than necessary if the tracked contents are "source" files.

Right. I failed to follow the given hint to the other commit, but it makes perfect sense now.

Thanks,
Dscho