В git две ветви объединены, но иногда это внутреннее слияние, а иногда внешнее слияние. Я не знаком с Git. Что означают эти два термина? И каков сценарий их использования?
В программе автор хотел выяснить, что такое слияние, и определил следующее.
'ExtMerge': re.compile(r'^ +Merge( (branch|branches|tag|tags) .* of)? ([^ ]+:[^ ]+)( into .*)?\n$'),
'IntMerge': re.compile(r'^ +(Merge|Pull) .* into .*$'),
'IntMerge2': re.compile(r"^ +Merge branch(es)? '.*$")
Думаю, лучше добавить к вопросу отрывок в виде кода
@Sun Не забудьте прочитать stackoverflow.com/help/someone-answers: вы должны принимать ответы на прошлые вопросы.





Эти регулярные выражения, очевидно, разработаны для соответствия сообщениям по умолчанию, которые git merge форматирует для вас, или в одном (первом) случае, git pull инструктирует git merge форматировать для вас:
^ +
Это ищет один или несколько пробелов в начале строки.
Merge
Это, конечно, соответствует дословному слову «Слияние».
( (branch|branches|tag|tags) .* of)?
Это соответствует необязательному branch anything of (с начальным пробелом). Это очень похоже на код Python; если это так, круглые скобки подразумевают как группировку, которая необходима для ?, чтобы сделать всю последовательность необязательной, так и возможность извлекать совпадающие строки.
([^ ]+:[^ ]+)( into .*)?\n$
Эта последняя часть захватит какое-то слово, содержащее одно двоеточие, но без пробела, которое состоит как минимум из одного символа по обе стороны от двоеточия, за которым следует необязательный input anything, за которым следует буквальный перевод строки, за которым следует пустая строка или конец -string (последовательность \n$ немного сложна и, возможно, избыточна).
Следовательно:
Merge branch 'foo' of ssh://example.com into bar
(обратите внимание на начальный пробел перед M при слиянии), скорее всего, здесь совпадают. Это сообщение по умолчанию, которое git pull ssh://example.com foo генерировал бы, если бы вы были в ветке bar, когда запускали его. Это также может соответствовать:
Merge branch 'foo' of ssh://example.com
Это сообщение по умолчанию, которое git pull ssh://example.com foo генерировал бы, если бы вы были в ветке master.
Второе регулярное выражение:
^ +(Merge|Pull) .* into .*$
довольно похож; он соответствует всему, что начинается с пробелов и буквального слова Merge или Pull, за которым следует пробел, за которым следует что-либо, за которым следует into (включая оба пробела), за которым следует что-либо. $ в конце является избыточным. Обратите внимание, что это регулярное выражение также соответствует:
Merge branch 'foo' of ssh://example.com into bar
Следовательно, если предполагается, что метки ExtMerge и IntMerge имеют смысл, это конкретное сообщение, сгенерированное pull, указывает, что слияние является "внутренним" а также "внешним".
Последнее регулярное выражение:
^ +Merge branch(es)? '.*$
Это, как и прежде, соответствует начальным пробелам (требующим хотя бы одного), буквальным словам Merge branch, за которыми следует необязательный es, за которым следуют пробел и одинарная кавычка ', а затем все до конца строки. Последний $ является избыточным, как и во втором случае, поскольку .* в любом случае потребляет все до конца строки.
Это соответствует сообщению слияния по умолчанию, которое генерирует git merge. Однако он также соответствует, например, тому же самому:
Merge branch 'foo' of ssh://example.com into bar
что мы видели в начале. Таким образом, очевидно, что это одновременно слияние внешний и два вида слияния разныевнутренний в номенклатуре любого исходного кода, который вы используете.
Все эти сообщения слияния По умолчанию являются редактируемый, и любой, кто запускает git merge - возможно, через git pull или, возможно, нет - может их изменить. Поэтому невозможно сказать, что имел в виду автор этих регулярных выражений. Возможно, вы могли бы спросить этого человека напрямую.
Термины «внутренний» и «внешний» обычно используются в Git как нет. Они чаще встречаются с Mercurial. Где вы видели эти термины?