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