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-summary] [--no-commit] [-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 10. git-sh-setup 11set_reflog_action "pull $*" 12require_work_tree 13cd_to_toplevel 14 15test -z"$(git ls-files -u)"|| 16 die "You are in the middle of a conflicted merge." 17 18strategy_args= no_summary= no_commit= squash= 19while case"$#,$1"in0)break;; *,-*) ;; *)break;;esac 20do 21case"$1"in 22-n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\ 23--no-summa|--no-summar|--no-summary) 24 no_summary=-n;; 25--no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit) 26 no_commit=--no-commit;; 27--sq|--squ|--squa|--squas|--squash) 28 squash=--squash;; 29-s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\ 30--strateg=*|--strategy=*|\ 31-s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy) 32case"$#,$1"in 33*,*=*) 34 strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'`;; 351,*) 36 usage ;; 37*) 38 strategy="$2" 39shift;; 40esac 41 strategy_args="${strategy_args}-s$strategy" 42;; 43-h|--h|--he|--hel|--help) 44 usage 45;; 46-*) 47# Pass thru anything that is meant for fetch. 48break 49;; 50esac 51shift 52done 53 54orig_head=$(git-rev-parse --verify HEAD 2>/dev/null) 55git-fetch --update-head-ok"$@"||exit1 56 57curr_head=$(git-rev-parse --verify HEAD 2>/dev/null) 58iftest"$curr_head"!="$orig_head" 59then 60# The fetch involved updating the current branch. 61 62# The working tree and the index file is still based on the 63# $orig_head commit, but we are merging into $curr_head. 64# First update the working tree to match $curr_head. 65 66echo>&2"Warning: fetch updated the current branch head." 67echo>&2"Warning: fast forwarding your working tree from" 68echo>&2"Warning: commit$orig_head." 69 git-update-index --refresh2>/dev/null 70 git-read-tree -u -m"$orig_head""$curr_head"|| 71 die 'Cannot fast-forward your working tree. 72After making sure that you saved anything precious from 73$ git diff '$orig_head' 74output, run 75$ git reset --hard 76to recover.' 77 78fi 79 80merge_head=$(sed-e'/ not-for-merge /d' \ 81-e's/ .*//'"$GIT_DIR"/FETCH_HEAD | \ 82tr'\012'' ') 83 84case"$merge_head"in 85'') 86 curr_branch=$(git-symbolic-ref -q HEAD) 87case $? in 880) ;; 891)echo>&2"You are not currently on a branch; you must explicitly" 90echo>&2"specify which branch you wish to merge:" 91echo>&2" git pull <remote> <branch>" 92exit1;; 93*)exit $?;; 94esac 95 curr_branch=${curr_branch#refs/heads/} 96 97echo>&2"Warning: No merge candidate found because value of config option 98\"branch.${curr_branch}.merge\"does not match any remote branch fetched." 99echo>&2"No changes." 100exit0 101;; 102?*' '?*) 103iftest -z"$orig_head" 104then 105echo>&2"Cannot merge multiple branches into empty head" 106exit1 107fi 108;; 109esac 110 111iftest -z"$orig_head" 112then 113 git-update-ref -m"initial pull" HEAD $merge_head""&& 114 git-read-tree --reset -u HEAD ||exit1 115exit 116fi 117 118merge_name=$(git-fmt-merge-msg <"$GIT_DIR/FETCH_HEAD")||exit 119exec git-merge$no_summary $no_commit $squash $strategy_args \ 120"$merge_name" HEAD $merge_head