Git rebase, изменить порядок добавленных функций, разрешить конфликт, понять слияние - PullRequest
0 голосов
/ 27 февраля 2019

Я нахожусь в отдельной ветке (genericatt-wip) и хочу очистить список коммитов.Т.е. я перебазирую на текущий master.rebase-screen Многие из этих коммитов (все эти test_... коммиты) добавляют одну новую функцию (новый тестовый пример).Это оригинальный список: rebase-initial-screen При изменении их порядка я получаю конфликт, хотя в принципе конфликта нет (все эти коммиты просто добавляют вещи, и все они добавляют отдельные отдельные функции).Мне немного интересно об этом, хотя я думаю, что Git просто запутался, потому что порядок добавления этих функций в файл неясен (верно?).Хотя это не имеет значения для Python, но я думаю, что Git недостаточно умен в этом (может быть, не по теме: есть ли способ автоматического решения таких проблем с помощью более интеллектуального слияния?).

В частности,Теперь я изменяю порядок одного коммита: rebase-change-screen Т.е. я переместил этот test_..._extra_spatial коммит немного вниз.Теперь я получаю это сообщение о конфликте: conflict-msg-screen В терминале git status теперь показывает мне это:

interactive rebase in progress; onto d5530561
Last commands done (4 commands done):
   pick 863c746d GenericAttentionLayer wip
   pick e9443620 test_GenericAttentionLayer_weights_auto_squeeze_time_end
  (see more in file .git/rebase-merge/done)
Next commands to do (15 remaining commands):
   pick 2c6b3bfa test_GenericAttentionLayer_weights_heads_auto_squeeze_time_end
   pick 269eb63e test_GenericAttentionLayer_weights_heads_time_end
  (use "git rebase --edit-todo" to view and edit)
You are currently rebasing branch 'genericatt-wip' on 'd5530561'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

        both modified:   tests/test_TFNetworkRecLayer.py

no changes added to commit (use "git add" and/or "git commit -a")

Содержимое .git/rebase-merge/done:

pick 2260330b4253c94ef662c641c61204ce14ba1e29 test_GenericAttentionLayer_basic
pick 85c0f36048b451911820aa44dff316970d644609 test_rec_layer_move_out_of_loop_ref_att_generic_att
pick 863c746d56ae96f24bbada41fd4d0973ec5d1579 GenericAttentionLayer wip
pick e9443620401e2d50a2dede65101e98f567ca724d test_GenericAttentionLayer_weights_auto_squeeze_time_end

Итак, это говорит о том, что эти команды были выполнены, но я предполагаю, что это означает, что последняя команда (pick e9443... test_...weights_auto_squeeze_time_end) еще не выполнена, но на самом деле это команда, которую она в настоящее время пытается применить, которая завершается неудачно с фиксацией,право?Когда я делаю git show e94436..., я вижу, что этот коммит добавляет функцию test_..._weights_auto_squeeze_time_end (и ничего больше), то есть показывает:

commit e9443620401e2d50a2dede65101e98f567ca724d
...

    test_GenericAttentionLayer_weights_auto_squeeze_time_end

diff --git a/tests/test_TFNetworkRecLayer.py b/tests/test_TFNetworkRecLayer.py
index 7d39d604..efc80499 100644
--- a/tests/test_TFNetworkRecLayer.py
+++ b/tests/test_TFNetworkRecLayer.py
@@ -2682,6 +2682,26 @@ def test_GenericAttentionLayer_basic():
   ...


+def test_GenericAttentionLayer_weights_auto_squeeze_time_end():
+  ...
+
+
 def test_GenericAttentionLayer_extra_spatial():
   ...

Глядя в этот файл кода непосредственно в этом состоянии, я вижу это:

<<<<<<< HEAD
=======
def test_GenericAttentionLayer_weights_auto_squeeze_time_end():
  ...


def test_GenericAttentionLayer_extra_spatial():
  ...


>>>>>>> e9443620... test_GenericAttentionLayer_weights_auto_squeeze_time_end

Нажатие на 'Объединить' дает мне этот интерфейс: merge-screen Это подводит меня к моему основному вопросу (ам) здесь:

Я не знаюЯ не совсем понимаю интерфейс.Что именно я вижу слева, посередине и справа?Что означает «Ваша версия, ветка genericatt-wip», «Результат» и «Изменения от ветки .../master, рев 85 ...»?

Это промежуточное состояние применения (вишня-выбор) одного коммита на master + других коммитов, которые он уже применял ранее, верно?Но где я могу увидеть, какие другие коммиты он уже применял раньше?И где я вижу, какой коммит он пытается применить в данный момент?

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

Где / как я могу увидеть, что изменится применяемый в данный момент коммит?Так, где я вижу то, что было раньше, что будет после, и что это за изменение?Итак, в основном, я знаю, что изменение каждого коммита должно быть точно для добавления одной функции, но я не уверен, как я могу видеть, что это происходит.

(Интерфейс от PyCharm, но яЯ не уверен, насколько это актуально. Эти вопросы, вероятно, являются общими для Git.)

1 Ответ

0 голосов
/ 27 февраля 2019

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

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