git-merge knows some strategies want to skip trivial merges

Most notably "ours".  Also this makes sure we do not record
duplicated parents on the parent list of the resulting commit.

This is based on Mark Wooding's work, but does not change the UI
nor introduce new flags.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2006-03-18 14:50:53 -08:00
parent fd662dd500
commit 6ea23343ce

View file

@ -11,11 +11,15 @@ LF='
'
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=
index_merge=t
if test "@@NO_PYTHON@@"; then
all_strategies='resolve octopus stupid ours'
default_strategies='resolve'
default_twohead_strategies='resolve'
fi
dropsave() {
@ -90,8 +94,6 @@ do
shift
done
test "$#" -le 2 && usage ;# we need at least two heads.
merge_msg="$1"
shift
head_arg="$1"
@ -99,6 +101,8 @@ head=$(git-rev-parse --verify "$1"^0) || usage
shift
# All the rest are remote heads
test "$#" = 0 && usage ;# we need at least one remote head.
remoteheads=
for remote
do
@ -108,6 +112,27 @@ do
done
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
1)
common=$(git-merge-base --all $head "$@")
@ -118,18 +143,21 @@ case "$#" in
esac
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.
;;
1,"$1",*)
?,1,"$1",*)
# 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."
dropsave
exit 0
;;
1,"$head",*)
?,1,"$head",*)
# Again the most common case of merging one remote.
echo "Updating from $head to $1"
git-update-index --refresh 2>/dev/null
@ -139,11 +167,11 @@ case "$#,$common,$no_commit" in
dropsave
exit 0
;;
1,?*"$LF"?*,*)
?,1,?*"$LF"?*,*)
# We are not doing octopus and not fast forward. Need a
# real merge.
;;
1,*,)
?,1,*,)
# We are not doing octopus, not fast forward, and have only
# one common. See if it is really trivial.
git var GIT_COMMITTER_IDENT >/dev/null || exit
@ -188,17 +216,6 @@ esac
# We are going to make a new commit.
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
# we use, it would operate on the index, possibly affecting the
# working tree, and when resolved cleanly, have the desired tree
@ -270,11 +287,7 @@ done
# auto resolved the merge cleanly.
if test '' != "$result_tree"
then
parents="-p $head"
for remote
do
parents="$parents -p $remote"
done
parents=$(git-show-branch --independent "$head" "$@" | sed -e 's/^/-p /')
result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents) || exit
finish "$result_commit" "Merge $result_commit, made by $wt_strategy."
dropsave