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_name=$(for remote 298 do 299 merge_name "$remote" 300 done | git fmt-merge-msg$log_arg 301 ) 302 merge_msg="${merge_msg:+$merge_msg$LF$LF}$merge_name" 303fi 304head=$(git rev-parse --verify "$head_arg"^0)|| usage 305 306# All the rest are remote heads 307test "$#" = 0 && usage ;# we need at least one remote head. 308set_reflog_action "merge $*" 309 310remoteheads= 311for remote 312do 313 remotehead=$(git rev-parse --verify "$remote"^0 2>/dev/null)|| 314 die "$remote- not something we can merge" 315 remoteheads="${remoteheads}$remotehead" 316 eval GITHEAD_$remotehead='"$remote"' 317 export GITHEAD_$remotehead 318done 319set x$remoteheads; shift 320 321case "$use_strategies" in 322'') 323 case "$#" in 324 1) 325 var="`git config --get pull.twohead`" 326 if test -n "$var" 327 then 328 use_strategies="$var" 329 else 330 use_strategies="$default_twohead_strategies" 331 fi ;; 332 *) 333 var="`git config --get pull.octopus`" 334 if test -n "$var" 335 then 336 use_strategies="$var" 337 else 338 use_strategies="$default_octopus_strategies" 339 fi ;; 340 esac 341 ;; 342esac 343 344for s in$use_strategies 345do 346 for ss in$no_fast_forward_strategies 347 do 348 case "$s" in 349 *"$ss"*) 350 allow_fast_forward=f 351 break 352 ;; 353 esac 354 done 355 for ss in$no_trivial_strategies 356 do 357 case "$s" in 358 *"$ss"*) 359 allow_trivial_merge=f 360 break 361 ;; 362 esac 363 done 364done 365 366case "$#" in 3671) 368 common=$(git merge-base --all $head "$@") 369 ;; 370*) 371 common=$(git show-branch --merge-base $head "$@") 372 ;; 373esac 374echo "$head" >"$GIT_DIR/ORIG_HEAD" 375 376case "$allow_fast_forward,$#,$common,$no_commit" in 377?,*,'',*) 378 # No common ancestors found. We need a real merge. 379 ;; 380?,1,"$1",*) 381 # If head can reach all the merge then we are up to date. 382 # but first the most common case of merging one remote. 383 finish_up_to_date "Already up-to-date." 384 exit 0 385 ;; 386t,1,"$head",*) 387 # Again the most common case of merging one remote. 388 echo "Updating$(git rev-parse --short $head)..$(git rev-parse --short $1)" 389 git update-index --refresh 2>/dev/null 390 msg="Fast-forward" 391 if test -n "$have_message" 392 then 393 msg="$msg(no commit created; -m option ignored)" 394 fi 395 new_head=$(git rev-parse --verify "$1^0")&& 396 git read-tree -v -m -u --exclude-per-directory=.gitignore$head"$new_head" && 397 finish "$new_head" "$msg" || exit 398 dropsave 399 exit 0 400 ;; 401?,1,?*"$LF"?*,*) 402 # We are not doing octopus and not fast-forward. Need a 403 # real merge. 404 ;; 405?,1,*,) 406 # We are not doing octopus, not fast-forward, and have only 407 # one common. 408 git update-index --refresh 2>/dev/null 409 case "$allow_trivial_merge" in 410 t) 411 # See if it is really trivial. 412 git var GIT_COMMITTER_IDENT >/dev/null || exit 413 echo "Trying really trivial in-index merge..." 414 if git read-tree --trivial -m -u -v$common$head"$1" && 415 result_tree=$(git write-tree) 416 then 417 echo "Wonderful." 418 result_commit=$( 419 printf '%s\n' "$merge_msg" | 420 git commit-tree$result_tree-p HEAD -p "$1" 421 ) || exit 422 finish "$result_commit" "In-index merge" 423 dropsave 424 exit 0 425 fi 426 echo "Nope." 427 esac 428 ;; 429*) 430 # An octopus. If we can reach all the remote we are up to date. 431 up_to_date=t 432 for remote 433 do 434 common_one=$(git merge-base --all $head $remote) 435 if test "$common_one" != "$remote" 436 then 437 up_to_date=f 438 break 439 fi 440 done 441 if test "$up_to_date" = t 442 then 443 finish_up_to_date "Already up-to-date. Yeeah!" 444 exit 0 445 fi 446 ;; 447esac 448 449# We are going to make a new commit. 450git var GIT_COMMITTER_IDENT >/dev/null || exit 451 452# At this point, we need a real merge. No matter what strategy 453# we use, it would operate on the index, possibly affecting the 454# working tree, and when resolved cleanly, have the desired tree 455# in the index -- this means that the index must be in sync with 456# the$headcommit. The strategies are responsible to ensure this. 457 458case "$use_strategies" in 459?*''?*) 460 # Stash away the local changes so that we can try more than one. 461 savestate 462 single_strategy=no 463 ;; 464*) 465 rm -f "$GIT_DIR/MERGE_STASH" 466 single_strategy=yes 467 ;; 468esac 469 470result_tree= best_cnt=-1 best_strategy= wt_strategy= 471merge_was_ok= 472for strategy in$use_strategies 473do 474 test "$wt_strategy" = '' || { 475 echo "Rewinding the tree to pristine..." 476 restorestate 477 } 478 case "$single_strategy" in 479 no) 480 echo "Trying merge strategy$strategy..." 481 ;; 482 esac 483 484 # Remember which strategy left the state in the working tree 485 wt_strategy=$strategy 486 487 eval 'git-merge-$strategy'"$xopt"'$common--"$head_arg""$@"' 488 exit=$? 489 if test "$no_commit" = t && test "$exit" = 0 490 then 491 merge_was_ok=t 492 exit=1 ;# pretend it left conflicts. 493 fi 494 495 test "$exit" = 0 || { 496 497 # The backend exits with 1 when conflicts are left to be resolved, 498 # with 2 when it does not handle the given merge at all. 499 500 if test "$exit" -eq 1 501 then 502 cnt=`{ 503 git diff-files --name-only 504 git ls-files --unmerged 505 } | wc -l` 506 if test$best_cnt-le 0 -o$cnt-le$best_cnt 507 then 508 best_strategy=$strategy 509 best_cnt=$cnt 510 fi 511 fi 512 continue 513 } 514 515 # Automerge succeeded. 516 result_tree=$(git write-tree)&& break 517done 518 519# If we have a resulting tree, that means the strategy module 520# auto resolved the merge cleanly. 521if test '' != "$result_tree" 522then 523 if test "$allow_fast_forward" = "t" 524 then 525 parents=$(git show-branch --independent "$head" "$@") 526 else 527 parents=$(git rev-parse "$head" "$@") 528 fi 529 parents=$(echo "$parents" | sed -e 's/^/-p /') 530 result_commit=$(printf '%s\n' "$merge_msg" | git commit-tree $result_tree $parents)|| exit 531 finish "$result_commit" "Merge made by$wt_strategy." 532 dropsave 533 exit 0 534fi 535 536# Pick the result from the best strategy and have the user fix it up. 537case "$best_strategy" in 538'') 539 restorestate 540 case "$use_strategies" in 541 ?*''?*) 542 echo >&2 "No merge strategy handled the merge." 543 ;; 544 *) 545 echo >&2 "Merge with strategy$use_strategiesfailed." 546 ;; 547 esac 548 exit 2 549 ;; 550"$wt_strategy") 551 # We already have its result in the working tree. 552 ;; 553*) 554 echo "Rewinding the tree to pristine..." 555 restorestate 556 echo "Using the$best_strategyto prepare resolving by hand." 557 git-merge-$best_strategy$common-- "$head_arg" "$@" 558 ;; 559esac 560 561if test "$squash" = t 562then 563 finish 564else 565 for remote 566 do 567 echo$remote 568 done >"$GIT_DIR/MERGE_HEAD" 569 printf '%s\n' "$merge_msg" >"$GIT_DIR/MERGE_MSG" 570fi 571 572if test "$merge_was_ok" = t 573then 574 echo >&2 \ 575 "Automatic merge went well; stopped before committing as requested" 576 exit 0 577else 578 { 579 echo ' 580Conflicts: 581' 582 git ls-files --unmerged | 583 sed -e 's/^[^ ]* / /' | 584 uniq 585 } >>"$GIT_DIR/MERGE_MSG" 586 git rerere 587 die "Automatic merge failed; fix conflicts and then commit the result." 588fi