Linus doesn't like seeing unnecessary merges in his tree. I'm not a huge fan of them either. Wouldn't it be nice if we had a merge method that did a merge without creating a merge? I call it git-merge-subordinate (since my tree is subordinate to the tree I'm pulling from). I suppose you could call it 'slave' if you want to be more pithy. Anyway, this is a first attempt, and it's totally cargo-cult programming; I make no claim that I understand what I'm doing. But it does seem to work. While working on it, I found a small bug in git-merge. When no_trivial_merge_strategies has more than one component, setting index_merge to f doesn't work. So first, here's the patch to git-merge adding support for 'subordinate': --- /usr/bin/git-merge 2006-07-29 15:47:09.000000000 -0600 +++ /home/willy/bin/git-merge 2006-10-25 09:21:00.000000000 -0600 @@ -9,15 +9,15 @@ LF=' ' -all_strategies='recursive octopus resolve stupid ours' +all_strategies='recursive octopus resolve stupid subordinate ours' default_twohead_strategies='recursive' default_octopus_strategies='octopus' -no_trivial_merge_strategies='ours' +no_trivial_merge_strategies='subordinate ours' use_strategies= index_merge=t if test ""; then - all_strategies='resolve octopus stupid ours' + all_strategies='resolve octopus stupid subordinate ours' default_twohead_strategies='resolve' fi @@ -154,12 +154,15 @@ for s in $use_strategies do - case " $s " in - *" $no_trivial_merge_strategies "*) - index_merge=f - break - ;; - esac + for t in $no_trivial_merge_strategies + do + case "$s" in + "$t") + index_merge=f + break + ;; + esac + done done case "$#" in And now, here's the extremely lame git-merge-subordinate script. #!/bin/sh # # Copyright (c) 2005 Linus Torvalds # Copyright (c) 2005 Junio C Hamano # # Resolve two trees, using enhancd multi-base read-tree. # The first parameters up to -- are merge bases; the rest are heads. bases= head= remotes= sep_seen= for arg do case ",$sep_seen,$head,$arg," in *,--,) sep_seen=yes ;; ,yes,,*) head=$arg ;; ,yes,*) remotes="$remotes$arg " ;; *) bases="$bases$arg " ;; esac done # Give up if we are given more than two remotes -- not handling octopus. case "$remotes" in ?*' '?*) exit 2 ;; esac # Give up if this is a baseless merge. if test '' = "$bases" then exit 2 fi git-rebase $remotes || exit 2 if result_tree=$(git-write-tree 2>/dev/null) then exit 0 else echo "Simple merge failed, trying Automatic merge." if git-merge-index -o git-merge-one-file -a then exit 0 else exit 1 fi fi - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html