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