branch: allow -f with -m and -d
[gitweb.git] / contrib / examples / git-merge.sh
index 5a2addd4e15da9f8204aae5f4bbdffd296b9c0f9..52f2aafb9d720723c1dc08e870f38ef495198fa3 100755 (executable)
@@ -16,6 +16,7 @@ squash               create a single commit instead of doing a merge
 commit               perform a commit if the merge succeeds (default)
 ff                   allow fast-forward (default)
 ff-only              abort if fast-forward is not possible
+rerere-autoupdate    update index with any reused conflict resolution
 s,strategy=          merge strategy to use
 X=                   option for selected merge strategy
 m,message=           message to be used for the merge commit (if any)
@@ -48,7 +49,7 @@ xopt=
 allow_fast_forward=t
 fast_forward_only=
 allow_trivial_merge=t
-squash= no_commit= log_arg=
+squash= no_commit= log_arg= rr_arg=
 
 dropsave() {
        rm -f -- "$GIT_DIR/MERGE_HEAD" "$GIT_DIR/MERGE_MSG" \
@@ -148,17 +149,19 @@ merge_name () {
        if found_ref=$(git rev-parse --symbolic-full-name --verify \
                                                        "$remote" 2>/dev/null)
        then
+               expanded=$(git check-ref-format --branch "$remote") ||
+                       exit
                if test "${found_ref#refs/heads/}" != "$found_ref"
                then
-                       echo "$rh               branch '$remote' of ."
+                       echo "$rh               branch '$expanded' of ."
                        return
                elif test "${found_ref#refs/remotes/}" != "$found_ref"
                then
-                       echo "$rh               remote branch '$remote' of ."
+                       echo "$rh               remote branch '$expanded' of ."
                        return
                fi
        fi
-       if test "$remote" = "FETCH_HEAD" -a -r "$GIT_DIR/FETCH_HEAD"
+       if test "$remote" = "FETCH_HEAD" && test -r "$GIT_DIR/FETCH_HEAD"
        then
                sed -e 's/      not-for-merge   /               /' -e 1q \
                        "$GIT_DIR/FETCH_HEAD"
@@ -198,6 +201,8 @@ parse_config () {
                        test "$allow_fast_forward" != f ||
                                die "You cannot combine --ff-only with --no-ff."
                        fast_forward_only=t ;;
+               --rerere-autoupdate|--no-rerere-autoupdate)
+                       rr_arg=$1 ;;
                -s|--strategy)
                        shift
                        case " $all_strategies " in
@@ -258,7 +263,7 @@ fi
 
 # This could be traditional "merge <msg> HEAD <commit>..."  and the
 # way we can tell it is to see if the second token is HEAD, but some
-# people might have misused the interface and used a committish that
+# people might have misused the interface and used a commit-ish that
 # is the same as HEAD there instead.  Traditional format never would
 # have "-m" so it is an additional safety measure to check for it.
 
@@ -336,7 +341,7 @@ case "$use_strategies" in
 '')
        case "$#" in
        1)
-               var="`git config --get pull.twohead`"
+               var="$(git config --get pull.twohead)"
                if test -n "$var"
                then
                        use_strategies="$var"
@@ -344,7 +349,7 @@ case "$use_strategies" in
                        use_strategies="$default_twohead_strategies"
                fi ;;
        *)
-               var="`git config --get pull.octopus`"
+               var="$(git config --get pull.octopus)"
                if test -n "$var"
                then
                        use_strategies="$var"
@@ -522,7 +527,7 @@ do
                git diff-files --name-only
                git ls-files --unmerged
            } | wc -l`
-           if test $best_cnt -le 0 -o $cnt -le $best_cnt
+           if test $best_cnt -le 0 || test $cnt -le $best_cnt
            then
                best_strategy=$strategy
                best_cnt=$cnt
@@ -610,6 +615,6 @@ Conflicts:
                sed -e 's/^[^   ]*      /       /' |
                uniq
        } >>"$GIT_DIR/MERGE_MSG"
-       git rerere
+       git rerere $rr_arg
        die "Automatic merge failed; fix conflicts and then commit the result."
 fi