когда git merge получает одну и ту же строку от двух разных родителей, кого обвиняют? - PullRequest
1 голос
/ 28 июня 2019

Если я что-то изменяю в ветви объекта, затем изменяю это обратно, а затем объединяюсь, даже если родительский номер 1 коммита слияния не имеет никаких изменений в строке, он обвиняет коммит, в котором я его изменил, обратновместо оригинального коммита.Как это вычисляется?

$ git init
$ # create a simple file
$ echo line 1 >> file.txt
$ echo line 2 >> file.txt
$ echo line 3 >> file.txt
$ git add file.txt
$ git commit -minitial
$ # now create a feature branch
$ git checkout -b feature
$ # and check off some items in the file
$ nano file.txt # so that when you are done you have
$ cat file.txt
line 1
line 2 check
line 3 check
$ git add file.txt
$ git commit -m'check off some items'
$ # now undo something in the feature branch
$ nano file.txt # and take away one of the checks:
$ cat file.txt
line 1
line 2 check
line 3
$ git add file.txt
$ git commit -m'uncheck one that I checked by accident'
$ git log --pretty=oneline
7321c57f0b2e6feb35a8498efb2939eb1e4268f2 (HEAD -> feature) uncheck one that I checked by accident
eb267c857bb529ee80dd1309994fcd76d6586c12 check off some items
d027e2f7185c2287337ad275d888fc19acbf2292 initial
$ # now go to master and merge this
$ git checkout master
$ git merge --no-ff feature
$ # so now we only have one difference between this and the previous commit
$ git diff HEAD^
diff --git a/file.txt b/file.txt
index a92d664..99e5441 100644
--- a/file.txt
+++ b/file.txt
@@ -1,3 +1,3 @@
 line 1
-line 2
+line 2 check
 line 3

ОДНАКО !!!

$ git blame file.txt

^d027e2f .. line 1
eb267c85 .. line 2 check
7321c57f .. line 3

Строка, которая была изменена и возвращена обратно, обвиняется в хэше коммита, где она была изменена обратно!

Я бы ожидал увидеть что-то вроде

^d027e2f .. line 1
eb267c85 .. line 2 check
d027e2f7 .. line 3

Я думаю, что аналогичное решение должно быть принято, когда коммит на любой стороне слияния делает одно и то же изменение.Как это определяет, кого из родителей обвиняют?Я думал, что это всегда будет родитель № 1.(тот же самый, на который ссылается HEAD^)

Всегда ли он винит в этом самом последнем коммите, который ставит именно эту строку?Если я что-то изменяю в ветви функций, а затем снова изменяю ее в той же ветви функций, я бы предпочел обвинить первоначального автора.

non fast forward merge with commit that undoes something

...