"Randall S. Becker" <rsbecker@xxxxxxxxxxxxx> writes: > On January 14, 2019 12:46, Junio C Hamano wrote: >> Barret Rhoden <brho@xxxxxxxxxx> writes: >> >> > On 2019-01-10 at 14:29 Junio C Hamano <gitster@xxxxxxxxx> wrote: >> >> > For instance, commit X does this: >> >> > >> >> > -foo(x,y); >> >> > +foo(x,y,z); >> >> > >> >> > Then commit Y comes along to reformat it: >> >> > >> >> > -foo(x,y,z); >> >> > +foo(x, y, z); >> >> > >> >> > And the history / rev-list for the file looks like: >> >> > >> >> > ---O---A---X---B---C---D---Y---E---F >> >> > >> >> > I want to ignore/skip Y and see X in the blame output. >> >> >> >> If you skip Y, the altered history would have "foo(x, y, z)" in E, >> >> "foo(x,y,z)" in X, and "foo(x,y)" in A. If you start blaming from F, >> >> you'd get E as the commit that explains the latest state. If you do >> >> not skip Y, you'd get Y. I am not sure how you'd get X in either >> >> case. >> > >> ... > > From my own community, this came up also. The intent was to show everyone > who touched a particular line, throughout history, not just the current one. > Perhaps that is what Barret is going for. I think I now understand what is going on. In short, what Barret wanted is way more ambitious than "blame in a hypothetical history that lacks certain commits". There is no similiarity with existing "-S <revs>" option that I asked about in my initial review. This is quite a different beast (and I kind-a like it ;-). Instead of "skipping" Y, Barret wants to pretend that the effect of commit Y, in addition to the commit Y itself, never existed in the history. Even when blaming back from F (where it has "foo(x, y, z)", which is the same as E and down to Y), the algorithm wants to pretend as if E and F had that line in "foo(x,y,z)" form, i.e. before Y touched it, and also pretend that the user started blaming a line in that shape. As there is no general solution [*1*] to "how did this line looked like before this commit", such a blame may not have a meaningful answer. When Y added a block of text without removing anything (i.e. "git show Y" has no line that begins with '-'), and when the user asked to blame that block of text in F, there is no sensible answer to the question: "what got replaced by Y in this text?", so a blame that "ignores" Y would not be able to answer "where did these lines come from?" question. But in some cases (e.g. when "git show Y" has only one '-' line, immediately followed by '+' line, both with quite a similar contents and no other change in the patch---it is highly plausible that in such a change, the former became the latter, like the example in Barret's message I was responding to), we can say "this was how the line that was modified in Y looked like before Y" and blaming while ignoring Y can have a reasonable answer. [Footnote] *1* Here, I use the word "solution" in the same sense as "solution to a math equation", not in the sense to describe the steps to derive that "solution".