To avoid problems with short SHA-1s that become non-unique during the
rebase, we rewrite the todo script with short/long SHA-1s before and
after letting the user edit the script. Since SHA-1s are not intuitive
for humans, rebase -i also provides the onelines (commit message
subjects) in the script, purely for the user's convenience.

It is very possible to generate a todo script via different means than
rebase -i and then to let rebase -i run with it; In this case, these
onelines are not required.

And this is where the expand/collapse machinery has a bug: it *expects*
that oneline, and failing to find one reuses the previous SHA-1 as

It was most likely an oversight, and made implementation in the (quite
limiting) shell script language less convoluted. However, we are about
to reimplement performance-critical parts in C (and due to spawning a
git.exe process for every single line of the todo script, the
expansion/collapsing of the SHA-1s *is* performance-hampering on
Windows), therefore let's fix this bug to make cross-validation with the
C version of that functionality possible.

Signed-off-by: Johannes Schindelin <>
--- | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/ b/
index 5df5850..0eb5583 100644
--- a/
+++ b/
@@ -750,7 +750,12 @@ transform_todo_ids () {
                        sha1=$(git rev-parse --verify --quiet "$@" ${rest%%[    
 ]*}) &&
-                       rest="$sha1 ${rest#*[    ]}"
+                       if test "a$rest" = "a${rest#*[   ]}"
+                       then
+                               rest=$sha1
+                       else
+                               rest="$sha1 ${rest#*[    ]}"
+                       fi
                printf '%s\n' "$command${rest:+ }$rest"

Reply via email to