Я могу ответить на две трети вашего вопроса здесь - почему возникает конфликт, и как выяснить, что происходит.Я не знаю интерфейса PyCharm, поэтому могу только догадываться, что он вам показывает.
Почему конфликт
В показанном вами снимке экрана причинаконфликт заключается в том, что у вас есть коммит, который добавляет блок, смежный с блоком, который еще не существует, потому что вы решили перебазировать его позже в последовательности: я думаю, вы добавляете test...spatial()
после test...end()
,но последний еще не существует.Я предполагаю, что он будет добавлен, когда коммит, который добавляет его, будет рассмотрен позже.
Когда Git видит непрерывные изменения, он не продвигается вперед, потому что это потребует угадывания, и это не всегда будет безопасно.Вы должны просмотреть их и разрешить конфликт, чтобы сказать, каков правильный результат.
Как узнать, что происходит
Я воспроизвел ваш сценарий, добавив "line1 "в конце файла a
в коммите с последующим добавлением" line2 "во втором коммите:
$ git log --format=oneline master
0a3b254 (master) line2
ef7e059 line1
Теперь я перезагружаюсь, чтобы отменить эти два коммита и получить конфликт при выборе 0a3b254
before ef7e059
и команда командной строки сообщает мне, какой коммит имеет конфликт и останавливается там:
$ git rebase -i HEAD^^
Auto-merging a
CONFLICT (content): Merge conflict in a
error: could not apply 0a3b254... line2
Теперь вы используете другой интерфейс, поэтому я не знаю, показывает ли онфиксация проблемы, но git status
сделает это, если вы запустите ее в командной строке:
$ git status
interactive rebase in progress; onto bf27dcb
Last command done (1 command done):
pick 0a3b254 line2
Next command to do (1 remaining command):
pick ef7e059 line1
Теперь я могу проверить коммит, который я пытаюсь перебазировать с помощью git show 0a3b254
, и он показывает мнедобавив «line2» после «line1».
Я также могу посмотреть на a
, чтобы увидеть, что это за конфликт:
$ cat a
asdf
<<<<<<< HEAD
=======
line1
line2
>>>>>>> 0a3b254... line2
Это говорит мне, что в master
былиздесь нет строк (между <<<<<<< HEAD
и =======
) и что в 0a3b254
у меня есть две строки.Я знаю, какие из них оставить, выполнив git show 0a3b254
, потому что в a
нет ничего, что указывало бы мне, что оставить.
Поэтому я разрешаю конфликт, оставив только «line2» из моей версии, и продолжаю ребазирование:
# edit a to keep just line2
git add a
git rebase --continue
...
CONFLICT (content): Merge conflict in a
error: could not apply ef7e059... line1
Опять я получаю конфликт снова с ef7e059, потому что два блока были добавлены нато же самое место, и Git, конечно, не будет знать, в каком порядке их хранить.
$ cat a
asdf
<<<<<<< HEAD
line2
=======
line1
>>>>>>> ef7e059... line1
Здесь Git говорит мне, что я добавил line2 в предыдущем коммите на HEAD
и line1 в коммите, в котором я сейчас нахожусьработает над, ef7e059.Это не полезно для определения правильного порядка, равно как и git show ef7e059
, но git show mybranch:a
показывает мне содержимое a
в исходной ветви (так как ветка не обновляется, пока перебазирование не завершено) и помогает мне понятьчто мне нужно вставить строку 2 после строки 1.
# edit a to place its contents in the right order
git add a
git rebase --continue
Предположение о графическом интерфейсе PyCharm
В вашем интерфейсе я ожидаю, что Результат (центральная панель)где вы должны поместить результат разрешения конфликта, левая панель, вероятно, является состоянием кода в коммите, выбранном вишней, а правая панель, вероятно, является состоянием кода, в котором происходит выбор вишни.
Основываясь на комментариях к этому ответу и информации о добавлении, которую вы указали в вопросе, я бы предположил, что Result содержит неправильную функцию, которую вам, возможно, придется заменить на ту, которую этот коммит фактически пытается добавить.
В попытках нет ничего плохого: вы всегда можете попробовать и посмотреть, работает ли он, и откатить позже, если окончательный вариантрезультаты не идентичны (согласно git diff
) коду перед ребазой.