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