[RFC] rebase: use @{upstream} if no upstream specified

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



With 'git pull --rebase', the user can configure the upstream repository
to fetch from and reference to rebase against if none is specified on
the command line.

However, if, instead of 'git pull --rebase', the user were to do 'git
fetch' followed by 'git rebase', the upstream branch would need to be
specified on the command line. This patch teaches 'git rebase' to
default to the same configured upstream ref as 'git pull --rebase'
uses.

'git rebase' currently require at least one argument, so this change does
not cause any ambiguity. Defaulting to @{upstream} will make it possible
to run e.g. 'git rebase -i' without arguments, which is probably a quite
common use case. It also improves the scenario where you have multiple
branches that rebase against a remote-tracking branch, where you
currently have to choose between the extra network delay of 'git pull' or
the awkward keys to enter 'git rebase @{u}'.
---
Another RFC in the same vein as my previous one, namely making
'git fetch+rebase' more similar to 'git pull --rebase'.

Junio, don't apply this patch yet, as I will rebase it on top of the
refactored rebase code once I'm done with that (to make it work with
interactive rebase as well).

However, it should apply cleanly on top of the patches in
http://thread.gmane.org/gmane.comp.version-control.git/160682/, and maybe
even right on top of master.

The obvious extension would be to make @{u} the default for 'git merge'
as well. Any opinions?

I was apparently very lazy with the testing, so I will have to improve on
that before this becomes a "PATCH v1". I will add a test case that checks
that it works when the upstream actually is configured.

 Documentation/git-rebase.txt |    6 +++++-
 git-rebase.sh                |   37 ++++++++++++++++++++++++++-----------
 t/t3400-rebase.sh            |    4 ++--
 3 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt
index 1baddd2..42d13a0 100644
--- a/Documentation/git-rebase.txt
+++ b/Documentation/git-rebase.txt
@@ -9,7 +9,7 @@ SYNOPSIS
 --------
 [verse]
 'git rebase' [-i | --interactive] [options] [--onto <newbase>]
-	<upstream> [<branch>]
+	[<upstream>] [<branch>]
 'git rebase' [-i | --interactive] [options] --onto <newbase>
 	--root [<branch>]
 
@@ -21,6 +21,10 @@ If <branch> is specified, 'git rebase' will perform an automatic
 `git checkout <branch>` before doing anything else.  Otherwise
 it remains on the current branch.
 
+If <upstream> is not specified, the upstream configured in
+branch.<name>.remote and branch.<name>.merge options will be used; see
+linkgit:git-config[1] for details.
+
 All changes made by commits in the current branch but that are not
 in <upstream> are saved to a temporary area.  This is the same set
 of commits that would be shown by `git log <upstream>..HEAD` (or
diff --git a/git-rebase.sh b/git-rebase.sh
index fade99a..7eb1a6e 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -3,7 +3,7 @@
 # Copyright (c) 2005 Junio C Hamano.
 #
 
-USAGE='[--interactive | -i] [-v] [--force-rebase | -f] [--no-ff] [--onto <newbase>] (<upstream>|--root) [<branch>] [--quiet | -q]'
+USAGE='[--interactive | -i] [-v] [--force-rebase | -f] [--no-ff] [--onto <newbase>] [<upstream>|--root] [<branch>] [--quiet | -q]'
 LONG_USAGE='git-rebase replaces <branch> with a new branch of the
 same name.  When the --onto option is provided the new branch starts
 out with a HEAD equal to <newbase>, otherwise it is equal to <upstream>
@@ -369,13 +369,6 @@ do
 done
 test $# -gt 2 && usage
 
-if test $# -eq 0 && test -z "$rebase_root"
-then
-	test -d "$merge_dir" -o -d "$apply_dir" || usage
-	test -d "$merge_dir" -o -f "$apply_dir"/rebasing &&
-		die 'A rebase is in progress, try --continue, --skip or --abort.'
-fi
-
 # Make sure we do not have $apply_dir or $merge_dir
 if test -z "$do_merge"
 then
@@ -416,9 +409,31 @@ esac
 
 if test -z "$rebase_root"
 then
-	# The upstream head must be given.  Make sure it is valid.
-	upstream_name="$1"
-	shift
+	case "$#" in
+	0)	branch_name=$(git symbolic-ref -q HEAD) &&
+		upstream_name=$(git for-each-ref \
+			--format='%(upstream)' ${branch_name})
+		if test -z $branch_name
+		then
+			die "You are not currently on a branch, so I cannot use any
+'branch.<branchname>.merge' in your configuration file.
+Please specify which upstream branch you want to use on the command
+line and try again (e.g. 'git rebase <upstream branch>').
+See git-rebase(1) for details."
+		elif test -z $upstream_name
+		then
+			die "You asked me to rebase without telling me which branch you
+want to rebase against, and 'branch.${branch_name#refs/heads/}.merge' in
+your configuration file does not tell me, either. Please
+specify which branch you want to use on the command line and
+try again (e.g. 'git rebase <upstream branch>').
+See git-rebase(1) for details."
+		fi
+		;;
+	*)	upstream_name="$1"
+		shift
+		;;
+	esac
 	upstream=`git rev-parse --verify "${upstream_name}^0"` ||
 	die "invalid upstream $upstream_name"
 	unset root_flag
diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
index b64df31..5b0a29b 100755
--- a/t/t3400-rebase.sh
+++ b/t/t3400-rebase.sh
@@ -161,11 +161,11 @@ rm -f B
 test_expect_success 'dump usage when upstream arg is missing' '
 	git checkout -b usage topic &&
 	test_must_fail git rebase 2>error1 &&
-	grep "[Uu]sage" error1 &&
+	grep "branch.usage.merge" error1 &&
 	test_must_fail git rebase --abort 2>error2 &&
 	grep "No rebase in progress" error2 &&
 	test_must_fail git rebase --onto master 2>error3 &&
-	grep "[Uu]sage" error3 &&
+	grep "branch.usage.merge" error3 &&
 	! grep "can.t shift" error3
 '
 
-- 
1.7.3.2.167.ga361b

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]