Hi Junio, On Thu, Apr 8, 2010 at 1:00 AM, Junio C Hamano <gitster@xxxxxxxxx> wrote: > The name of the game is not "take blame by looking at the diff to see what > we introduced"; it is "avoid taking blame at all cost, by looking at the > diff to see what we might have inherited from our parents". > > A description closer to the truth would be: > > - Look at output of "git diff <rev>^$n <rev>" for each parent ($n runs > from 1 to number of parents); > > - Ignore all +/- lines. The context ' ' lines and lines outside of diff > hunks are known to have been inherited from $n-th parent and they are > not our fault. We can happily pass blame for these lines to our > parent. > > - Do the above for all the parents. We (grudgingly) take blame for lines > that we failed to find corresponding lines in our parents. > > The -M option affects what happens between the second and the third step. > We try to see if the lines that we did not pass blame to <rev>^$n might > have come from <rev>^$n by running diff between the remainder and the blob > in <rev>^$n *again*. This lets us catch code movement within the blob, > hence the name of the option -M. I think here, not only the code movement, but also the copies will be found too. Please correct me if I am wrong here. :-) > The -C option affects the choice of the blob in <rev>^$n. Usually, we > internally run an equivalent of "git diff -M <rev>^$n <rev>" to notice > that the file F that we are analyzing used to be called F' in $n-th > parent, and run the diff against it, but -C allows us to check with paths > other than that, and additional -C enlarges the search space. This is to > notice code movement (with a single -C) or copies (with more -Cs) across > paths. > > For illustrated description, read the classic: > > http://thread.gmane.org/gmane.comp.version-control.git/28826 Thanks a lot for providing this reference. It really helps me too much to understand how blame works. I will try to re-read the whole code according the description here. ;-) Regards! Bo -- 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