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 111 then 112 echo "$rhbranch '$truname' (early part) of ." 113 elif test "$remote" = "FETCH_HEAD" -a -r "$GIT_DIR/FETCH_HEAD" 114 then 115 sed -e 's/ not-for-merge/ /' -e 1q \ 116 "$GIT_DIR/FETCH_HEAD" 117 else 118 echo "$rhcommit '$remote'" 119 fi 120} 121 122case "$#" in 0) usage ;; esac 123 124have_message= 125while case "$#" in 0) break ;; esac 126do 127 case "$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) 140 case "$#,$1" in 141 *,*=*) 142 strategy=`expr "z$1" : 'z-[^=]*=\(.*\)'` ;; 143 1,*) 144 usage ;; 145 *) 146 strategy="$2" 147 shift ;; 148 esac 149 case "$all_strategies" in 150 *"$strategy"*) 151 use_strategies="$use_strategies$strategy" ;; 152 *) 153 die "available strategies are:$all_strategies" ;; 154 esac 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) 161 shift 162 case "$#" in 163 1) usage ;; 164 esac 165 merge_msg="$1" 166 have_message=t 167 ;; 168 -*) usage ;; 169 *) break ;; 170 esac 171 shift 172done 173 174if test -z "$show_diffstat"; then 175 test "$(git config --bool merge.diffstat)" = false && show_diffstat=false 176 test -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 185if test -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)&& 188 test "$second_token" = "$head_commit" 189then 190 merge_msg="$1" 191 shift 192 head_arg="$1" 193 shift 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". 199 if test 1 -ne$# 200 then 201 echo >&2 "Can merge only exactly one commit into empty head" 202 exit 1 203 fi 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 210 exit 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 222 do 223 merge_name "$remote" 224 done | 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" 240 eval GITHEAD_$remotehead='"$remote"' 241 export GITHEAD_$remotehead 242done 243set x$remoteheads; shift 244 245case "$use_strategies" in 246'') 247 case "$#" in 248 1) 249 var="`git config --get pull.twohead`" 250 if test -n "$var" 251 then 252 use_strategies="$var" 253 else 254 use_strategies="$default_twohead_strategies" 255 fi ;; 256 *) 257 var="`git config --get pull.octopus`" 258 if test -n "$var" 259 then 260 use_strategies="$var" 261 else 262 use_strategies="$default_octopus_strategies" 263 fi ;; 264 esac 265 ;; 266esac 267 268for s in$use_strategies 269do 270 for ss in$no_fast_forward_strategies 271 do 272 case "$s" in 273 *"$ss"*) 274 allow_fast_forward=f 275 break 276 ;; 277 esac 278 done 279 for ss in$no_trivial_strategies 280 do 281 case "$s" in 282 *"$ss"*) 283 allow_trivial_merge=f 284 break 285 ;; 286 esac 287 done 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." 308 exit 0 309 ;; 310t,1,"$head",*) 311 # Again the most common case of merging one remote. 312 echo "Updating$(git rev-parse --short $head)..$(git rev-parse --short $1)" 313 git update-index --refresh 2>/dev/null 314 msg="Fast forward" 315 if test -n "$have_message" 316 then 317 msg="$msg(no commit created; -m option ignored)" 318 fi 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 323 exit 0 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 --refresh 2>/dev/null 333 case "$allow_trivial_merge" in 334 t) 335 # See if it is really trivial. 336 git var GIT_COMMITTER_IDENT >/dev/null || exit 337 echo "Trying really trivial in-index merge..." 338 if git read-tree --trivial -m -u -v$common$head"$1" && 339 result_tree=$(git write-tree) 340 then 341 echo "Wonderful." 342 result_commit=$( 343 printf '%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 348 exit 0 349 fi 350 echo "Nope." 351 esac 352 ;; 353*) 354 # An octopus. If we can reach all the remote we are up to date. 355 up_to_date=t 356 for remote 357 do 358 common_one=$(git merge-base --all $head $remote) 359 if test "$common_one" != "$remote" 360 then 361 up_to_date=f 362 break 363 fi 364 done 365 if test "$up_to_date" = t 366 then 367 finish_up_to_date "Already up-to-date. Yeeah!" 368 exit 0 369 fi 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$headcommit. 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*) 389 rm -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 398 test "$wt_strategy" = '' || { 399 echo "Rewinding the tree to pristine..." 400 restorestate 401 } 402 case "$single_strategy" in 403 no) 404 echo "Trying merge strategy$strategy..." 405 ;; 406 esac 407 408 # Remember which strategy left the state in the working tree 409 wt_strategy=$strategy 410 411 git-merge-$strategy$common-- "$head_arg" "$@" 412 exit=$? 413 if test "$no_commit" = t && test "$exit" = 0 414 then 415 merge_was_ok=t 416 exit=1 ;# pretend it left conflicts. 417 fi 418 419 test "$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 424 if test "$exit" -eq 1 425 then 426 cnt=`{ 427 git diff-files --name-only 428 git ls-files --unmerged 429 } | wc -l` 430 if test$best_cnt-le 0 -o$cnt-le$best_cnt 431 then 432 best_strategy=$strategy 433 best_cnt=$cnt 434 fi 435 fi 436 continue 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. 445if test '' != "$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 451 exit 0 452fi 453 454# Pick the result from the best strategy and have the user fix it up. 455case "$best_strategy" in 456'') 457 restorestate 458 case "$use_strategies" in 459 ?*''?*) 460 echo >&2 "No merge strategy handled the merge." 461 ;; 462 *) 463 echo >&2 "Merge with strategy$use_strategiesfailed." 464 ;; 465 esac 466 exit 2 467 ;; 468"$wt_strategy") 469 # We already have its result in the working tree. 470 ;; 471*) 472 echo "Rewinding the tree to pristine..." 473 restorestate 474 echo "Using the$best_strategyto prepare resolving by hand." 475 git-merge-$best_strategy$common-- "$head_arg" "$@" 476 ;; 477esac 478 479if test "$squash" = t 480then 481 finish 482else 483 for remote 484 do 485 echo$remote 486 done >"$GIT_DIR/MERGE_HEAD" 487 printf '%s\n' "$merge_msg" >"$GIT_DIR/MERGE_MSG" 488fi 489 490if test "$merge_was_ok" = t 491then 492 echo >&2 \ 493 "Automatic merge went well; stopped before committing as requested" 494 exit 0 495else 496 { 497 echo ' 498Conflicts: 499' 500 git ls-files --unmerged | 501 sed -e 's/^[^ ]* / /' | 502 uniq 503 } >>"$GIT_DIR/MERGE_MSG" 504 git rerere 505 die "Automatic merge failed; fix conflicts and then commit the result." 506fi