1#!/bin/sh 2# 3# Copyright (c) 2005 Junio C Hamano 4# 5 6USAGE='[-n] [--no-commit] [--squash] [-s <strategy>] [-m=<merge-message>] <commit>+' 7 8SUBDIRECTORY_OK=Yes 9. git-sh-setup 10require_work_tree 11cd_to_toplevel 12 13test -z"$(git ls-files -u)"|| 14 die "You are in the middle of a conflicted merge." 15 16LF=' 17' 18 19all_strategies='recur recursive octopus resolve stupid ours subtree' 20default_twohead_strategies='recursive' 21default_octopus_strategies='octopus' 22no_trivial_merge_strategies='ours subtree' 23use_strategies= 24 25index_merge=t 26 27dropsave() { 28rm-f --"$GIT_DIR/MERGE_HEAD""$GIT_DIR/MERGE_MSG" \ 29"$GIT_DIR/MERGE_SAVE"||exit1 30} 31 32savestate() { 33# Stash away any local modifications. 34 git-diff-index -z --name-only$head| 35cpio-0 -o>"$GIT_DIR/MERGE_SAVE" 36} 37 38restorestate() { 39iftest -f"$GIT_DIR/MERGE_SAVE" 40then 41 git reset--hard$head>/dev/null 42cpio-iuv<"$GIT_DIR/MERGE_SAVE" 43 git-update-index --refresh>/dev/null 44fi 45} 46 47finish_up_to_date () { 48case"$squash"in 49 t) 50echo"$1(nothing to squash)";; 51'') 52echo"$1";; 53esac 54 dropsave 55} 56 57squash_message () { 58echo Squashed commit of the following: 59echo 60 git-log --no-merges ^"$head"$remote 61} 62 63finish () { 64iftest''="$2" 65then 66 rlogm="$GIT_REFLOG_ACTION" 67else 68echo"$2" 69 rlogm="$GIT_REFLOG_ACTION:$2" 70fi 71case"$squash"in 72 t) 73echo"Squash commit -- not updating HEAD" 74 squash_message >"$GIT_DIR/SQUASH_MSG" 75;; 76'') 77case"$merge_msg"in 78'') 79echo"No merge message -- not updating HEAD" 80;; 81*) 82 git-update-ref -m"$rlogm" HEAD "$1""$head"||exit1 83;; 84esac 85;; 86esac 87case"$1"in 88'') 89;; 90 ?*) 91case"$no_summary"in 92'') 93# We want color (if set), but no pager 94 GIT_PAGER='' git-diff --stat --summary -M"$head""$1" 95;; 96esac 97;; 98esac 99} 100 101merge_name () { 102 remote="$1" 103 rh=$(git-rev-parse --verify "$remote^0" 2>/dev/null)||return 104 bh=$(git-show-ref -s --verify "refs/heads/$remote" 2>/dev/null) 105iftest"$rh"="$bh" 106then 107echo"$rhbranch '$remote' of ." 108elif truname=$(expr "$remote" : '\(.*\)~[1-9][0-9]*$') && 109 git-show-ref -q --verify "refs/heads/$truname" 2>/dev/null 110 then 111 echo "$rhbranch '$truname' (early part) of ." 112 elif test "$remote" = "FETCH_HEAD" -a -r "$GIT_DIR/FETCH_HEAD" 113 then 114 sed -e 's/ not-for-merge/ /' -e 1q \ 115 "$GIT_DIR/FETCH_HEAD" 116 else 117 echo "$rhcommit '$remote'" 118 fi 119} 120 121case "$#" in 0) usage ;; esac 122 123have_message= 124while case "$#" in 0) break ;; esac 125do 126 case "$1" in 127 -n|--n|--no|--no-|--no-s|--no-su|--no-sum|--no-summ|\ 128 --no-summa|--no-summar|--no-summary) 129 no_summary=t ;; 130 --sq|--squ|--squa|--squas|--squash) 131 squash=t no_commit=t ;; 132 --no-c|--no-co|--no-com|--no-comm|--no-commi|--no-commit) 133 no_commit=t ;; 134 -s=*|--s=*|--st=*|--str=*|--stra=*|--strat=*|--strate=*|\ 135 --strateg=*|--strategy=*|\ 136 -s|--s|--st|--str|--stra|--strat|--strate|--strateg|--strategy) 137 case "$#,$1" in 138 *,*=*) 139 strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;; 140 1,*) 141 usage ;; 142 *) 143 strategy="$2" 144 shift ;; 145 esac 146 case "$all_strategies" in 147 *"$strategy"*) 148 use_strategies="$use_strategies$strategy" ;; 149 *) 150 die "available strategies are:$all_strategies" ;; 151 esac 152 ;; 153 -m=*|--m=*|--me=*|--mes=*|--mess=*|--messa=*|--messag=*|--message=*) 154 merge_msg=`expr "z$1" : 'z-[^=]*=\(.*\)'` 155 have_message=t 156 ;; 157 -m|--m|--me|--mes|--mess|--messa|--messag|--message) 158 shift 159 case "$#" in 160 1) usage ;; 161 esac 162 merge_msg="$1" 163 have_message=t 164 ;; 165 -*) usage ;; 166 *) break ;; 167 esac 168 shift 169done 170 171# This could be traditional "merge <msg> HEAD <commit>..." and the 172# way we can tell it is to see if the second token is HEAD, but some 173# people might have misused the interface and used a committish that 174# is the same as HEAD there instead. Traditional format never would 175# have "-m" so it is an additional safety measure to check for it. 176 177if test -z "$have_message" && 178 second_token=$(git-rev-parse --verify "$2^0" 2>/dev/null)&& 179 head_commit=$(git-rev-parse --verify "HEAD" 2>/dev/null)&& 180 test "$second_token" = "$head_commit" 181then 182 merge_msg="$1" 183 shift 184 head_arg="$1" 185 shift 186elif ! git-rev-parse --verify HEAD >/dev/null 2>&1 187then 188 # If the merged head is a valid one there is no reason to 189 # forbid "git merge" into a branch yet to be born. We do 190 # the same for "git pull". 191 if test 1 -ne$# 192 then 193 echo >&2 "Can merge only exactly one commit into empty head" 194 exit 1 195 fi 196 197 rh=$(git rev-parse --verify "$1^0")|| 198 die "$1- not something we can merge" 199 200 git-update-ref -m "initial pull" HEAD "$rh" "" && 201 git-read-tree --reset -u HEAD 202 exit 203 204else 205 # We are invoked directly as the first-class UI. 206 head_arg=HEAD 207 208 # All the rest are the commits being merged; prepare 209 # the standard merge summary message to be appended to 210 # the given message. If remote is invalid we will die 211 # later in the common codepath so we discard the error 212 # in this loop. 213 merge_name=$(for remote 214 do 215 merge_name "$remote" 216 done | git-fmt-merge-msg 217 ) 218 merge_msg="${merge_msg:+$merge_msg$LF$LF}$merge_name" 219fi 220head=$(git-rev-parse --verify "$head_arg"^0)|| usage 221 222# All the rest are remote heads 223test "$#" = 0 && usage ;# we need at least one remote head. 224set_reflog_action "merge $*" 225 226remoteheads= 227for remote 228do 229 remotehead=$(git-rev-parse --verify "$remote"^0 2>/dev/null)|| 230 die "$remote- not something we can merge" 231 remoteheads="${remoteheads}$remotehead" 232 eval GITHEAD_$remotehead='"$remote"' 233 export GITHEAD_$remotehead 234done 235set x$remoteheads; shift 236 237case "$use_strategies" in 238'') 239 case "$#" in 240 1) 241 var="`git-config --get pull.twohead`" 242 if test -n "$var" 243 then 244 use_strategies="$var" 245 else 246 use_strategies="$default_twohead_strategies" 247 fi ;; 248 *) 249 var="`git-config --get pull.octopus`" 250 if test -n "$var" 251 then 252 use_strategies="$var" 253 else 254 use_strategies="$default_octopus_strategies" 255 fi ;; 256 esac 257 ;; 258esac 259 260for s in$use_strategies 261do 262 for nt in$no_trivial_merge_strategies 263 do 264 case "$s" in 265 *"$nt"*) 266 index_merge=f 267 break 268 ;; 269 esac 270 done 271done 272 273case "$#" in 2741) 275 common=$(git-merge-base --all $head "$@") 276 ;; 277*) 278 common=$(git-show-branch --merge-base $head "$@") 279 ;; 280esac 281echo "$head" >"$GIT_DIR/ORIG_HEAD" 282 283case "$index_merge,$#,$common,$no_commit" in 284f,*) 285 # We've been told not to try anything clever. Skip to real merge. 286;; 287?,*,'',*) 288# No common ancestors found. We need a real merge. 289;; 290?,1,"$1",*) 291# If head can reach all the merge then we are up to date. 292# but first the most common case of merging one remote. 293 finish_up_to_date "Already up-to-date." 294exit0 295;; 296?,1,"$head",*) 297# Again the most common case of merging one remote. 298echo"Updating$(git-rev-parse --short $head)..$(git-rev-parse --short $1)" 299 git-update-index --refresh2>/dev/null 300 msg="Fast forward" 301iftest -n"$have_message" 302then 303 msg="$msg(no commit created; -m option ignored)" 304fi 305 new_head=$(git-rev-parse --verify "$1^0")&& 306 git-read-tree -v -m -u --exclude-per-directory=.gitignore $head"$new_head"&& 307 finish "$new_head""$msg"||exit 308 dropsave 309exit0 310;; 311?,1,?*"$LF"?*,*) 312# We are not doing octopus and not fast forward. Need a 313# real merge. 314;; 315?,1,*,) 316# We are not doing octopus, not fast forward, and have only 317# one common. 318 git-update-index --refresh2>/dev/null 319case"$use_strategies"in 320*' recursive '*|*' recur '*) 321: run merge later 322;; 323*) 324# See if it is really trivial. 325 git var GIT_COMMITTER_IDENT >/dev/null ||exit 326echo"Trying really trivial in-index merge..." 327if git-read-tree --trivial -m -u -v$common $head"$1"&& 328 result_tree=$(git-write-tree) 329then 330echo"Wonderful." 331 result_commit=$( 332printf'%s\n'"$merge_msg"| 333 git-commit-tree$result_tree-p HEAD -p"$1" 334) ||exit 335 finish "$result_commit""In-index merge" 336 dropsave 337exit0 338fi 339echo"Nope." 340esac 341;; 342*) 343# An octopus. If we can reach all the remote we are up to date. 344 up_to_date=t 345for remote 346do 347 common_one=$(git-merge-base --all $head $remote) 348iftest"$common_one"!="$remote" 349then 350 up_to_date=f 351break 352fi 353done 354iftest"$up_to_date"= t 355then 356 finish_up_to_date "Already up-to-date. Yeeah!" 357exit0 358fi 359;; 360esac 361 362# We are going to make a new commit. 363git var GIT_COMMITTER_IDENT >/dev/null ||exit 364 365# At this point, we need a real merge. No matter what strategy 366# we use, it would operate on the index, possibly affecting the 367# working tree, and when resolved cleanly, have the desired tree 368# in the index -- this means that the index must be in sync with 369# the $head commit. The strategies are responsible to ensure this. 370 371case"$use_strategies"in 372?*' '?*) 373# Stash away the local changes so that we can try more than one. 374 savestate 375 single_strategy=no 376;; 377*) 378rm-f"$GIT_DIR/MERGE_SAVE" 379 single_strategy=yes 380;; 381esac 382 383result_tree= best_cnt=-1 best_strategy= wt_strategy= 384merge_was_ok= 385for strategy in$use_strategies 386do 387test"$wt_strategy"=''|| { 388echo"Rewinding the tree to pristine..." 389 restorestate 390} 391case"$single_strategy"in 392 no) 393echo"Trying merge strategy$strategy..." 394;; 395esac 396 397# Remember which strategy left the state in the working tree 398 wt_strategy=$strategy 399 400 git-merge-$strategy $common--"$head_arg""$@" 401exit=$? 402iftest"$no_commit"= t &&test"$exit"=0 403then 404 merge_was_ok=t 405exit=1;# pretend it left conflicts. 406fi 407 408test"$exit"=0|| { 409 410# The backend exits with 1 when conflicts are left to be resolved, 411# with 2 when it does not handle the given merge at all. 412 413iftest"$exit"-eq1 414then 415 cnt=`{ 416 git-diff-files --name-only 417 git-ls-files --unmerged 418 } | wc -l` 419iftest$best_cnt-le0-o$cnt-le$best_cnt 420then 421 best_strategy=$strategy 422 best_cnt=$cnt 423fi 424fi 425continue 426} 427 428# Automerge succeeded. 429 result_tree=$(git-write-tree)&&break 430done 431 432# If we have a resulting tree, that means the strategy module 433# auto resolved the merge cleanly. 434iftest''!="$result_tree" 435then 436 parents=$(git-show-branch --independent "$head" "$@" | sed -e 's/^/-p /') 437 result_commit=$(printf '%s\n' "$merge_msg" | git-commit-tree $result_tree $parents)||exit 438 finish "$result_commit""Merge made by$wt_strategy." 439 dropsave 440exit0 441fi 442 443# Pick the result from the best strategy and have the user fix it up. 444case"$best_strategy"in 445'') 446 restorestate 447case"$use_strategies"in 448 ?*' '?*) 449echo>&2"No merge strategy handled the merge." 450;; 451*) 452echo>&2"Merge with strategy$use_strategiesfailed." 453;; 454esac 455exit2 456;; 457"$wt_strategy") 458# We already have its result in the working tree. 459;; 460*) 461echo"Rewinding the tree to pristine..." 462 restorestate 463echo"Using the$best_strategyto prepare resolving by hand." 464 git-merge-$best_strategy $common--"$head_arg""$@" 465;; 466esac 467 468iftest"$squash"= t 469then 470 finish 471else 472for remote 473do 474echo$remote 475done>"$GIT_DIR/MERGE_HEAD" 476printf'%s\n'"$merge_msg">"$GIT_DIR/MERGE_MSG" 477fi 478 479iftest"$merge_was_ok"= t 480then 481echo>&2 \ 482"Automatic merge went well; stopped before committing as requested" 483exit0 484else 485{ 486echo' 487Conflicts: 488' 489 git ls-files --unmerged| 490sed-e's/^[^ ]* / /'| 491uniq 492} >>"$GIT_DIR/MERGE_MSG" 493iftest -d"$GIT_DIR/rr-cache" 494then 495 git-rerere 496fi 497 die "Automatic merge failed; fix conflicts and then commit the result." 498fi