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 110then 111echo"$rhbranch '$truname' (early part) of ." 112eliftest"$remote"="FETCH_HEAD"-a -r"$GIT_DIR/FETCH_HEAD" 113then 114sed-e's/ not-for-merge / /'-e1q \ 115"$GIT_DIR/FETCH_HEAD" 116else 117echo"$rhcommit '$remote'" 118fi 119} 120 121case"$#"in0) usage ;;esac 122 123have_message= 124while case"$#"in0)break;;esac 125do 126case"$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) 137case"$#,$1"in 138*,*=*) 139 strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'`;; 1401,*) 141 usage ;; 142*) 143 strategy="$2" 144shift;; 145esac 146case"$all_strategies"in 147*"$strategy"*) 148 use_strategies="$use_strategies$strategy";; 149*) 150 die "available strategies are:$all_strategies";; 151esac 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) 158shift 159case"$#"in 1601) usage ;; 161esac 162 merge_msg="$1" 163 have_message=t 164;; 165-*) usage ;; 166*)break;; 167esac 168shift 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 177iftest -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) && 180test"$second_token"="$head_commit" 181then 182 merge_msg="$1" 183shift 184 head_arg="$1" 185shift 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". 191iftest1-ne$# 192then 193echo>&2"Can merge only exactly one commit into empty head" 194exit1 195fi 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 202exit 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 214do 215 merge_name "$remote" 216done| 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" 232eval GITHEAD_$remotehead='"$remote"' 233export GITHEAD_$remotehead 234done 235set x $remoteheads;shift 236 237case"$use_strategies"in 238'') 239case"$#"in 2401) 241 var="`git-config --get pull.twohead`" 242iftest -n"$var" 243then 244 use_strategies="$var" 245else 246 use_strategies="$default_twohead_strategies" 247fi;; 248*) 249 var="`git-config --get pull.octopus`" 250iftest -n"$var" 251then 252 use_strategies="$var" 253else 254 use_strategies="$default_octopus_strategies" 255fi;; 256esac 257;; 258esac 259 260for s in$use_strategies 261do 262for nt in$no_trivial_merge_strategies 263do 264case"$s"in 265*"$nt"*) 266 index_merge=f 267break 268;; 269esac 270done 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=$( 332echo"$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=$(echo"$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" 476echo"$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