Merge branch 'jc/merge'

* jc/merge:
  git-merge knows some strategies want to skip trivial merges
maint
Junio C Hamano 2006-03-26 00:22:48 -08:00
commit 692c7fc9cb
1 changed files with 40 additions and 27 deletions

View File

@ -11,11 +11,15 @@ LF='
' '


all_strategies='recursive octopus resolve stupid ours' all_strategies='recursive octopus resolve stupid ours'
default_strategies='recursive' default_twohead_strategies='recursive'
default_octopus_strategies='octopus'
no_trivial_merge_strategies='ours'
use_strategies= use_strategies=

index_merge=t
if test "@@NO_PYTHON@@"; then if test "@@NO_PYTHON@@"; then
all_strategies='resolve octopus stupid ours' all_strategies='resolve octopus stupid ours'
default_strategies='resolve' default_twohead_strategies='resolve'
fi fi


dropsave() { dropsave() {
@ -90,8 +94,6 @@ do
shift shift
done done


test "$#" -le 2 && usage ;# we need at least two heads.

merge_msg="$1" merge_msg="$1"
shift shift
head_arg="$1" head_arg="$1"
@ -99,6 +101,8 @@ head=$(git-rev-parse --verify "$1"^0) || usage
shift shift


# All the rest are remote heads # All the rest are remote heads
test "$#" = 0 && usage ;# we need at least one remote head.

remoteheads= remoteheads=
for remote for remote
do do
@ -108,6 +112,27 @@ do
done done
set x $remoteheads ; shift set x $remoteheads ; shift


case "$use_strategies" in
'')
case "$#" in
1)
use_strategies="$default_twohead_strategies" ;;
*)
use_strategies="$default_octopus_strategies" ;;
esac
;;
esac

for s in $use_strategies
do
case " $s " in
*" $no_trivial_merge_strategies "*)
index_merge=f
break
;;
esac
done

case "$#" in case "$#" in
1) 1)
common=$(git-merge-base --all $head "$@") common=$(git-merge-base --all $head "$@")
@ -118,18 +143,21 @@ case "$#" in
esac esac
echo "$head" >"$GIT_DIR/ORIG_HEAD" echo "$head" >"$GIT_DIR/ORIG_HEAD"


case "$#,$common,$no_commit" in case "$index_merge,$#,$common,$no_commit" in
*,'',*) f,*)
# We've been told not to try anything clever. Skip to real merge.
;;
?,*,'',*)
# No common ancestors found. We need a real merge. # No common ancestors found. We need a real merge.
;; ;;
1,"$1",*) ?,1,"$1",*)
# If head can reach all the merge then we are up to date. # If head can reach all the merge then we are up to date.
# but first the most common case of merging one remote # but first the most common case of merging one remote.
echo "Already up-to-date." echo "Already up-to-date."
dropsave dropsave
exit 0 exit 0
;; ;;
1,"$head",*) ?,1,"$head",*)
# Again the most common case of merging one remote. # Again the most common case of merging one remote.
echo "Updating from $head to $1" echo "Updating from $head to $1"
git-update-index --refresh 2>/dev/null git-update-index --refresh 2>/dev/null
@ -139,11 +167,11 @@ case "$#,$common,$no_commit" in
dropsave dropsave
exit 0 exit 0
;; ;;
1,?*"$LF"?*,*) ?,1,?*"$LF"?*,*)
# We are not doing octopus and not fast forward. Need a # We are not doing octopus and not fast forward. Need a
# real merge. # real merge.
;; ;;
1,*,) ?,1,*,)
# We are not doing octopus, not fast forward, and have only # We are not doing octopus, not fast forward, and have only
# one common. See if it is really trivial. # one common. See if it is really trivial.
git var GIT_COMMITTER_IDENT >/dev/null || exit git var GIT_COMMITTER_IDENT >/dev/null || exit
@ -188,17 +216,6 @@ esac
# We are going to make a new commit. # We are going to make a new commit.
git var GIT_COMMITTER_IDENT >/dev/null || exit git var GIT_COMMITTER_IDENT >/dev/null || exit


case "$use_strategies" in
'')
case "$#" in
1)
use_strategies="$default_strategies" ;;
*)
use_strategies=octopus ;;
esac
;;
esac

# At this point, we need a real merge. No matter what strategy # At this point, we need a real merge. No matter what strategy
# we use, it would operate on the index, possibly affecting the # we use, it would operate on the index, possibly affecting the
# working tree, and when resolved cleanly, have the desired tree # working tree, and when resolved cleanly, have the desired tree
@ -270,11 +287,7 @@ done
# auto resolved the merge cleanly. # auto resolved the merge cleanly.
if test '' != "$result_tree" if test '' != "$result_tree"
then then
parents="-p $head" parents=$(git-show-branch --independent "$head" "$@" | sed -e 's/^/-p /')
for remote
do
parents="$parents -p $remote"
done
result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents) || exit result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents) || exit
finish "$result_commit" "Merge $result_commit, made by $wt_strategy." finish "$result_commit" "Merge $result_commit, made by $wt_strategy."
dropsave dropsave