我正试图弄清楚合并冲突是否是错误的原因,但我遇到了困难,因为我不清楚冲突解决方案如何影响git blame
。
假设我在master中有一个文件:
a();
b();
c();
我在master中修改它:
a();
d();
c();
但同事也是如此,他们在一个单独的分支中对其进行了不同的修改,然后合并到主分支中:
a();
e();
c();
解决冲突会影响指责吗?换句话说,如果我的同事通过使用我的版本来解决冲突:
a();
d();
c();
而我git blame
d();
线,谁会受到指责:我还是我的同事?
同样,假设git感到困惑,认为第一行和第二行都有冲突:
<<<<
a();
d();
====
a();
e();
>>>>
如果我的同事解决了与他们版本的冲突:
a();
e();
c();
而我git blame
a();
行,我(该行的原作者(会受到指责吗?还是我的同事(最后一个"触摸"它的人,尽管他们没有更改它(会受到谴责?
tl;dr
如果在合并文件上运行git blame
,则无论是谁执行了合并提交,都会看到每一行的原始作者。这意味着,如果你的同事决定使用你的版本的行来解决冲突,你的名字将显示在它旁边。
重建文件的历史记录
在Git中,每次提交都包含两条关键信息:
- 提交时对工作目录的快照的引用
- 对它之前的提交的引用,也就是它的父级
考虑到这两个事实,Git可以通过从给定的提交向后走来重建文件中发生的更改的历史,在每个步骤中生成文件的当前版本和以前版本之间的差异。
这正是git blame
所做的。当你在一个文件上执行git blame
时,Git将在的基础上逐行重建文件的历史记录,向你显示引入(即添加(每行的提交的作者。
合并提交
合并提交包含对两个父级的引用:
- 您合并到的分支引用的提交,也就是左侧
- 您合并的分支引用的提交,也就是右侧
快照包含每一侧的所有更改。
如果在合并提交上执行git blame
,Git将遍历两行历史记录,每个父提交一行。一旦Git到达其快照添加了某一行的提交,它将在该行旁边显示该提交的作者。
解决冲突时添加新行
如果作为冲突解决的一部分添加了新行,即不属于合并任何一方的行,则该行将属于合并提交本身引用的快照。在这种情况下,git blame
将报告该行合并提交的作者。