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

Я пытаюсь выяснить, был ли конфликт слиянием ответственным за ошибку, но у меня возникают трудности, потому что я не понимаю, как влияет конфликтное разрешение на 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();, будет ли я (автор строки оригиналом) получить вину, или мой сотрудник (который "коснулся" последнего, даже если он не изменил его) получить виноват?

1 ответ

TL;DR

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

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

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

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

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

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

Объединить фиксации

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

  • Фиксирование, на которое ссылается ветка, в которую вы слились, ака с левой стороны.
  • Фиксирование, на которое ссылается ветка, которую вы объединили, ака справа.

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

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

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

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

licensed under cc by-sa 3.0 with attribution.