| 1 | #!/bin/sh |
| 2 | # |
| 3 | # Copyright (c) 2005 Linus Torvalds |
| 4 | # Copyright (c) 2005 Junio C Hamano |
| 5 | # |
| 6 | # Resolve two trees, using enhanced multi-base read-tree. |
| 7 | |
| 8 | . git-sh-setup |
| 9 | |
| 10 | # Abort if index does not match HEAD |
| 11 | if ! git diff-index --quiet --cached HEAD -- |
| 12 | then |
| 13 | gettextln "Error: Your local changes to the following files would be overwritten by merge" |
| 14 | git diff-index --cached --name-only HEAD -- | sed -e 's/^/ /' |
| 15 | exit 2 |
| 16 | fi |
| 17 | |
| 18 | # The first parameters up to -- are merge bases; the rest are heads. |
| 19 | bases= head= remotes= sep_seen= |
| 20 | for arg |
| 21 | do |
| 22 | case ",$sep_seen,$head,$arg," in |
| 23 | *,--,) |
| 24 | sep_seen=yes |
| 25 | ;; |
| 26 | ,yes,,*) |
| 27 | head=$arg |
| 28 | ;; |
| 29 | ,yes,*) |
| 30 | remotes="$remotes$arg " |
| 31 | ;; |
| 32 | *) |
| 33 | bases="$bases$arg " |
| 34 | ;; |
| 35 | esac |
| 36 | done |
| 37 | |
| 38 | # Give up if we are given two or more remotes -- not handling octopus. |
| 39 | case "$remotes" in |
| 40 | ?*' '?*) |
| 41 | exit 2 ;; |
| 42 | esac |
| 43 | |
| 44 | # Give up if this is a baseless merge. |
| 45 | if test '' = "$bases" |
| 46 | then |
| 47 | exit 2 |
| 48 | fi |
| 49 | |
| 50 | git update-index -q --refresh |
| 51 | git read-tree -u -m --aggressive $bases $head $remotes || exit 2 |
| 52 | echo "Trying simple merge." |
| 53 | if result_tree=$(git write-tree 2>/dev/null) |
| 54 | then |
| 55 | exit 0 |
| 56 | else |
| 57 | echo "Simple merge failed, trying Automatic merge." |
| 58 | if git merge-index -o git-merge-one-file -a |
| 59 | then |
| 60 | exit 0 |
| 61 | else |
| 62 | exit 1 |
| 63 | fi |
| 64 | fi |