Hi, I was reading the Rerere section of the Pro Git book when I came across the following snippet: $ git rerere diff --- a/hello.rb +++ b/hello.rb @@ -1,11 +1,11 @@ #! /usr/bin/env ruby def hello -<<<<<<< - puts 'hello mundo' -======= +<<<<<<< HEAD puts 'hola world' ->>>>>>> +======= + puts 'hello mundo' +>>>>>>> i18n-world end If I understand correctly, this is the diff between rerere's preimage and the version in the current working directory, as explained in this StackOverflow answer: https://stackoverflow.com/a/27364585 What I don't understand, however, is why rerere records its initial preimage without labels. This seems to have been rerere's behavior ever since it was introduced as a perl script back in 2006: https://lore.kernel.org/git/7v4q3no0v7.fsf@xxxxxxxxxxxxxxxxxxxxxxxx/ + $one = join('', @{$side[0]}); + $two = join('', @{$side[1]}); + if ($two le $one) { + ($one, $two) = ($two, $one); + } + print $out "<<<<<<<\n"; + print $out $one; + print $out "=======\n"; + print $out $two; + print $out ">>>>>>>\n"; + @side = (); So the preimage format doesn't contain any labels, and outputs the lexicographically smaller hunk first, while the default merge conflict output has labels and outputs the current branch first followed by the other branch. If rerere recorded its preimage in the same format as the default merge conflict format, the above rerere diff output would be empty as there would be no difference between what we started with and what we resolved into. The same behaviour would still occur with the diff3 style format, for example, but at least it wouldn't occur with the default merge style format. My question is: Is there a reason rerere's output is like this that I'm missing? Or is it just there for convenience since it doesn't affect rerere's intended functionality? Thanks, Mohamed Mohey