Andrew's git
/
gitweb.git
/ diff
summary
|
log
|
commit
| diff |
tree
commit
grep
author
committer
pickaxe
?
re
git-merge knows some strategies want to skip trivial merges
author
Junio C Hamano
<junkio@cox.net>
Sat, 18 Mar 2006 22:50:53 +0000
(14:50 -0800)
committer
Junio C Hamano
<junkio@cox.net>
Mon, 20 Mar 2006 08:50:37 +0000
(
00:50
-0800)
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>
git-merge.sh
patch
|
blob
|
history
raw
|
patch
|
inline
| side by side (parent:
fd662dd
)
diff --git
a/git-merge.sh
b/git-merge.sh
index cc0952a97db7d998a3f26e98b93cf2154887abd5..78ab422e4ef294d8bcffba91bb7e2116e381d98e 100755
(executable)
--- a/
git-merge.sh
+++ b/
git-merge.sh
@@
-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
all_strategies='resolve octopus stupid ours'
if test "@@NO_PYTHON@@"; then
all_strategies='resolve octopus stupid ours'
- default_strategies='resolve'
+ default_
twohead_
strategies='resolve'
fi
dropsave() {
fi
dropsave() {
@@
-90,8
+94,6
@@
do
shift
done
shift
done
-test "$#" -le 2 && usage ;# we need at least two heads.
-
merge_msg="$1"
shift
head_arg="$1"
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
shift
# All the rest are remote heads
+test "$#" = 0 && usage ;# we need at least one remote head.
+
remoteheads=
for remote
do
remoteheads=
for remote
do
@@
-108,6
+112,27
@@
do
done
set x $remoteheads ; shift
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 "$@")
case "$#" in
1)
common=$(git-merge-base --all $head "$@")
@@
-118,18
+143,21
@@
case "$#" in
esac
echo "$head" >"$GIT_DIR/ORIG_HEAD"
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.
;;
# 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."
dropsave
exit 0
;;
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
# 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
;;
dropsave
exit 0
;;
-1,?*"$LF"?*,*)
+
?,
1,?*"$LF"?*,*)
# We are not doing octopus and not fast forward. Need a
# real merge.
;;
# 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
# 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
# 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
# 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
# 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
result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents) || exit
finish "$result_commit" "Merge $result_commit, made by $wt_strategy."
dropsave