git - 如果我解决了冲突,它会改变 Git Blame 吗?

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

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

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

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

我在master中修改:

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

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

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

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

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

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

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

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

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

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

git blame a(); 行,我(该行的原作者)会受到 blame ,还是我的同事(“触及” “最后,即使他们没有改变它)得到 blame ?

最佳答案

tl;博士

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

重建文件的历史

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

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

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

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

merge 提交

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

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

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

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

解决冲突时添加新行

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

关于git - 如果我解决了冲突,它会改变 Git Blame 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32770806/

相关文章:

c++ - 具有分层访问控制的存储库的 SVN 或 Git

version-control - 在 Fossil 中修改工单时的电子邮件通知

git - 为什么 git-svn 因信号 13 而失败?

git - 如何找出正在进行的 merge 的父修订?

git - 在发生冲突时始终使用 merge 分支中的版本

tfs - 批量解决tfs中的合并冲突

linux - 使用bash脚本进行git克隆,无法读取存储库的密码

git - 我可以让 'git diff' 只显示行号和更改的文件名吗?

git - 你如何重命名 git 中的文件夹并使用交互式 rebase stash 它?

git - 忽略来自 Git 存储库及其克隆的版本控制文件