【问题标题】:If I Resolve a Conflict Does it Change Git Blame?如果我解决了冲突,它会改变 Git Blame 吗?
【发布时间】:2015-12-22 14:45:18
【问题描述】:

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

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

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

我在master里面修改:

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

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

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

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

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

而我git blamed(); 行,谁会受到责备:我还是我的同事?

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

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

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

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

而我 git blame a(); 线,我(该线的原作者)会受到指责,还是我的同事(最后“触摸”它,即使他们没有改变它)会受到责备责备?

【问题讨论】:

  • 您可以创建一个测试存储库来测试它。在 master 中创建一个文件。创建一个新分支并更改它。切换回master并更改它。合并并解决冲突并对文件执行git blame。事实上,您甚至不需要 git 服务器来托管存储库。
  • 我没有对此进行测试,但我希望blame 会引用解决冲突的人,因为解决方案之后是git add

标签: git version-control merge-conflict-resolution git-blame


【解决方案1】:

tl;博士

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

重建文件的历史

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

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

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

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

合并提交

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

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

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

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

解决冲突时添加新行

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

【讨论】:

  • 谢谢,这是一个完美的解释,正是我想要的!
猜你喜欢
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2010-11-28
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多