3 # Copyright (c) 2005 Junio C Hamano
5 # Fetch one or more remote refs and merge it/them into the current HEAD.
7 USAGE='[-n | --no-stat] [--[no-]commit] [--[no-]squash] [--[no-]ff] [-s strategy]... [<fetch-options>] <repo> <head>...'
8 LONG_USAGE='Fetch one or more remote refs and merge it/them into the current HEAD.'
12 set_reflog_action "pull $*"
16 test -z "$(git ls-files -u)" ||
17 die "You are in the middle of a conflicted merge."
19 strategy_args= diffstat= no_commit= squash= no_ff= log_arg= verbosity=
20 curr_branch=$(git symbolic-ref -q HEAD)
21 curr_branch_short=$(echo "$curr_branch" | sed "s|refs/heads/||")
22 rebase=$(git config --bool branch.$curr_branch_short.rebase)
27 verbosity="$verbosity -q" ;;
29 verbosity="$verbosity -v" ;;
30 -n|--no-stat|--no-summary)
36 --no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit)
37 no_commit=--no-commit ;;
38 --c|--co|--com|--comm|--commi|--commit)
40 --sq|--squ|--squa|--squas|--squash)
42 --no-sq|--no-squ|--no-squa|--no-squas|--no-squash)
48 -s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\
49 --strateg=*|--strategy=*|\
50 -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
53 strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
60 strategy_args="${strategy_args}-s $strategy "
62 -r|--r|--re|--reb|--reba|--rebas|--rebase)
65 --no-r|--no-re|--no-reb|--no-reba|--no-rebas|--no-rebase)
68 -h|--h|--he|--hel|--help)
72 # Pass thru anything that may be meant for fetch.
79 error_on_no_merge_candidates () {
84 -t|--t|--ta|--tag|--tags)
85 echo "Fetching tags only, you probably meant:"
86 echo " git fetch --tags"
91 curr_branch=${curr_branch#refs/heads/}
93 echo "You asked me to pull without telling me which branch you"
94 echo "want to merge with, and 'branch.${curr_branch}.merge' in"
95 echo "your configuration file does not tell me either. Please"
96 echo "name which branch you want to merge on the command line and"
97 echo "try again (e.g. 'git pull <repository> <refspec>')."
98 echo "See git-pull(1) for details on the refspec."
100 echo "If you often merge with the same branch, you may want to"
101 echo "configure the following variables in your configuration"
104 echo " branch.${curr_branch}.remote = <nickname>"
105 echo " branch.${curr_branch}.merge = <remote-ref>"
106 echo " remote.<nickname>.url = <url>"
107 echo " remote.<nickname>.fetch = <refspec>"
109 echo "See git-config(1) for details."
113 test true = "$rebase" && {
114 git update-index --ignore-submodules --refresh &&
115 git diff-files --ignore-submodules --quiet &&
116 git diff-index --ignore-submodules --cached --quiet HEAD -- ||
117 die "refusing to pull with rebase: your working tree is not up-to-date"
119 . git-parse-remote &&
121 test -z "$origin" && origin=$(get_default_remote)
122 reflist="$(get_remote_refs_for_fetch "$@" 2>/dev/null |
123 sed "s|refs/heads/\(.*\):|\1|")" &&
124 oldremoteref="$(git rev-parse -q --verify \
125 "refs/remotes/$origin/$reflist")"
127 orig_head=$(git rev-parse -q --verify HEAD)
128 git fetch $verbosity --update-head-ok "$@" || exit 1
130 curr_head=$(git rev-parse -q --verify HEAD)
131 if test -n "$orig_head" && test "$curr_head" != "$orig_head"
133 # The fetch involved updating the current branch.
135 # The working tree and the index file is still based on the
136 # $orig_head commit, but we are merging into $curr_head.
137 # First update the working tree to match $curr_head.
139 echo >&2 "Warning: fetch updated the current branch head."
140 echo >&2 "Warning: fast forwarding your working tree from"
141 echo >&2 "Warning: commit $orig_head."
142 git update-index --refresh 2>/dev/null
143 git read-tree -u -m "$orig_head" "$curr_head" ||
144 die 'Cannot fast-forward your working tree.
145 After making sure that you saved anything precious from
146 $ git diff '$orig_head'
153 merge_head=$(sed -e '/ not-for-merge /d' \
154 -e 's/ .*//' "$GIT_DIR"/FETCH_HEAD | \
157 case "$merge_head" in
160 0) error_on_no_merge_candidates "$@";;
161 1) echo >&2 "You are not currently on a branch; you must explicitly"
162 echo >&2 "specify which branch you wish to merge:"
163 echo >&2 " git pull <remote> <branch>"
169 if test -z "$orig_head"
171 echo >&2 "Cannot merge multiple branches into empty head"
174 if test true = "$rebase"
176 echo >&2 "Cannot rebase onto multiple branches"
182 if test -z "$orig_head"
184 git update-ref -m "initial pull" HEAD $merge_head "$curr_head" &&
185 git read-tree --reset -u HEAD || exit 1
189 merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD") || exit
190 test true = "$rebase" &&
191 exec git-rebase $diffstat $strategy_args --onto $merge_head \
192 ${oldremoteref:-$merge_head}
193 exec git-merge $diffstat $no_commit $squash $no_ff $log_arg $strategy_args \
194 "$merge_name" HEAD $merge_head $verbosity