Уничтожение предыдущих конфликтов из-за не относящихся к делу «изменений» - PullRequest
1 голос
/ 10 января 2020

Иногда, когда я призываю sh последний коммит на ранний коммит, я получаю неожиданные конфликты.

Настройка

У меня есть пример репозитория здесь со следующей структурой.

git log --all --decorate --oneline --graph
* 3aa1300 (HEAD -> master, origin/master) Refactor func(x)
* 6b8940e Add func2
* 6ead589 Add import math
* dc55678 Add func
* 9dfc660 add file.py
* c5fd61b Initial commit

Я буду ссылаться на них как буквенные коммиты для простоты использования:

D 3aa1300 Refactor func(x)
C 6b8940e Add func2
B 6ead589 Add import math
A dc55678 Add func
AA 9dfc660 add file.py
AAA c5fd61b Initial commit

Имена коммитов довольно понятны, но вот сокращенное git log -p:

commit D: Refactor func(x)

 import math

-def func(x):
-    return(x)
+def func(y):
+    return(y)

 def func2(y):
     return(y)

commit C: Add func2

 def func(x):
     return(x)
+
+def func2(y):
+    return(y)

commit B: Add import math

+import math
+
 def func(x):
     return(x)

commit A: Add func

+def func(x):
+    return(x)

commit AA: add file.py
[Add the file. Only here to have commit to rebase from]

Проблема

Я чищу ветку, поэтому хочу подсчитать sh D в A. Поэтому я выполняю git rebase -i HEAD~4 с помощью следующих команд:

pick A Add func
squash D Refactor func(x)                                                                                                                                                                                                               
pick B Add import math
pick C Add func2

В результате этого возникает конфликт в file.py:

<<<<<<< HEAD                                                                                                                                                                                                                                  
def func(x):                                                                                                                                                                                                                                  
    return(x)
=======
import math

def func(y):
    return(y)

def func2(y):
    return(y)
>>>>>>> 3aa1300... Refactor func(x)

Вопрос

Почему сква sh просто "не случается"? Почему Squa sh вносит все другие не относящиеся к делу изменения в конфликт?

Я предположил, что коммиты, по сути, просто сохранили "diff patch", который он выполнил. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ”*” * * * * * * * * * * ”* 1042) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 * 10 *” * ”* Если я просто не правильно делаю, 1043 * как мне взять "исправления" D и squa sh их на A?

1 Ответ

1 голос
/ 11 января 2020

Я предположил, что сохраненные коммиты, по сути, просто сохранили "diff patch", который он выполнил.

Это не тот случай: каждый коммит сохраняет полный моментальный снимок всех файлов без изменений. Когда вишня выбирает коммит, чтобы скопировать его - и делает это с повторной базой, даже (или особенно?) С действием squash - эти снимки становятся diffs, через модифицированный трехсторонний процесс слияния, который git cherry-pick использует. Так что думать о них как diffs в основном работает. Это - в основном часть, которая становится проблемой здесь.

Вы действительно делаете правильные вещи. Git запускается как бы из-за того, что рассматриваемые diff-файлы происходят из коммита C для коммита A, а затем коммит C для коммита D, хотя коммит C еще быть скопированным. Если вы установите merge.conflictStyle в diff3, Git будет включать, где конфликт возникает, содержимое из фиксации слияния C. Это позволит вам увидеть, что Git обрабатывает коммит A - или, скорее, C -to- A change-set - как , удаляя func2, а между тем C -to- D change-set изменяет func1 в строках, которые перекрывают или упираются (в данном случае, я думаю, "примыкают") к этому удалению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...