]> git.ipfire.org Git - thirdparty/git.git/blame - git-pull.sh
rebase -i: Change function make_squash_message into update_squash_message
[thirdparty/git.git] / git-pull.sh
CommitLineData
839a7a06
LT
1#!/bin/sh
2#
521003ff
JH
3# Copyright (c) 2005 Junio C Hamano
4#
5# Fetch one or more remote refs and merge it/them into the current HEAD.
6
d8abe148 7USAGE='[-n | --no-stat] [--[no-]commit] [--[no-]squash] [--[no-]ff] [-s strategy]... [<fetch-options>] <repo> <head>...'
806f36d4 8LONG_USAGE='Fetch one or more remote refs and merge it/them into the current HEAD.'
533b7039 9SUBDIRECTORY_OK=Yes
8f321a39 10OPTIONS_SPEC=
ae2b0f15 11. git-sh-setup
f9474132 12set_reflog_action "pull $*"
7eff28a9 13require_work_tree
533b7039 14cd_to_toplevel
b10ac50f 15
d1014a17 16test -z "$(git ls-files -u)" ||
533b7039 17 die "You are in the middle of a conflicted merge."
d1014a17 18
13474835
BG
19strategy_args= diffstat= no_commit= squash= no_ff= ff_only=
20log_arg= verbosity=
cd67e4d4
JS
21curr_branch=$(git symbolic-ref -q HEAD)
22curr_branch_short=$(echo "$curr_branch" | sed "s|refs/heads/||")
23rebase=$(git config --bool branch.$curr_branch_short.rebase)
822f7c73 24while :
60fb5b2c
JH
25do
26 case "$1" in
7f87aff2 27 -q|--quiet)
c6576f91 28 verbosity="$verbosity -q" ;;
7f87aff2 29 -v|--verbose)
c6576f91 30 verbosity="$verbosity -v" ;;
d8abe148 31 -n|--no-stat|--no-summary)
a334e125 32 diffstat=--no-stat ;;
d8abe148 33 --stat|--summary)
a334e125 34 diffstat=--stat ;;
efb779f8
SG
35 --log|--no-log)
36 log_arg=$1 ;;
123ee3ca
JH
37 --no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit)
38 no_commit=--no-commit ;;
5072a323
LH
39 --c|--co|--com|--comm|--commi|--commit)
40 no_commit=--commit ;;
7d0c6887
JH
41 --sq|--squ|--squa|--squas|--squash)
42 squash=--squash ;;
5072a323
LH
43 --no-sq|--no-squ|--no-squa|--no-squas|--no-squash)
44 squash=--no-squash ;;
45 --ff)
46 no_ff=--ff ;;
47 --no-ff)
48 no_ff=--no-ff ;;
13474835
BG
49 --ff-only)
50 ff_only=--ff-only ;;
60fb5b2c
JH
51 -s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\
52 --strateg=*|--strategy=*|\
53 -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
54 case "$#,$1" in
55 *,*=*)
8096fae7 56 strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
60fb5b2c
JH
57 1,*)
58 usage ;;
59 *)
60 strategy="$2"
61 shift ;;
62 esac
63 strategy_args="${strategy_args}-s $strategy "
64 ;;
cd67e4d4
JS
65 -r|--r|--re|--reb|--reba|--rebas|--rebase)
66 rebase=true
67 ;;
68 --no-r|--no-re|--no-reb|--no-reba|--no-rebas|--no-rebase)
69 rebase=false
70 ;;
93d69d86
JL
71 -h|--h|--he|--hel|--help)
72 usage
73 ;;
822f7c73
DK
74 *)
75 # Pass thru anything that may be meant for fetch.
619e5a0e 76 break
60fb5b2c
JH
77 ;;
78 esac
79 shift
80done
81
441ed413
JH
82error_on_no_merge_candidates () {
83 exec >&2
84 for opt
85 do
86 case "$opt" in
87 -t|--t|--ta|--tag|--tags)
88 echo "Fetching tags only, you probably meant:"
89 echo " git fetch --tags"
90 exit 1
91 esac
92 done
93
94 curr_branch=${curr_branch#refs/heads/}
a6dbf881 95 upstream=$(git config "branch.$curr_branch.merge")
a8c9bef4 96 remote=$(git config "branch.$curr_branch.remote")
441ed413 97
a8c9bef4
JK
98 if [ $# -gt 1 ]; then
99 echo "There are no candidates for merging in the refs that you just fetched."
100 echo "Generally this means that you provided a wildcard refspec which had no"
101 echo "matches on the remote end."
102 elif [ $# -gt 0 ] && [ "$1" != "$remote" ]; then
103 echo "You asked to pull from the remote '$1', but did not specify"
104 echo "a branch to merge. Because this is not the default configured remote"
105 echo "for your current branch, you must specify a branch on the command line."
106 elif [ -z "$curr_branch" ]; then
61e6108d
MM
107 echo "You are not currently on a branch, so I cannot use any"
108 echo "'branch.<branchname>.merge' in your configuration file."
109 echo "Please specify which branch you want to merge on the command"
110 echo "line and try again (e.g. 'git pull <repository> <refspec>')."
111 echo "See git-pull(1) for details."
a6dbf881 112 elif [ -z "$upstream" ]; then
61e6108d
MM
113 echo "You asked me to pull without telling me which branch you"
114 echo "want to merge with, and 'branch.${curr_branch}.merge' in"
115 echo "your configuration file does not tell me either. Please"
116 echo "specify which branch you want to merge on the command line and"
117 echo "try again (e.g. 'git pull <repository> <refspec>')."
118 echo "See git-pull(1) for details."
119 echo
120 echo "If you often merge with the same branch, you may want to"
121 echo "configure the following variables in your configuration"
122 echo "file:"
123 echo
124 echo " branch.${curr_branch}.remote = <nickname>"
125 echo " branch.${curr_branch}.merge = <remote-ref>"
126 echo " remote.<nickname>.url = <url>"
127 echo " remote.<nickname>.fetch = <refspec>"
128 echo
129 echo "See git-config(1) for details."
a6dbf881 130 else
a8c9bef4
JK
131 echo "Your configuration specifies to merge the ref '${upstream#refs/heads/}' from the"
132 echo "remote, but no such ref was fetched."
61e6108d 133 fi
441ed413
JH
134 exit 1
135}
136
c85c7927 137test true = "$rebase" && {
19a7fcbf
JK
138 if ! git rev-parse -q --verify HEAD >/dev/null
139 then
140 # On an unborn branch
141 if test -f "$GIT_DIR/index"
142 then
143 die "updating an unborn branch with changes added to the index"
144 fi
145 else
146 git update-index --ignore-submodules --refresh &&
147 git diff-files --ignore-submodules --quiet &&
148 git diff-index --ignore-submodules --cached --quiet HEAD -- ||
149 die "refusing to pull with rebase: your working tree is not up-to-date"
150 fi
d44e7126 151 oldremoteref= &&
c85c7927 152 . git-parse-remote &&
d44e7126
SB
153 remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
154 oldremoteref="$(git rev-parse -q --verify "$remoteref")" &&
155 for reflog in $(git rev-list -g $remoteref 2>/dev/null)
156 do
157 if test "$reflog" = "$(git merge-base $reflog $curr_branch)"
158 then
159 oldremoteref="$reflog"
160 break
161 fi
162 done
c85c7927 163}
2d179857 164orig_head=$(git rev-parse -q --verify HEAD)
7f87aff2 165git fetch $verbosity --update-head-ok "$@" || exit 1
b10ac50f 166
2d179857 167curr_head=$(git rev-parse -q --verify HEAD)
b0ad11ea 168if test -n "$orig_head" && test "$curr_head" != "$orig_head"
b10ac50f
JH
169then
170 # The fetch involved updating the current branch.
171
172 # The working tree and the index file is still based on the
173 # $orig_head commit, but we are merging into $curr_head.
174 # First update the working tree to match $curr_head.
175
176 echo >&2 "Warning: fetch updated the current branch head."
a75d7b54 177 echo >&2 "Warning: fast-forwarding your working tree from"
a057f806 178 echo >&2 "Warning: commit $orig_head."
7bd93c1c 179 git update-index -q --refresh
5be60078 180 git read-tree -u -m "$orig_head" "$curr_head" ||
8323124a
JH
181 die 'Cannot fast-forward your working tree.
182After making sure that you saved anything precious from
183$ git diff '$orig_head'
184output, run
185$ git reset --hard
186to recover.'
187
b10ac50f
JH
188fi
189
05dd8e2e
JH
190merge_head=$(sed -e '/ not-for-merge /d' \
191 -e 's/ .*//' "$GIT_DIR"/FETCH_HEAD | \
192 tr '\012' ' ')
e0bfc81e
JH
193
194case "$merge_head" in
521003ff 195'')
4973aa22 196 error_on_no_merge_candidates "$@"
521003ff 197 ;;
60fb5b2c 198?*' '?*)
d09e79cb
LT
199 if test -z "$orig_head"
200 then
bc2bbc45 201 die "Cannot merge multiple branches into empty head"
d09e79cb 202 fi
51b2ead0
JS
203 if test true = "$rebase"
204 then
bc2bbc45 205 die "Cannot rebase onto multiple branches"
51b2ead0 206 fi
60fb5b2c
JH
207 ;;
208esac
209
d09e79cb
LT
210if test -z "$orig_head"
211then
b0ad11ea 212 git update-ref -m "initial pull" HEAD $merge_head "$curr_head" &&
5be60078 213 git read-tree --reset -u HEAD || exit 1
d09e79cb
LT
214 exit
215fi
216
efb779f8 217merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit
c85c7927 218test true = "$rebase" &&
c0ecb070 219 exec git rebase $diffstat $strategy_args --onto $merge_head \
0d2dd191 220 ${oldremoteref:-$merge_head}
c0ecb070
HB
221exec git merge $verbosity $diffstat $no_commit $squash $no_ff $ff_only $log_arg $strategy_args \
222 -m "$merge_name" $merge_head