Если я разрешу конфликт, это изменит Git Blame?

Я пытаюсь выяснить, был ли конфликт слияния причиной ошибки, но у меня возникли трудности, потому что мне не ясно, как разрешение конфликтов влияет git blame,

Допустим, у меня есть файл в мастере:

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

Я изменяю это в мастере:

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

но это делает сотрудник, и они изменяют его по-разному, в отдельной ветви, которую они затем объединяют в мастер:

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

Может ли разрешение этого конфликта повлиять на вину? Другими словами, если мой коллега разрешит конфликт, перейдя к моей версии:

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

и я git blame d(); линия, кто будет обвинен: я или мой сотрудник?

Точно так же, скажем, git запутался и подумал, что первая и вторая строки были противоречивы:

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

Если мой коллега разрешит конфликт своей версией:

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

и я git blame a(); линия, я (первоначальный автор строки) получу вину, или мой коллега (который "прикоснулся" к ней последним, даже если они не меняли) получит вину?

1 ответ

Решение

ТЛ; др

Если вы бежите git blame В объединенном файле вы увидите оригинального автора каждой строки независимо от того, кто совершил слияние. Это означает, что если ваш коллега решил разрешить конфликт, используя вашу версию строки, ваше имя будет показано рядом с ним.

Восстановление истории файла

В Git каждый коммит содержит два ключевых элемента информации:

  • Ссылка на снимок вашего рабочего каталога во время фиксации.
  • Ссылка на коммит, который был до него, он же его родитель.

Учитывая эти два факта, Git может воссоздать историю изменений, произошедших в файле, пройдя назад от данного коммита, генерируя на каждом шаге разницу между текущей версией файла и его предыдущей.

Это именно то, что git blame делает. Когда вы делаете git blame для файла Git будет восстанавливать историю файла построчно, показывая вам автора коммита, который представил (то есть добавил) каждую строку.

Слияние совершает

Коммит слияния содержит ссылку на двух родителей:

  • Коммит, на который ссылается ветвь, в которую вы слились, то есть левая сторона.
  • Коммит, на который ссылается ветвь, которую вы слили, иначе справа.

Снимок содержит все изменения с каждой стороны вместе взятых.

Если вы делаете git blame при коммите слияния, Git будет проходить две строки истории, по одной для каждого из родительских коммитов. Как только Git достигает коммита, снимок которого добавил определенную строку, он будет показывать автора этого коммита рядом со строкой.

Добавление новых строк при разрешении конфликта

Если новая строка - это строка, которая не принадлежит ни одной из сторон слияния - была добавлена ​​как часть разрешения конфликта, эта строка будет принадлежать снимку, на который ссылается сам коммит слияния. В таком случае git blame сообщит об авторе слияния для этой строки.

Другие вопросы по тегам