{"thread":{"id":"34678","subject":"[PATCH 0/3] fix interactive rebase short SHA-1 collision bug","startedAt":"2013-08-12T04:07:36Z","lastAt":"2013-08-12T07:40:50Z","messageCount":8,"participants":["Eric Sunshine","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":3},"messages":[{"id":"225066","messageId":"1376280459-55188-1-git-send-email-sunshine@sunshineco.com","threadId":"34678","inReplyTo":null,"subject":"[PATCH 0/3] fix interactive rebase short SHA-1 collision bug","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2013-08-12T04:07:36Z","receivedAt":"2013-08-12T04:07:36Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"This series addresses a bug [1][2] which can manifest during interactive\nrebase when the prefix of the new SHA-1 of an edited commit is shared\nwith the abbreviated SHA-1 of a subsequent commit in the 'todo' list.\nWhen rebase attempts to process the subsequent command, it dies with a\n\"short SHA1 badbeef is ambiguous\" error.\n\npatch 1: fix a problem in the interactive rebase test suite which can\n    make subsequent tests fail\n\npatch 2: add a test demonstrating the short SHA-1 collision bug\n\npatch 3: fix the bug (this patch is from Junio [3] but augmented also to\n    fix up \"rebase --edit-todo\")\n\n[1]: http://thread.gmane.org/gmane.comp.version-control.git/229091\n[2]: http://thread.gmane.org/gmane.comp.version-control.git/232012\n[3]: http://thread.gmane.org/gmane.comp.version-control.git/229091/focus=229120\n\nEric Sunshine (2):\n  t3404: restore specialized rebase-editor following commentchar test\n  t3404: rebase: interactive: demonstrate short SHA-1 collision\n\nJunio C Hamano (1):\n  rebase: interactive: fix short SHA-1 collision\n\n git-rebase--interactive.sh    | 30 ++++++++++++++++++++++++++++++\n t/t3404-rebase-interactive.sh | 18 ++++++++++++++++++\n 2 files changed, 48 insertions(+)\n\n-- \n1.8.4.rc2.460.ga591f4a\n"},{"id":"225067","messageId":"1376280459-55188-2-git-send-email-sunshine@sunshineco.com","threadId":"34678","inReplyTo":"1376280459-55188-1-git-send-email-sunshine@sunshineco.com","subject":"[PATCH 1/3] t3404: restore specialized rebase-editor following commentchar test","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2013-08-12T04:07:37Z","receivedAt":"2013-08-12T04:07:37Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"At start of script, t3404 installs a specialized test-editor ($EDITOR)\nupon which many of the interactive rebase tests depend.  Late in t3404,\ntest \"rebase -i respects core.commentchar\" installs its own custom\neditor but neglects to restore the specialized editor when finished.\nThis oversight will cause later tests, which require the specialized\neditor, to fail.  (There are no such tests presently, but a subsequent\npatch will introduce one.)  Fix this problem.\n\nSigned-off-by: Eric Sunshine <sunshine@sunshineco.com>\n---\n t/t3404-rebase-interactive.sh | 1 +\n 1 file changed, 1 insertion(+)\n\ndiff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\nindex 49ccb38..af141be 100755\n--- a/t/t3404-rebase-interactive.sh\n+++ b/t/t3404-rebase-interactive.sh\n@@ -949,6 +949,7 @@ test_expect_success 'rebase -i respects core.commentchar' '\n \tsed -e \"2,\\$s/^/\\\\\\\\/\" \"$1\" >\"$1.tmp\" &&\n \tmv \"$1.tmp\" \"$1\"\n \tEOF\n+\ttest_when_finished \"set_fake_editor\" &&\n \ttest_set_editor \"$(pwd)/remove-all-but-first.sh\" &&\n \tgit rebase -i B &&\n \ttest B = $(git cat-file commit HEAD^ | sed -ne \\$p)\n-- \n1.8.4.rc2.460.ga591f4a\n"},{"id":"225068","messageId":"1376280459-55188-3-git-send-email-sunshine@sunshineco.com","threadId":"34678","inReplyTo":"1376280459-55188-1-git-send-email-sunshine@sunshineco.com","subject":"[PATCH 2/3] t3404: rebase: interactive: demonstrate short SHA-1 collision","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2013-08-12T04:07:38Z","receivedAt":"2013-08-12T04:07:38Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"The 'todo' sheet for interactive rebase shows abbreviated SHA-1's and\nthen performs its operations upon those shortened values. This can lead\nto an abort if the SHA-1 of a reworded or edited commit is no longer\nunique within the abbreviated SHA-1 space and a subsequent SHA-1 in the\ntodo list has the same abbreviated value.\n\nFor example:\n\n  edit f00dfad first\n  pick badbeef second\n\nIf, after editing, the new SHA-1 of \"first\" is now\nbadbeef5ba78983324dff5265c80c4490d5a809a, then the subsequent 'pick\nbadbeef second' will fail since badbeef is no longer a unique SHA-1\nabbreviation:\n\n  error: short SHA1 badbeef is ambiguous.\n  fatal: Needed a single revision\n  Invalid commit name: badbeef\n\nDemonstrate this problem with a couple of specially crafted commits\nwhich initially have distinct abbreviated SHA-1's, but for which the\nabbreviated SHA-1's collide after a simple rewording of the first\ncommit's message.\n\nSigned-off-by: Eric Sunshine <sunshine@sunshineco.com>\n---\n t/t3404-rebase-interactive.sh | 17 +++++++++++++++++\n 1 file changed, 17 insertions(+)\n\ndiff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\nindex af141be..e5ebec6 100755\n--- a/t/t3404-rebase-interactive.sh\n+++ b/t/t3404-rebase-interactive.sh\n@@ -977,4 +977,21 @@ test_expect_success 'rebase -i with --strategy and -X' '\n \ttest $(cat file1) = Z\n '\n \n+test_expect_success 'short SHA-1 setup' '\n+\ttest_when_finished \"git checkout master\" &&\n+\tgit checkout --orphan collide &&\n+\tgit rm -rf . &&\n+\tunset test_tick &&\n+\ttest_commit collide1 collide &&\n+\ttest_commit --notick collide2 collide &&\n+\ttest_commit --notick \"collide3 115158b5\" collide collide3 collide3\n+'\n+\n+test_expect_failure 'short SHA-1 collide' '\n+\ttest_when_finished \"reset_rebase && git checkout master\" &&\n+\tgit checkout collide &&\n+\tFAKE_COMMIT_MESSAGE=\"collide2 815200e\" \\\n+\tFAKE_LINES=\"reword 1 2\" git rebase -i HEAD~2\n+'\n+\n test_done\n-- \n1.8.4.rc2.460.ga591f4a\n"},{"id":"225069","messageId":"1376280459-55188-4-git-send-email-sunshine@sunshineco.com","threadId":"34678","inReplyTo":"1376280459-55188-1-git-send-email-sunshine@sunshineco.com","subject":"[PATCH 3/3] rebase: interactive: fix short SHA-1 collision","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2013-08-12T04:07:39Z","receivedAt":"2013-08-12T04:07:39Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"From: Junio C Hamano <gitster@pobox.com>\n\nThe 'todo' sheet for interactive rebase shows abbreviated SHA-1's and\nthen performs its operations upon those shortened values. This can lead\nto an abort if the SHA-1 of a reworded or edited commit is no longer\nunique within the abbreviated SHA-1 space and a subsequent SHA-1 in the\ntodo list has the same abbreviated value.\n\nFor example:\n\n  edit f00dfad first\n  pick badbeef second\n\nIf, after editing, the new SHA-1 of \"first\" is now\nbadbeef5ba78983324dff5265c80c4490d5a809a, then the subsequent 'pick\nbadbeef second' will fail since badbeef is no longer a unique SHA-1\nabbreviation:\n\n  error: short SHA1 badbeef is ambiguous.\n  fatal: Needed a single revision\n  Invalid commit name: badbeef\n\nFix this problem by expanding the SHA-1's in the todo list before\nperforming the operations.\n\n[es: also collapse & expand SHA-1's for --edit-todo]\n\nSigned-off-by: Eric Sunshine <sunshine@sunshineco.com>\n---\n git-rebase--interactive.sh    | 30 ++++++++++++++++++++++++++++++\n t/t3404-rebase-interactive.sh |  2 +-\n 2 files changed, 31 insertions(+), 1 deletion(-)\n\ndiff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh\nindex 83d6d46..ea11e62 100644\n--- a/git-rebase--interactive.sh\n+++ b/git-rebase--interactive.sh\n@@ -689,6 +689,32 @@ skip_unnecessary_picks () {\n \tdie \"Could not skip unnecessary pick commands\"\n }\n \n+transform_todo_ids () {\n+\twhile read -r command rest\n+\tdo\n+\t\tcase \"$command\" in\n+\t\t'#'* | exec)\n+\t\t\t# Be careful for oddball commands like 'exec'\n+\t\t\t# that do not have a SHA-1 at the beginning of $rest.\n+\t\t\t;;\n+\t\t*)\n+\t\t\tsha1=$(git rev-parse --verify --quiet \"$@\" ${rest%% *}) &&\n+\t\t\trest=\"$sha1 ${rest#* }\"\n+\t\t\t;;\n+\t\tesac\n+\t\tprintf '%s\\n' \"$command${rest:+ }$rest\"\n+\tdone <\"$todo\" >\"$todo.new\" &&\n+\tmv -f \"$todo.new\" \"$todo\"\n+}\n+\n+expand_todo_ids() {\n+\ttransform_todo_ids\n+}\n+\n+collapse_todo_ids() {\n+\ttransform_todo_ids --short=7\n+}\n+\n # Rearrange the todo list that has both \"pick sha1 msg\" and\n # \"pick sha1 fixup!/squash! msg\" appears in it so that the latter\n # comes immediately after the former, and change \"pick\" to\n@@ -841,6 +867,7 @@ skip)\n edit-todo)\n \tgit stripspace --strip-comments <\"$todo\" >\"$todo\".new\n \tmv -f \"$todo\".new \"$todo\"\n+\tcollapse_todo_ids\n \tappend_todo_help\n \tgit stripspace --comment-lines >>\"$todo\" <<\\EOF\n \n@@ -852,6 +879,7 @@ EOF\n \n \tgit_sequence_editor \"$todo\" ||\n \t\tdie \"Could not execute editor\"\n+\texpand_todo_ids\n \n \texit\n \t;;\n@@ -1008,6 +1036,8 @@ git_sequence_editor \"$todo\" ||\n has_action \"$todo\" ||\n \tdie_abort \"Nothing to do\"\n \n+expand_todo_ids\n+\n test -d \"$rewritten\" || test -n \"$force_rebase\" || skip_unnecessary_picks\n \n GIT_REFLOG_ACTION=\"$GIT_REFLOG_ACTION: checkout $onto_name\"\ndiff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\nindex e5ebec6..db56db3 100755\n--- a/t/t3404-rebase-interactive.sh\n+++ b/t/t3404-rebase-interactive.sh\n@@ -987,7 +987,7 @@ test_expect_success 'short SHA-1 setup' '\n \ttest_commit --notick \"collide3 115158b5\" collide collide3 collide3\n '\n \n-test_expect_failure 'short SHA-1 collide' '\n+test_expect_success 'short SHA-1 collide' '\n \ttest_when_finished \"reset_rebase && git checkout master\" &&\n \tgit checkout collide &&\n \tFAKE_COMMIT_MESSAGE=\"collide2 815200e\" \\\n-- \n1.8.4.rc2.460.ga591f4a\n"},{"id":"225077","messageId":"7v4nav1kzx.fsf@alter.siamese.dyndns.org","threadId":"34678","inReplyTo":"1376280459-55188-2-git-send-email-sunshine@sunshineco.com","subject":"Re: [PATCH 1/3] t3404: restore specialized rebase-editor following commentchar test","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2013-08-12T06:28:02Z","receivedAt":"2013-08-12T06:28:02Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Eric Sunshine <sunshine@sunshineco.com> writes:\n\n> At start of script, t3404 installs a specialized test-editor ($EDITOR)\n> upon which many of the interactive rebase tests depend.  Late in t3404,\n> test \"rebase -i respects core.commentchar\" installs its own custom\n> editor but neglects to restore the specialized editor when finished.\n> This oversight will cause later tests, which require the specialized\n> editor, to fail. \n\nThat is not oversight but was deliberately done knowing that it will\nbe the last test (and new tests can be added before it).\n\nI think the patch is one way to give _known_ status to later tests\nby declaring the editor installed by \"set_fake_editor\" the gold\nstandard, but isn't a better alternative to make sure that any newly\nadded tests after this point (or before the commentchar tests, for\nthat matter) set a fake editor it wants to use explicitly?\n\n> (There are no such tests presently, but a subsequent\n> patch will introduce one.)  Fix this problem.\n>\n> Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>\n> ---\n>  t/t3404-rebase-interactive.sh | 1 +\n>  1 file changed, 1 insertion(+)\n>\n> diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\n> index 49ccb38..af141be 100755\n> --- a/t/t3404-rebase-interactive.sh\n> +++ b/t/t3404-rebase-interactive.sh\n> @@ -949,6 +949,7 @@ test_expect_success 'rebase -i respects core.commentchar' '\n>  \tsed -e \"2,\\$s/^/\\\\\\\\/\" \"$1\" >\"$1.tmp\" &&\n>  \tmv \"$1.tmp\" \"$1\"\n>  \tEOF\n> +\ttest_when_finished \"set_fake_editor\" &&\n>  \ttest_set_editor \"$(pwd)/remove-all-but-first.sh\" &&\n>  \tgit rebase -i B &&\n>  \ttest B = $(git cat-file commit HEAD^ | sed -ne \\$p)\n"},{"id":"225078","messageId":"7vzjsnzagj.fsf@alter.siamese.dyndns.org","threadId":"34678","inReplyTo":"1376280459-55188-3-git-send-email-sunshine@sunshineco.com","subject":"Re: [PATCH 2/3] t3404: rebase: interactive: demonstrate short SHA-1 collision","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2013-08-12T06:31:40Z","receivedAt":"2013-08-12T06:31:40Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Eric Sunshine <sunshine@sunshineco.com> writes:\n\n> The 'todo' sheet for interactive rebase shows abbreviated SHA-1's and\n> then performs its operations upon those shortened values. This can lead\n> to an abort if the SHA-1 of a reworded or edited commit is no longer\n> unique within the abbreviated SHA-1 space and a subsequent SHA-1 in the\n> todo list has the same abbreviated value.\n>\n> For example:\n>\n>   edit f00dfad first\n>   pick badbeef second\n>\n> If, after editing, the new SHA-1 of \"first\" is now\n> badbeef5ba78983324dff5265c80c4490d5a809a, then the subsequent 'pick\n> badbeef second' will fail since badbeef is no longer a unique SHA-1\n> abbreviation:\n>\n>   error: short SHA1 badbeef is ambiguous.\n>   fatal: Needed a single revision\n>   Invalid commit name: badbeef\n>\n> Demonstrate this problem with a couple of specially crafted commits\n> which initially have distinct abbreviated SHA-1's, but for which the\n> abbreviated SHA-1's collide after a simple rewording of the first\n> commit's message.\n>\n> Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>\n> ---\n>  t/t3404-rebase-interactive.sh | 17 +++++++++++++++++\n>  1 file changed, 17 insertions(+)\n>\n> diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\n> index af141be..e5ebec6 100755\n> --- a/t/t3404-rebase-interactive.sh\n> +++ b/t/t3404-rebase-interactive.sh\n> @@ -977,4 +977,21 @@ test_expect_success 'rebase -i with --strategy and -X' '\n>  \ttest $(cat file1) = Z\n>  '\n>  \n> +test_expect_success 'short SHA-1 setup' '\n> +\ttest_when_finished \"git checkout master\" &&\n> +\tgit checkout --orphan collide &&\n> +\tgit rm -rf . &&\n> +\tunset test_tick &&\n\nThis will inconvenience tests added later to these two in the\nfuture.  Oversight, or deliberate act knowing that these two are the\nlast tests in this script ;-)?\n\nOne bad thing is that \"unset\" loses information so that such future\ntests cannot resurrect test_tick and continue on from where the last\ntest-tick left off.\n\n> +\ttest_commit collide1 collide &&\n> +\ttest_commit --notick collide2 collide &&\n> +\ttest_commit --notick \"collide3 115158b5\" collide collide3 collide3\n> +'\n>\n> +test_expect_failure 'short SHA-1 collide' '\n> +\ttest_when_finished \"reset_rebase && git checkout master\" &&\n> +\tgit checkout collide &&\n> +\tFAKE_COMMIT_MESSAGE=\"collide2 815200e\" \\\n\n;-)\n\n> +\tFAKE_LINES=\"reword 1 2\" git rebase -i HEAD~2\n> +'\n> +\n>  test_done\n"},{"id":"225082","messageId":"CAPig+cQpNTFr91wp8DxYs3tabmj4xdmqTQ4_ZoNhp-4+0BUKCA@mail.gmail.com","threadId":"34678","inReplyTo":"7v4nav1kzx.fsf@alter.siamese.dyndns.org","subject":"Re: [PATCH 1/3] t3404: restore specialized rebase-editor following commentchar test","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2013-08-12T07:29:04Z","receivedAt":"2013-08-12T07:29:04Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Mon, Aug 12, 2013 at 2:28 AM, Junio C Hamano <gitster@pobox.com> wrote:\n> Eric Sunshine <sunshine@sunshineco.com> writes:\n>\n>> At start of script, t3404 installs a specialized test-editor ($EDITOR)\n>> upon which many of the interactive rebase tests depend.  Late in t3404,\n>> test \"rebase -i respects core.commentchar\" installs its own custom\n>> editor but neglects to restore the specialized editor when finished.\n>> This oversight will cause later tests, which require the specialized\n>> editor, to fail.\n>\n> That is not oversight but was deliberately done knowing that it will\n> be the last test (and new tests can be added before it).\n\nThere is no mention of this being deliberate either in the mailing\nlist discussion [1] or the commit message (180bad3d1), and other tests\nhave been added following this one.\n\n[1]: http://thread.gmane.org/gmane.comp.version-control.git/216079\n\n> I think the patch is one way to give _known_ status to later tests\n> by declaring the editor installed by \"set_fake_editor\" the gold\n> standard, but isn't a better alternative to make sure that any newly\n> added tests after this point (or before the commentchar tests, for\n> that matter) set a fake editor it wants to use explicitly?\n\nset_fake_editor is the very first thing done by t3404, and many tests\ndepend upon this state. It would have been inconsistent for this one\nnew test to be the exception by having to invoke set_fake_editor\nitself, however, I don't mind making the new test more self-contained,\ndespite the inconsistency. (A later cleanup patch can do the same for\nother existing tests.)\n"},{"id":"225085","messageId":"CAPig+cTYC-EPWFmqTxBO15PE6AuC3jUYNehtQwYk9oADp1AaZw@mail.gmail.com","threadId":"34678","inReplyTo":"7vzjsnzagj.fsf@alter.siamese.dyndns.org","subject":"Re: [PATCH 2/3] t3404: rebase: interactive: demonstrate short SHA-1 collision","fromName":"Eric Sunshine","fromEmail":"sunshine@sunshineco.com","sentAt":"2013-08-12T07:40:50Z","receivedAt":"2013-08-12T07:40:50Z","isPatch":true,"sender":{"key":"sunshine@sunshineco.com","avatar":"https://avatars.githubusercontent.com/u/163641?v=4"},"body":"On Mon, Aug 12, 2013 at 2:31 AM, Junio C Hamano <gitster@pobox.com> wrote:\n> Eric Sunshine <sunshine@sunshineco.com> writes:\n>\n>> The 'todo' sheet for interactive rebase shows abbreviated SHA-1's and\n>> then performs its operations upon those shortened values. This can lead\n>> to an abort if the SHA-1 of a reworded or edited commit is no longer\n>> unique within the abbreviated SHA-1 space and a subsequent SHA-1 in the\n>> todo list has the same abbreviated value.\n>>\n>> For example:\n>>\n>>   edit f00dfad first\n>>   pick badbeef second\n>>\n>> If, after editing, the new SHA-1 of \"first\" is now\n>> badbeef5ba78983324dff5265c80c4490d5a809a, then the subsequent 'pick\n>> badbeef second' will fail since badbeef is no longer a unique SHA-1\n>> abbreviation:\n>>\n>>   error: short SHA1 badbeef is ambiguous.\n>>   fatal: Needed a single revision\n>>   Invalid commit name: badbeef\n>>\n>> Demonstrate this problem with a couple of specially crafted commits\n>> which initially have distinct abbreviated SHA-1's, but for which the\n>> abbreviated SHA-1's collide after a simple rewording of the first\n>> commit's message.\n>>\n>> Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>\n>> ---\n>>  t/t3404-rebase-interactive.sh | 17 +++++++++++++++++\n>>  1 file changed, 17 insertions(+)\n>>\n>> diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh\n>> index af141be..e5ebec6 100755\n>> --- a/t/t3404-rebase-interactive.sh\n>> +++ b/t/t3404-rebase-interactive.sh\n>> @@ -977,4 +977,21 @@ test_expect_success 'rebase -i with --strategy and -X' '\n>>       test $(cat file1) = Z\n>>  '\n>>\n>> +test_expect_success 'short SHA-1 setup' '\n>> +     test_when_finished \"git checkout master\" &&\n>> +     git checkout --orphan collide &&\n>> +     git rm -rf . &&\n>> +     unset test_tick &&\n>\n> This will inconvenience tests added later to these two in the\n> future.  Oversight, or deliberate act knowing that these two are the\n> last tests in this script ;-)?\n>\n> One bad thing is that \"unset\" loses information so that such future\n> tests cannot resurrect test_tick and continue on from where the last\n> test-tick left off.\n\nOversight. The commits were quite deliberately crafted with very\nspecific commit times, commit messages, trees, and blobs in order to\nachieve a conflicting short SHA-1 (\"badbeef\") at rebase time, so it\nwas necessary to have test_tick at a known state.\n\nIt shouldn't be too much effort to save its value and restore it at\nthe end of the test.\n\n>> +     test_commit collide1 collide &&\n>> +     test_commit --notick collide2 collide &&\n>> +     test_commit --notick \"collide3 115158b5\" collide collide3 collide3\n>> +'\n>>\n>> +test_expect_failure 'short SHA-1 collide' '\n>> +     test_when_finished \"reset_rebase && git checkout master\" &&\n>> +     git checkout collide &&\n>> +     FAKE_COMMIT_MESSAGE=\"collide2 815200e\" \\\n>\n> ;-)\n>\n>> +     FAKE_LINES=\"reword 1 2\" git rebase -i HEAD~2\n>> +'\n>> +\n>>  test_done\n"}]}