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