Code

ed83ce1e4ff5dde68c28847b5e757866d19c0d4e
[git.git] / git-pull.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2005 Junio C Hamano
4 #
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.'
9 SUBDIRECTORY_OK=Yes
10 OPTIONS_SPEC=
11 . git-sh-setup
12 set_reflog_action "pull $*"
13 require_work_tree
14 cd_to_toplevel
16 test -z "$(git ls-files -u)" ||
17         die "You are in the middle of a conflicted merge."
19 strategy_args= no_stat= no_commit= squash= no_ff=
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)
23 while :
24 do
25         case "$1" in
26         -n|--no-stat|--no-summary)
27                 no_stat=-n ;;
28         --stat|--summary)
29                 no_stat=$1 ;;
30         --no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit)
31                 no_commit=--no-commit ;;
32         --c|--co|--com|--comm|--commi|--commit)
33                 no_commit=--commit ;;
34         --sq|--squ|--squa|--squas|--squash)
35                 squash=--squash ;;
36         --no-sq|--no-squ|--no-squa|--no-squas|--no-squash)
37                 squash=--no-squash ;;
38         --ff)
39                 no_ff=--ff ;;
40         --no-ff)
41                 no_ff=--no-ff ;;
42         -s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\
43                 --strateg=*|--strategy=*|\
44         -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy)
45                 case "$#,$1" in
46                 *,*=*)
47                         strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;;
48                 1,*)
49                         usage ;;
50                 *)
51                         strategy="$2"
52                         shift ;;
53                 esac
54                 strategy_args="${strategy_args}-s $strategy "
55                 ;;
56         -r|--r|--re|--reb|--reba|--rebas|--rebase)
57                 rebase=true
58                 ;;
59         --no-r|--no-re|--no-reb|--no-reba|--no-rebas|--no-rebase)
60                 rebase=false
61                 ;;
62         -h|--h|--he|--hel|--help)
63                 usage
64                 ;;
65         *)
66                 # Pass thru anything that may be meant for fetch.
67                 break
68                 ;;
69         esac
70         shift
71 done
73 error_on_no_merge_candidates () {
74         exec >&2
75         for opt
76         do
77                 case "$opt" in
78                 -t|--t|--ta|--tag|--tags)
79                         echo "Fetching tags only, you probably meant:"
80                         echo "  git fetch --tags"
81                         exit 1
82                 esac
83         done
85         curr_branch=${curr_branch#refs/heads/}
87         echo "You asked me to pull without telling me which branch you"
88         echo "want to merge with, and 'branch.${curr_branch}.merge' in"
89         echo "your configuration file does not tell me either.  Please"
90         echo "name which branch you want to merge on the command line and"
91         echo "try again (e.g. 'git pull <repository> <refspec>')."
92         echo "See git-pull(1) for details on the refspec."
93         echo
94         echo "If you often merge with the same branch, you may want to"
95         echo "configure the following variables in your configuration"
96         echo "file:"
97         echo
98         echo "    branch.${curr_branch}.remote = <nickname>"
99         echo "    branch.${curr_branch}.merge = <remote-ref>"
100         echo "    remote.<nickname>.url = <url>"
101         echo "    remote.<nickname>.fetch = <refspec>"
102         echo
103         echo "See git-config(1) for details."
104         exit 1
107 test true = "$rebase" && {
108         . git-parse-remote &&
109         origin="$1"
110         test -z "$origin" && origin=$(get_default_remote)
111         reflist="$(get_remote_refs_for_fetch "$@" 2>/dev/null |
112                 sed "s|refs/heads/\(.*\):|\1|")" &&
113         oldremoteref="$(git rev-parse --verify \
114                 "refs/remotes/$origin/$reflist" 2>/dev/null)"
116 orig_head=$(git rev-parse --verify HEAD 2>/dev/null)
117 git-fetch --update-head-ok "$@" || exit 1
119 curr_head=$(git rev-parse --verify HEAD 2>/dev/null)
120 if test "$curr_head" != "$orig_head"
121 then
122         # The fetch involved updating the current branch.
124         # The working tree and the index file is still based on the
125         # $orig_head commit, but we are merging into $curr_head.
126         # First update the working tree to match $curr_head.
128         echo >&2 "Warning: fetch updated the current branch head."
129         echo >&2 "Warning: fast forwarding your working tree from"
130         echo >&2 "Warning: commit $orig_head."
131         git update-index --refresh 2>/dev/null
132         git read-tree -u -m "$orig_head" "$curr_head" ||
133                 die 'Cannot fast-forward your working tree.
134 After making sure that you saved anything precious from
135 $ git diff '$orig_head'
136 output, run
137 $ git reset --hard
138 to recover.'
140 fi
142 merge_head=$(sed -e '/  not-for-merge   /d' \
143         -e 's/  .*//' "$GIT_DIR"/FETCH_HEAD | \
144         tr '\012' ' ')
146 case "$merge_head" in
147 '')
148         case $? in
149         0) error_on_no_merge_candidates "$@";;
150         1) echo >&2 "You are not currently on a branch; you must explicitly"
151            echo >&2 "specify which branch you wish to merge:"
152            echo >&2 "  git pull <remote> <branch>"
153            exit 1;;
154         *) exit $?;;
155         esac
156         ;;
157 ?*' '?*)
158         if test -z "$orig_head"
159         then
160                 echo >&2 "Cannot merge multiple branches into empty head"
161                 exit 1
162         fi
163         ;;
164 esac
166 if test -z "$orig_head"
167 then
168         git update-ref -m "initial pull" HEAD $merge_head "" &&
169         git read-tree --reset -u HEAD || exit 1
170         exit
171 fi
173 merge_name=$(git fmt-merge-msg <"$GIT_DIR/FETCH_HEAD") || exit
174 test true = "$rebase" &&
175         exec git-rebase $strategy_args --onto $merge_head \
176         ${oldremoteref:-$merge_head}
177 exec git-merge $no_stat $no_commit $squash $no_ff $strategy_args \
178         "$merge_name" HEAD $merge_head