如果我解决了冲突,它会改变吗 Git 怪罪?

If I Resolve a Conflict Does it Change Git Blame?

我试图弄清楚合并冲突是否是导致错误的原因,但我遇到了困难,因为我不清楚冲突解决如何影响 git blame

假设我在 master 中有一个文件:

a();
b();
c();

我在master里修改:

a();
d();
c();

但同事也是如此,他们在一个单独的分支中对其进行了不同的修改,然后将其合并到 master:

a();
e();
c();

解决冲突能影响责任吗?换句话说,如果我的同事通过使用我的版本解决了冲突:

a();
d();
c();

和我 git blame d(); 行,谁会受到指责:我还是我的同事?

同样,假设 git 感到困惑,认为第一行和第二行都冲突了:

<<<<
a();
d();
====
a();
e();
>>>>

如果我的同事解决了与他们版本的冲突:

a();
e();
c();

和我 git blame a(); 行,我(该行的原作者)会受到指责,还是我的同事(谁 "touched" 它最后,即使他们没有改变它)得到责备?

tl;博士

如果您 运行 git blame 在合并文件上,您将看到每一行的 原始 作者,无论合并提交是谁.这意味着如果您的同事决定使用该行的 您的 版本解决冲突,您的名字将显示在它旁边。

重建文件历史

在 Git 中,每个提交都包含两个关键信息:

  • 提交时对您工作目录的快照的引用。
  • 对其之前的提交的引用,也就是它的 parent.

鉴于这两个事实 Git 可以通过从给定的提交 向后走 重建文件中发生的更改的历史记录,在每个步骤之间生成差异文件的当前版本及其之前的版本。

这正是 git blame 所做的。当您对文件执行 git blame 时,Git 将在 逐行 的基础上重建文件的历史记录,向您显示引入的提交的作者(即添加)每行。

合并提交

合并提交包含对两个父项的引用:

  • 合并到 的分支引用的提交,也就是 left 侧。
  • 合并的分支引用的提交,也就是右侧侧。

快照包含来自每一方的所有更改组合。

如果您在 合并提交 上执行 git blame,Git 将走两行历史记录,一条用于每个父提交。一旦 Git 到达其快照 添加了 特定行的提交,它将在该行旁边显示该提交的作者。

解决冲突时添加新行

如果新行——即不属于合并任何一方的行——被添加为冲突解决的一部分,该行将属于合并提交本身引用的快照。在这种情况下,git blame 将报告该行的合并提交的作者。