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. 6 7USAGE='[-n | --no-stat] [--[no-]commit] [--[no-]squash] [--[no-]ff] [-s strategy]... [<fetch-options>] <repo> <head>...' 8LONG_USAGE='Fetch one or more remote refs and merge it/them into the current HEAD.' 9SUBDIRECTORY_OK=Yes 10OPTIONS_SPEC= 11. git-sh-setup 12set_reflog_action "pull $*" 13require_work_tree 14cd_to_toplevel 15 16test -z"$(git ls-files -u)"|| 17 die "You are in the middle of a conflicted merge." 18 19strategy_args= diffstat= no_commit= squash= no_ff= ff_only= 20log_arg= verbosity= 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) 24while: 25do 26case"$1"in 27-q|--quiet) 28 verbosity="$verbosity-q";; 29-v|--verbose) 30 verbosity="$verbosity-v";; 31-n|--no-stat|--no-summary) 32 diffstat=--no-stat;; 33--stat|--summary) 34 diffstat=--stat;; 35--log|--no-log) 36 log_arg=$1;; 37--no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit) 38 no_commit=--no-commit;; 39--c|--co|--com|--comm|--commi|--commit) 40 no_commit=--commit;; 41--sq|--squ|--squa|--squas|--squash) 42 squash=--squash;; 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;; 49--ff-only) 50 ff_only=--ff-only;; 51-s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\ 52--strateg=*|--strategy=*|\ 53-s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy) 54case"$#,$1"in 55*,*=*) 56 strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'`;; 571,*) 58 usage ;; 59*) 60 strategy="$2" 61shift;; 62esac 63 strategy_args="${strategy_args}-s$strategy" 64;; 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;; 71-h|--h|--he|--hel|--help) 72 usage 73;; 74*) 75# Pass thru anything that may be meant for fetch. 76break 77;; 78esac 79shift 80done 81 82error_on_no_merge_candidates () { 83exec>&2 84for opt 85do 86case"$opt"in 87-t|--t|--ta|--tag|--tags) 88echo"Fetching tags only, you probably meant:" 89echo" git fetch --tags" 90exit1 91esac 92done 93 94 curr_branch=${curr_branch#refs/heads/} 95 upstream=$(git config "branch.$curr_branch.merge") 96 remote=$(git config "branch.$curr_branch.remote") 97 98if[$#-gt1];then 99echo"There are no candidates for merging in the refs that you just fetched." 100echo"Generally this means that you provided a wildcard refspec which had no" 101echo"matches on the remote end." 102elif[$#-gt0] && ["$1"!="$remote"];then 103echo"You asked to pull from the remote '$1', but did not specify" 104echo"a branch to merge. Because this is not the default configured remote" 105echo"for your current branch, you must specify a branch on the command line." 106elif[-z"$curr_branch"];then 107echo"You are not currently on a branch, so I cannot use any" 108echo"'branch.<branchname>.merge' in your configuration file." 109echo"Please specify which branch you want to merge on the command" 110echo"line and try again (e.g. 'git pull <repository> <refspec>')." 111echo"See git-pull(1) for details." 112elif[-z"$upstream"];then 113echo"You asked me to pull without telling me which branch you" 114echo"want to merge with, and 'branch.${curr_branch}.merge' in" 115echo"your configuration file does not tell me either. Please" 116echo"specify which branch you want to merge on the command line and" 117echo"try again (e.g. 'git pull <repository> <refspec>')." 118echo"See git-pull(1) for details." 119echo 120echo"If you often merge with the same branch, you may want to" 121echo"configure the following variables in your configuration" 122echo"file:" 123echo 124echo" branch.${curr_branch}.remote = <nickname>" 125echo" branch.${curr_branch}.merge = <remote-ref>" 126echo" remote.<nickname>.url = <url>" 127echo" remote.<nickname>.fetch = <refspec>" 128echo 129echo"See git-config(1) for details." 130else 131echo"Your configuration specifies to merge the ref '${upstream#refs/heads/}' from the" 132echo"remote, but no such ref was fetched." 133fi 134exit1 135} 136 137test true ="$rebase"&& { 138if! git rev-parse -q --verify HEAD >/dev/null 139then 140# On an unborn branch 141iftest -f"$GIT_DIR/index" 142then 143 die "updating an unborn branch with changes added to the index" 144fi 145else 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" 150fi 151 oldremoteref= && 152 . git-parse-remote&& 153 remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)"&& 154 oldremoteref="$(git rev-parse -q --verify "$remoteref")"&& 155for reflog in$(git rev-list -g $remoteref 2>/dev/null) 156do 157iftest"$reflog"="$(git merge-base $reflog $curr_branch)" 158then 159 oldremoteref="$reflog" 160break 161fi 162done 163} 164orig_head=$(git rev-parse -q --verify HEAD) 165git fetch $verbosity--update-head-ok"$@"||exit1 166 167curr_head=$(git rev-parse -q --verify HEAD) 168iftest -n"$orig_head"&&test"$curr_head"!="$orig_head" 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 176echo>&2"Warning: fetch updated the current branch head." 177echo>&2"Warning: fast-forwarding your working tree from" 178echo>&2"Warning: commit$orig_head." 179 git update-index -q --refresh 180 git read-tree -u -m"$orig_head""$curr_head"|| 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 188fi 189 190merge_head=$(sed-e'/ not-for-merge /d' \ 191-e's/ .*//'"$GIT_DIR"/FETCH_HEAD | \ 192tr'\012'' ') 193 194case"$merge_head"in 195'') 196 error_on_no_merge_candidates "$@" 197;; 198?*' '?*) 199iftest -z"$orig_head" 200then 201 die "Cannot merge multiple branches into empty head" 202fi 203iftest true ="$rebase" 204then 205 die "Cannot rebase onto multiple branches" 206fi 207;; 208esac 209 210iftest -z"$orig_head" 211then 212 git update-ref -m"initial pull" HEAD $merge_head"$curr_head"&& 213 git read-tree --reset -u HEAD ||exit1 214exit 215fi 216 217merge_name=$(git fmt-merge-msg $log_arg <"$GIT_DIR/FETCH_HEAD")||exit 218test true ="$rebase"&& 219exec git-rebase$diffstat $strategy_args--onto$merge_head \ 220${oldremoteref:-$merge_head} 221exec git-merge$diffstat $no_commit $squash $no_ff $ff_only $log_arg $strategy_args \ 222"$merge_name" HEAD $merge_head $verbosity