If I Resolve a Conflict Does it Change Git Blame?

本小妞迷上赌 提交于 2019-12-22 06:58:18

问题


I'm trying to figure out whether a merge conflict was responsible for a bug, but I'm having difficulty because I'm not clear on how conflict resolution affects git blame.

Let's say I have a file in master:

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

I modify it in master:

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

but so does a co-worker, and they modify it differently, in a separate branch which they then merge in to master:

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

Can resolving that conflict affect the blame? In other words, if my co-worker resolves the conflict by going with my version:

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

and I git blame the d(); line, who will be blamed: me or my co-worker?

Similarly, let's say git got confused and thought both the first and second lines were conflicted:

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

If my co-worker resolves the conflict with their version:

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

and I git blame the a(); line, will I (the line's original author) get the blame, or will my co-worker (who "touched" it last, even though they didn't change it) get the blame?


回答1:


tl;dr

If you run git blame on a merged file you are going to see the original author of each line, regardless of who did the merge commit. This means that if your co-worker decided to resolve the conflict using your version of the line, your name will be shown next to it.

Reconstructing the history of a file

In Git each commit holds two key pieces of information:

  • A reference to a snapshot of your working directory at the time of the commit.
  • A reference to the commit that came before it, aka its parent.

Given these two facts Git can reconstruct the history of changes occurred in a file by walking backwards from a given commit, generating at each step a diff between the current version of the file and its previous one.

This is exactly what git blame does. When you do git blame on a file, Git will reconstruct the history of the file on a line by line basis, showing you the author of the commit that introduced (i.e. added) each line.

Merge commits

A merge commit holds a reference to two parents:

  • The commit referenced by the branch you merged into, aka the left side.
  • The commit referenced by the branch you merged, aka the right side.

The snapshot contains all the changes from each side combined.

If you do a git blame on a merge commit, Git will walk two lines of history, one for each of the parent commits. Once Git reaches the commit whose snapshot added a certain line, it will show that commit's author next to the line.

Adding new lines when resolving a conflict

If a new line – that is a line that doesn't belong to either side of the merge – was added as part of a conflict resolution, that line would belong to the snapshot referenced by the merge commit itself. In that case git blame will report the author of the merge commit for that line.



来源:https://stackoverflow.com/questions/32770806/if-i-resolve-a-conflict-does-it-change-git-blame

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!