Иногда, когда я призываю 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
?