git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/2] Add a basic idea section for git-blame.

From
Bo Yang <struggleyb.nku@gmail.com>
Date
Apr 9, 2010, 05:11 UTC
Message-ID
<x2z41f08ee11004082211g6ae76f38ic1ee65e508b16343@mail.gmail.com>
In-Reply-To
<7vmxxe74s2.fsf@alter.siamese.dyndns.org>

Hi Junio, On Thu, Apr 8, 2010 at 1:00 AM, Junio C Hamano <gitster@pobox.com> wrote:

Show 22 quoted lines
> 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. :-)

Show 11 quoted lines
> 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

Previous: Junio C Hamano
Message 7 of 7 in “Document update for 'git-blame' '-M' and '-C' option”
  1. 0/2 Document update for 'git-blame' '-M' and '-C' optionBo Yang, Apr 8, 2010
  2. 1/2 Add a basic idea section for git-blame.Bo Yang, Apr 8, 2010
  3. 2/2 Change the description of '-M' and '-C' option.Bo Yang, Apr 8, 2010
  4. Junio C HamanoApr 8, 2010
  5. Thomas RastApr 8, 2010
  6. Junio C HamanoApr 8, 2010
  7. Bo YangApr 9, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.