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