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

[PATCH] Teach 'git pull' the '--rebase' option

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Oct 25, 2007, 22:54 UTC
Message-ID
<Pine.LNX.4.64.0710252351130.4362@racer.site>

When calling 'git pull' with the '--rebase' option, it performs a fetch + rebase instead of a fetch + pull.

This behavior is more desirable than fetch + pull when a topic branch is ready to be submitted.

fetch + rebase might also be considered a better workflow with shared repositories in any case, or for contributors to a centrally managed project, such as Wine -- or Git.

For your convenience, you can set the default behavior for a branch by defining the config variable branch.<name>.rebase, which is interpreted as a bool. This setting can be overridden on the command line by --rebase and --no-rebase.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 Documentation/git-pull.txt |    6 ++++++
 git-pull.sh                |   11 ++++++++++-
 t/t5520-pull.sh            |   22 ++++++++++++++++++++++
 3 files changed, 38 insertions(+), 1 deletions(-)
diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt
index e1eb2c1..c3ce8ee 100644
--- a/Documentation/git-pull.txt
+++ b/Documentation/git-pull.txt
@@ -33,6 +33,12 @@ include::urls-remotes.txt[]
 
 include::merge-strategies.txt[]
 
+\--rebase::
+	Instead of a merge, perform a rebase after fetching.
+
+\--no-rebase::
+	Override earlier \--rebase.
+
 DEFAULT BEHAVIOUR
 -----------------
 
diff --git a/git-pull.sh b/git-pull.sh
index 74bfc16..b5ecb80 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -16,6 +16,9 @@ test -z "$(git ls-files -u)" ||
 	die "You are in the middle of a conflicted merge."
 
 strategy_args= no_summary= no_commit= squash=
+curr_branch=$(git symbolic-ref -q HEAD)
+curr_branch_short=$(echo "$curr_branch" | sed "s|refs/heads/||")
+rebase=$(git config --bool branch.$curr_branch_short.rebase)
 while :
 do
 	case "$1" in
@@ -43,6 +46,12 @@ do
 		esac
 		strategy_args="${strategy_args}-s $strategy "
 		;;
+	-r|--r|--re|--reb|--reba|--rebas|--rebase)
+		rebase=true
+		;;
+	--no-r|--no-re|--no-reb|--no-reba|--no-rebas|--no-rebase)
+		rebase=false
+		;;
 	-h|--h|--he|--hel|--help)
 		usage
 		;;
@@ -86,7 +95,6 @@ merge_head=$(sed -e '/	not-for-merge	/d' \
 
 case "$merge_head" in
 '')
-	curr_branch=$(git symbolic-ref -q HEAD)
 	case $? in
 	  0) ;;
 	  1) echo >&2 "You are not currently on a branch; you must explicitly"
@@ -133,5 +141,6 @@ then
 fi
 
 merge_name=$(git fmt-merge-msg <"$GIT_DIR/FETCH_HEAD") || exit
+test true = "$rebase" && exec git-rebase $merge_head
 exec git-merge $no_summary $no_commit $squash $strategy_args \
 	"$merge_name" HEAD $merge_head
diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
index 93eaf2c..52b3a0c 100755
--- a/t/t5520-pull.sh
+++ b/t/t5520-pull.sh
@@ -53,4 +53,26 @@ test_expect_success 'the default remote . should not break explicit pull' '
 	test `cat file` = modified
 '
 
+test_expect_success '--rebase' '
+	git branch to-rebase &&
+	echo modified again > file &&
+	git commit -m file file &&
+	git checkout to-rebase &&
+	echo new > file2 &&
+	git add file2 &&
+	git commit -m "new file" &&
+	git tag before-rebase &&
+	git pull --rebase . copy &&
+	test $(git rev-parse HEAD^) = $(git rev-parse copy) &&
+	test new = $(git show HEAD:file2)
+'
+
+test_expect_success 'branch.to-rebase.rebase' '
+	git reset --hard before-rebase &&
+	git config branch.to-rebase.rebase 1 &&
+	git pull . copy &&
+	test $(git rev-parse HEAD^) = $(git rev-parse copy) &&
+	test new = $(git show HEAD:file2)
+'
+
 test_done
-- 
1.5.3.4.1351.gee906
Next: Linus Torvalds
Message 1 of 32 in “Teach 'git pull' the '--rebase' option”
  1. Teach 'git pull' the '--rebase' optionJohannes Schindelin, Oct 25, 2007
  2. Linus TorvaldsOct 25, 2007
  3. Johannes SchindelinOct 25, 2007
  4. Linus TorvaldsOct 25, 2007
  5. Linus TorvaldsOct 25, 2007
  6. Junio C HamanoOct 25, 2007
  7. Johannes SchindelinOct 26, 2007
  8. Junio C HamanoNov 28, 2007
  9. Teach 'git pull' about --rebaseJohannes Schindelin, Nov 28, 2007
  10. Jonathan del StrotherNov 28, 2007
  11. Johannes SchindelinNov 28, 2007
  12. Jakub NarebskiNov 28, 2007
  13. Steven GrimmNov 28, 2007
  14. Johannes SchindelinNov 28, 2007
  15. Lars HjemliNov 28, 2007
  16. Junio C HamanoNov 28, 2007
  17. Johannes SchindelinNov 28, 2007
  18. Steven GrimmNov 28, 2007
  19. J. Bruce FieldsNov 28, 2007
  20. J. Bruce FieldsNov 28, 2007
  21. Johannes SchindelinNov 28, 2007
  22. Junio C HamanoNov 28, 2007
  23. J. Bruce FieldsNov 28, 2007
  24. Johannes SchindelinNov 29, 2007
  25. Andreas EricssonNov 29, 2007
  26. Nicolas PitreNov 29, 2007
  27. Jon LoeligerNov 28, 2007
  28. Johannes SchindelinNov 28, 2007
  29. Björn SteinbrinkDec 1, 2007
  30. Karl HasselströmDec 3, 2007
  31. Jeff KingOct 26, 2007
  32. Jeff KingOct 26, 2007

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.