{"thread":{"id":"14275","subject":"Question about git-merge-stupid","startedAt":"2008-07-03T12:33:14Z","lastAt":"2008-07-05T21:00:07Z","messageCount":7,"participants":["Miklos Vajna","Linus Torvalds","Junio C Hamano"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"82117","messageId":"20080703123314.GS4729@genesis.frugalware.org","threadId":"14275","inReplyTo":null,"subject":"Question about git-merge-stupid","fromName":"Miklos Vajna","fromEmail":"vmiklos@frugalware.org","sentAt":"2008-07-03T12:33:14Z","receivedAt":"2008-07-03T12:33:14Z","isPatch":false,"sender":{"key":"vmiklos@frugalware.org","avatar":"https://gravatar.com/avatar/401c1cbbb3a5d13e650c691a2c71d6fd0b80df1a01bc74d9f1972675dd58f2bd?d=mp&s=160"},"body":"Hi,\n\nI'm trying to understand what is the difference between different merge\nstrategies. git-merge-stupid is something I failed to understand from\nthe git history/code/documentation, so I'm asking here.\n\n1) From git history:\n\nIt seems git-merge-stupid was created by 2276aa6 when Junio renamed\n-resolve to -stupid and let -resolve use read-tree. Actually\n\n        git show 2276aa6:git-merge-stupid.sh\n\nsays -stupid uses read-tree as well.\n\n2) From code:\n\nIt seems -stupid is better than -resolve when there are multiple bases.\n-resolve just passes all bases to read-tree, while -stupid tries to find\nthe best one. It does it by counting unmerged entries and the less one\nis a better.\n\nHere is what I tried:\n\nA - B - C\n      X   \\\n  \\ D - E - F\n\n(Where 'A' adds 'a.c' while the contents 'a', etc.)\n\n$ git reset --hard e\n$ git merge -s resolve c\nTrying simple merge.\nMerge made by resolve.\n\nSo it seems resolve does not completely fail if there are multiple\nbases, either.\n\nI would like to write a testcase that ensures git-merge-stupid really\npicks the best base, but I don't know exactly in what situation can the\nnumber of unmerged entires differ.\n\n3) From documentation:\n\nActually -stupid is missing from Documentation/merge-strategies.txt. I\nplan to send a patch to add it, once I understnad what it does. :-)\n\nThanks.\n\n[ Writing to Linus as suggested by Dscho, adding Junio to CC as -\naccording to git log - both strategy created by him. ]\n"},{"id":"82135","messageId":"alpine.LFD.1.10.0807030947360.18105@woody.linux-foundation.org","threadId":"14275","inReplyTo":"20080703123314.GS4729@genesis.frugalware.org","subject":"Re: Question about git-merge-stupid","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-07-03T17:08:54Z","receivedAt":"2008-07-03T17:08:54Z","isPatch":false,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Thu, 3 Jul 2008, Miklos Vajna wrote:\n> \n> I'm trying to understand what is the difference between different merge\n> strategies. git-merge-stupid is something I failed to understand from\n> the git history/code/documentation, so I'm asking here.\n> \n> 1) From git history:\n> \n> It seems git-merge-stupid was created by 2276aa6 when Junio renamed\n> -resolve to -stupid and let -resolve use read-tree. Actually\n> \n>         git show 2276aa6:git-merge-stupid.sh\n> \n> says -stupid uses read-tree as well.\n\nI think -stupid should probably be removed.\n\nThe history of -stupid is from doing the simple single-tree resolve that \ngit-read-tree can do, but then doing the obvious hack of just trying to \npick the base that gives the least number of conflicts.\n\nHOWEVER. \n\n - in practice, there's seldom any actual point to it. In 99% of all \n   cases, you only have a single merge base anyway.\n\n - if you have a workflow that encourages criss-cross merges (which makes \n   the above \"in practice\" not be true), the common case will be that the \n   merge base doesn't much matter.\n\n - Counting conflicts by looking at the numbe of files that conflict is a \n   pretty stupid metric anyway. Yes, it's obvious, and yes, I bet there \n   are cases where it does the right thing, but I also bet there are cases \n   where it does the _wrong_ thing - it might pick a merge base with fewer \n   files conflicting, but with harder conflicts.\n\n - the \"recursive\" merge strategy simply handles things better. There's \n   not really any reason to use a \"pick random merge base that happens to \n   give least conflicts\", when the recursive strategy does something much \n   more natural.\n\nSo you shouldn't really compare -stupid to -resolve. You should compare \n-stupid to -recursive, and the latter is simply much better.\n\n> 2) From code:\n> \n> It seems -stupid is better than -resolve when there are multiple bases.\n\nMaybe. And maybe not.\n\n> $ git merge -s resolve c\n> Trying simple merge.\n> Merge made by resolve.\n> \n> So it seems resolve does not completely fail if there are multiple\n> bases, either.\n\nI think -resolve can handle up to 6 bases, or something like that. After \nthat it should fail with a \"I cannot read more than 8 trees\" or something \n(eight being the two trees to be merged, plus the six bases).\n\nAnd with multiple bases, it will already pick the best one on a per-file \nbasis (I think - I should know the threeway merge, but it is pretty \nconfusing code) rather than trying to pick one globally. Not pretty, but \nit's yet another reason why -stupid is actually stupid, and not worth it.\n\nSo -stupid in _theory_ can handle cases that -resolve cannot (more than \nsix bases), but (a) that doesn't happen and (b) you'd be better off with \n-recursive anyway.\n\n> 3) From documentation:\n> \n> Actually -stupid is missing from Documentation/merge-strategies.txt. I\n> plan to send a patch to add it, once I understnad what it does. :-)\n\nWell, see above. I think there's a reason why -stupid isn't even worth \ndocumenting. It might be better off just removed.\n\n\t\tLinus\n"},{"id":"82172","messageId":"1215127101-14932-1-git-send-email-vmiklos@frugalware.org","threadId":"14275","inReplyTo":"alpine.LFD.1.10.0807030947360.18105@woody.linux-foundation.org","subject":"[RFC/PATCH] Remove 'stupid' merge strategy.","fromName":"Miklos Vajna","fromEmail":"vmiklos@frugalware.org","sentAt":"2008-07-03T23:18:21Z","receivedAt":"2008-07-03T23:18:21Z","isPatch":true,"sender":{"key":"vmiklos@frugalware.org","avatar":"https://gravatar.com/avatar/401c1cbbb3a5d13e650c691a2c71d6fd0b80df1a01bc74d9f1972675dd58f2bd?d=mp&s=160"},"body":"As pointed out by Linus, this strategy tries to take the best merge\nbase, but 'recursive' just does it better. If one needs something more\nthan 'resolve' then he/she should really use 'recursive' and not\n'stupid'.\n---\n\nOn Thu, Jul 03, 2008 at 10:08:54AM -0700, Linus Torvalds <torvalds@linux-foundation.org> wrote:\n> I think -stupid should probably be removed.\n\nHere is an attempt to do so.\n\n> The history of -stupid is from doing the simple single-tree resolve\n> that\n> git-read-tree can do, but then doing the obvious hack of just trying\n> to\n> pick the base that gives the least number of conflicts.\n>\n> HOWEVER.\n>\n>  (...)\n\nThanks for the detailed answer.\n\n .gitignore          |    1 -\n Makefile            |    3 +-\n git-merge-stupid.sh |   80 ---------------------------------------------------\n 3 files changed, 1 insertions(+), 83 deletions(-)\n delete mode 100755 git-merge-stupid.sh\n\ndiff --git a/.gitignore b/.gitignore\nindex 4ff2fec..8054d9d 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -75,7 +75,6 @@ git-merge-one-file\n git-merge-ours\n git-merge-recursive\n git-merge-resolve\n-git-merge-stupid\n git-merge-subtree\n git-mergetool\n git-mktag\ndiff --git a/Makefile b/Makefile\nindex 78e08d3..bddd1a7 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -241,7 +241,6 @@ SCRIPT_SH += git-merge-octopus.sh\n SCRIPT_SH += git-merge-one-file.sh\n SCRIPT_SH += git-merge-resolve.sh\n SCRIPT_SH += git-merge.sh\n-SCRIPT_SH += git-merge-stupid.sh\n SCRIPT_SH += git-mergetool.sh\n SCRIPT_SH += git-parse-remote.sh\n SCRIPT_SH += git-pull.sh\n@@ -1429,7 +1428,7 @@ check-docs::\n \tdo \\\n \t\tcase \"$$v\" in \\\n \t\tgit-merge-octopus | git-merge-ours | git-merge-recursive | \\\n-\t\tgit-merge-resolve | git-merge-stupid | git-merge-subtree | \\\n+\t\tgit-merge-resolve | git-merge-subtree | \\\n \t\tgit-fsck-objects | git-init-db | \\\n \t\tgit-?*--?* ) continue ;; \\\n \t\tesac ; \\\ndiff --git a/git-merge-stupid.sh b/git-merge-stupid.sh\ndeleted file mode 100755\nindex f612d47..0000000\n--- a/git-merge-stupid.sh\n+++ /dev/null\n@@ -1,80 +0,0 @@\n-#!/bin/sh\n-#\n-# Copyright (c) 2005 Linus Torvalds\n-#\n-# Resolve two trees, 'stupid merge'.\n-\n-# The first parameters up to -- are merge bases; the rest are heads.\n-bases= head= remotes= sep_seen=\n-for arg\n-do\n-\tcase \",$sep_seen,$head,$arg,\" in\n-\t*,--,)\n-\t\tsep_seen=yes\n-\t\t;;\n-\t,yes,,*)\n-\t\thead=$arg\n-\t\t;;\n-\t,yes,*)\n-\t\tremotes=\"$remotes$arg \"\n-\t\t;;\n-\t*)\n-\t\tbases=\"$bases$arg \"\n-\t\t;;\n-\tesac\n-done\n-\n-# Give up if we are given two or more remotes -- not handling octopus.\n-case \"$remotes\" in\n-?*' '?*)\n-\texit 2 ;;\n-esac\n-\n-# Find an optimum merge base if there are more than one candidates.\n-case \"$bases\" in\n-?*' '?*)\n-\techo \"Trying to find the optimum merge base.\"\n-\tG=.tmp-index$$\n-\tbest=\n-\tbest_cnt=-1\n-\tfor c in $bases\n-\tdo\n-\t\trm -f $G\n-\t\tGIT_INDEX_FILE=$G git read-tree -m $c $head $remotes \\\n-\t\t\t 2>/dev/null ||\tcontinue\n-\t\t# Count the paths that are unmerged.\n-\t\tcnt=`GIT_INDEX_FILE=$G git ls-files --unmerged | wc -l`\n-\t\tif test $best_cnt -le 0 -o $cnt -le $best_cnt\n-\t\tthen\n-\t\t\tbest=$c\n-\t\t\tbest_cnt=$cnt\n-\t\t\tif test \"$best_cnt\" -eq 0\n-\t\t\tthen\n-\t\t\t\t# Cannot do any better than all trivial merge.\n-\t\t\t\tbreak\n-\t\t\tfi\n-\t\tfi\n-\tdone\n-\trm -f $G\n-\tcommon=\"$best\"\n-\t;;\n-*)\n-\tcommon=\"$bases\"\n-\t;;\n-esac\n-\n-git update-index --refresh 2>/dev/null\n-git read-tree -u -m $common $head $remotes || exit 2\n-echo \"Trying simple merge.\"\n-if result_tree=$(git write-tree  2>/dev/null)\n-then\n-\texit 0\n-else\n-\techo \"Simple merge failed, trying Automatic merge.\"\n-\tif git-merge-index -o git-merge-one-file -a\n-\tthen\n-\t\texit 0\n-\telse\n-\t\texit 1\n-\tfi\n-fi\n-- \n1.5.6.1\n"},{"id":"82177","messageId":"7v4p76y154.fsf@gitster.siamese.dyndns.org","threadId":"14275","inReplyTo":"alpine.LFD.1.10.0807030947360.18105@woody.linux-foundation.org","subject":"Re: Question about git-merge-stupid","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-07-03T23:54:31Z","receivedAt":"2008-07-03T23:54:31Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Linus Torvalds <torvalds@linux-foundation.org> writes:\n\n> Well, see above. I think there's a reason why -stupid isn't even worth \n> documenting. It might be better off just removed.\n\nIt is called stupid for a reason ;-).\n\nIt has been sitting there as an example for a long time, and I do\nnot think anybody minds removing it.\n"},{"id":"82180","messageId":"20080704000701.GX4729@genesis.frugalware.org","threadId":"14275","inReplyTo":"7v4p76y154.fsf@gitster.siamese.dyndns.org","subject":"Re: Question about git-merge-stupid","fromName":"Miklos Vajna","fromEmail":"vmiklos@frugalware.org","sentAt":"2008-07-04T00:07:01Z","receivedAt":"2008-07-04T00:07:01Z","isPatch":false,"sender":{"key":"vmiklos@frugalware.org","avatar":"https://gravatar.com/avatar/401c1cbbb3a5d13e650c691a2c71d6fd0b80df1a01bc74d9f1972675dd58f2bd?d=mp&s=160"},"body":"On Thu, Jul 03, 2008 at 04:54:31PM -0700, Junio C Hamano <gitster@pobox.com> wrote:\n> It is called stupid for a reason ;-).\n> \n> It has been sitting there as an example for a long time, and I do\n> not think anybody minds removing it.\n\nOK, then should I resend a patch that moves it to contrib/examples?\n"},{"id":"82286","messageId":"1215269031-19559-1-git-send-email-vmiklos@frugalware.org","threadId":"14275","inReplyTo":"20080704000701.GX4729@genesis.frugalware.org","subject":"[PATCH] Move 'stupid' merge strategy to contrib.","fromName":"Miklos Vajna","fromEmail":"vmiklos@frugalware.org","sentAt":"2008-07-05T14:43:51Z","receivedAt":"2008-07-05T14:43:51Z","isPatch":true,"sender":{"key":"vmiklos@frugalware.org","avatar":"https://gravatar.com/avatar/401c1cbbb3a5d13e650c691a2c71d6fd0b80df1a01bc74d9f1972675dd58f2bd?d=mp&s=160"},"body":"As pointed out by Linus, this strategy tries to take the best merge\nbase, but 'recursive' just does it better. If one needs something more\nthan 'resolve' then he/she should really use 'recursive' and not\n'stupid'.\n\nGiven that it may still serve as a good example, don't remove it, just\nmove it to contrib/examples.\n---\n\nOn Fri, Jul 04, 2008 at 02:07:01AM +0200, Miklos Vajna <vmiklos@frugalware.org> wrote:\n> On Thu, Jul 03, 2008 at 04:54:31PM -0700, Junio C Hamano\n> <gitster@pobox.com> wrote:\n> > It is called stupid for a reason ;-).\n> >\n> > It has been sitting there as an example for a long time, and I do\n> > not think anybody minds removing it.\n>\n> OK, then should I resend a patch that moves it to contrib/examples?\n\nHere is one.\n\n .gitignore                           |    1 -\n Makefile                             |    3 +-\n contrib/examples/git-merge-stupid.sh |   80 ++++++++++++++++++++++++++++++++++\n git-merge-stupid.sh                  |   80 ----------------------------------\n 4 files changed, 81 insertions(+), 83 deletions(-)\n create mode 100755 contrib/examples/git-merge-stupid.sh\n delete mode 100755 git-merge-stupid.sh\n\ndiff --git a/.gitignore b/.gitignore\nindex 4ff2fec..8054d9d 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -75,7 +75,6 @@ git-merge-one-file\n git-merge-ours\n git-merge-recursive\n git-merge-resolve\n-git-merge-stupid\n git-merge-subtree\n git-mergetool\n git-mktag\ndiff --git a/Makefile b/Makefile\nindex 78e08d3..bddd1a7 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -241,7 +241,6 @@ SCRIPT_SH += git-merge-octopus.sh\n SCRIPT_SH += git-merge-one-file.sh\n SCRIPT_SH += git-merge-resolve.sh\n SCRIPT_SH += git-merge.sh\n-SCRIPT_SH += git-merge-stupid.sh\n SCRIPT_SH += git-mergetool.sh\n SCRIPT_SH += git-parse-remote.sh\n SCRIPT_SH += git-pull.sh\n@@ -1429,7 +1428,7 @@ check-docs::\n \tdo \\\n \t\tcase \"$$v\" in \\\n \t\tgit-merge-octopus | git-merge-ours | git-merge-recursive | \\\n-\t\tgit-merge-resolve | git-merge-stupid | git-merge-subtree | \\\n+\t\tgit-merge-resolve | git-merge-subtree | \\\n \t\tgit-fsck-objects | git-init-db | \\\n \t\tgit-?*--?* ) continue ;; \\\n \t\tesac ; \\\ndiff --git a/contrib/examples/git-merge-stupid.sh b/contrib/examples/git-merge-stupid.sh\nnew file mode 100755\nindex 0000000..f612d47\n--- /dev/null\n+++ b/contrib/examples/git-merge-stupid.sh\n@@ -0,0 +1,80 @@\n+#!/bin/sh\n+#\n+# Copyright (c) 2005 Linus Torvalds\n+#\n+# Resolve two trees, 'stupid merge'.\n+\n+# The first parameters up to -- are merge bases; the rest are heads.\n+bases= head= remotes= sep_seen=\n+for arg\n+do\n+\tcase \",$sep_seen,$head,$arg,\" in\n+\t*,--,)\n+\t\tsep_seen=yes\n+\t\t;;\n+\t,yes,,*)\n+\t\thead=$arg\n+\t\t;;\n+\t,yes,*)\n+\t\tremotes=\"$remotes$arg \"\n+\t\t;;\n+\t*)\n+\t\tbases=\"$bases$arg \"\n+\t\t;;\n+\tesac\n+done\n+\n+# Give up if we are given two or more remotes -- not handling octopus.\n+case \"$remotes\" in\n+?*' '?*)\n+\texit 2 ;;\n+esac\n+\n+# Find an optimum merge base if there are more than one candidates.\n+case \"$bases\" in\n+?*' '?*)\n+\techo \"Trying to find the optimum merge base.\"\n+\tG=.tmp-index$$\n+\tbest=\n+\tbest_cnt=-1\n+\tfor c in $bases\n+\tdo\n+\t\trm -f $G\n+\t\tGIT_INDEX_FILE=$G git read-tree -m $c $head $remotes \\\n+\t\t\t 2>/dev/null ||\tcontinue\n+\t\t# Count the paths that are unmerged.\n+\t\tcnt=`GIT_INDEX_FILE=$G git ls-files --unmerged | wc -l`\n+\t\tif test $best_cnt -le 0 -o $cnt -le $best_cnt\n+\t\tthen\n+\t\t\tbest=$c\n+\t\t\tbest_cnt=$cnt\n+\t\t\tif test \"$best_cnt\" -eq 0\n+\t\t\tthen\n+\t\t\t\t# Cannot do any better than all trivial merge.\n+\t\t\t\tbreak\n+\t\t\tfi\n+\t\tfi\n+\tdone\n+\trm -f $G\n+\tcommon=\"$best\"\n+\t;;\n+*)\n+\tcommon=\"$bases\"\n+\t;;\n+esac\n+\n+git update-index --refresh 2>/dev/null\n+git read-tree -u -m $common $head $remotes || exit 2\n+echo \"Trying simple merge.\"\n+if result_tree=$(git write-tree  2>/dev/null)\n+then\n+\texit 0\n+else\n+\techo \"Simple merge failed, trying Automatic merge.\"\n+\tif git-merge-index -o git-merge-one-file -a\n+\tthen\n+\t\texit 0\n+\telse\n+\t\texit 1\n+\tfi\n+fi\ndiff --git a/git-merge-stupid.sh b/git-merge-stupid.sh\ndeleted file mode 100755\nindex f612d47..0000000\n--- a/git-merge-stupid.sh\n+++ /dev/null\n@@ -1,80 +0,0 @@\n-#!/bin/sh\n-#\n-# Copyright (c) 2005 Linus Torvalds\n-#\n-# Resolve two trees, 'stupid merge'.\n-\n-# The first parameters up to -- are merge bases; the rest are heads.\n-bases= head= remotes= sep_seen=\n-for arg\n-do\n-\tcase \",$sep_seen,$head,$arg,\" in\n-\t*,--,)\n-\t\tsep_seen=yes\n-\t\t;;\n-\t,yes,,*)\n-\t\thead=$arg\n-\t\t;;\n-\t,yes,*)\n-\t\tremotes=\"$remotes$arg \"\n-\t\t;;\n-\t*)\n-\t\tbases=\"$bases$arg \"\n-\t\t;;\n-\tesac\n-done\n-\n-# Give up if we are given two or more remotes -- not handling octopus.\n-case \"$remotes\" in\n-?*' '?*)\n-\texit 2 ;;\n-esac\n-\n-# Find an optimum merge base if there are more than one candidates.\n-case \"$bases\" in\n-?*' '?*)\n-\techo \"Trying to find the optimum merge base.\"\n-\tG=.tmp-index$$\n-\tbest=\n-\tbest_cnt=-1\n-\tfor c in $bases\n-\tdo\n-\t\trm -f $G\n-\t\tGIT_INDEX_FILE=$G git read-tree -m $c $head $remotes \\\n-\t\t\t 2>/dev/null ||\tcontinue\n-\t\t# Count the paths that are unmerged.\n-\t\tcnt=`GIT_INDEX_FILE=$G git ls-files --unmerged | wc -l`\n-\t\tif test $best_cnt -le 0 -o $cnt -le $best_cnt\n-\t\tthen\n-\t\t\tbest=$c\n-\t\t\tbest_cnt=$cnt\n-\t\t\tif test \"$best_cnt\" -eq 0\n-\t\t\tthen\n-\t\t\t\t# Cannot do any better than all trivial merge.\n-\t\t\t\tbreak\n-\t\t\tfi\n-\t\tfi\n-\tdone\n-\trm -f $G\n-\tcommon=\"$best\"\n-\t;;\n-*)\n-\tcommon=\"$bases\"\n-\t;;\n-esac\n-\n-git update-index --refresh 2>/dev/null\n-git read-tree -u -m $common $head $remotes || exit 2\n-echo \"Trying simple merge.\"\n-if result_tree=$(git write-tree  2>/dev/null)\n-then\n-\texit 0\n-else\n-\techo \"Simple merge failed, trying Automatic merge.\"\n-\tif git-merge-index -o git-merge-one-file -a\n-\tthen\n-\t\texit 0\n-\telse\n-\t\texit 1\n-\tfi\n-fi\n-- \n1.5.6.1.322.ge904b.dirty\n"},{"id":"82304","messageId":"1215291607-20781-1-git-send-email-vmiklos@frugalware.org","threadId":"14275","inReplyTo":"1215269031-19559-1-git-send-email-vmiklos@frugalware.org","subject":"[PATCH] Move 'stupid' merge strategy to contrib.","fromName":"Miklos Vajna","fromEmail":"vmiklos@frugalware.org","sentAt":"2008-07-05T21:00:07Z","receivedAt":"2008-07-05T21:00:07Z","isPatch":true,"sender":{"key":"vmiklos@frugalware.org","avatar":"https://gravatar.com/avatar/401c1cbbb3a5d13e650c691a2c71d6fd0b80df1a01bc74d9f1972675dd58f2bd?d=mp&s=160"},"body":"As pointed out by Linus, this strategy tries to take the best merge\nbase, but 'recursive' just does it better. If one needs something more\nthan 'resolve' then he/she should really use 'recursive' and not\n'stupid'.\n\nGiven that it may still serve as a good example, don't remove it, just\nmove it to contrib/examples.\n---\n\nn Sat, Jul 05, 2008 at 04:43:51PM +0200, Miklos Vajna <vmiklos@frugalware.org> wrote:\n> Here is one.\n\nOops, I forgot -M with format-patch.\n\n .gitignore                                         |    1 -\n Makefile                                           |    3 +--\n .../examples/git-merge-stupid.sh                   |    0\n 3 files changed, 1 insertions(+), 3 deletions(-)\n rename git-merge-stupid.sh => contrib/examples/git-merge-stupid.sh (100%)\n\ndiff --git a/.gitignore b/.gitignore\nindex 4ff2fec..8054d9d 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -75,7 +75,6 @@ git-merge-one-file\n git-merge-ours\n git-merge-recursive\n git-merge-resolve\n-git-merge-stupid\n git-merge-subtree\n git-mergetool\n git-mktag\ndiff --git a/Makefile b/Makefile\nindex 78e08d3..bddd1a7 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -241,7 +241,6 @@ SCRIPT_SH += git-merge-octopus.sh\n SCRIPT_SH += git-merge-one-file.sh\n SCRIPT_SH += git-merge-resolve.sh\n SCRIPT_SH += git-merge.sh\n-SCRIPT_SH += git-merge-stupid.sh\n SCRIPT_SH += git-mergetool.sh\n SCRIPT_SH += git-parse-remote.sh\n SCRIPT_SH += git-pull.sh\n@@ -1429,7 +1428,7 @@ check-docs::\n \tdo \\\n \t\tcase \"$$v\" in \\\n \t\tgit-merge-octopus | git-merge-ours | git-merge-recursive | \\\n-\t\tgit-merge-resolve | git-merge-stupid | git-merge-subtree | \\\n+\t\tgit-merge-resolve | git-merge-subtree | \\\n \t\tgit-fsck-objects | git-init-db | \\\n \t\tgit-?*--?* ) continue ;; \\\n \t\tesac ; \\\ndiff --git a/git-merge-stupid.sh b/contrib/examples/git-merge-stupid.sh\nsimilarity index 100%\nrename from git-merge-stupid.sh\nrename to contrib/examples/git-merge-stupid.sh\n-- \n1.5.6.1.322.ge904b.dirty\n"}]}