Что означает внутреннее / внешнее слияние в Git? - PullRequest
0 голосов
/ 01 июня 2018

В 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)? '.*$")

1 Ответ

0 голосов
/ 01 июня 2018

Эти регулярные выражения, очевидно, предназначены для соответствия сообщениям по умолчанию, которые git merge форматирует для вас, или в одном (первом) случае, которые git pull указывает git merge форматировать для вас:

^ +

Это ищет один или несколько пробелов в начале строки.

Merge

Это, конечно, соответствует буквальному слову "Слияние".

( (branch|branches|tag|tags) .* of)?

Это соответствует необязательному branch <em>anything</em> of (с начальным пробелом).Это очень похоже на код Python;если это так, в скобках подразумевается как группировка, которая необходима для ?, чтобы сделать всю последовательность необязательной, так и возможность извлечения совпадающих строк.

 ([^ ]+:[^ ]+)( into .*)?\n$

Эта последняя часть будет содержать некоторое слово, котороесодержит одно двоеточие, но не содержит пробелов, состоящих как минимум из одного символа по обе стороны от двоеточия, за которым следует необязательный input anything, за которым следует буквальный символ новой строки, за которым следует пустая строка или конец строки (\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 или, возможно, нет - может их изменить.Поэтому невозможно сказать, что имел в виду тот, кто написал эти регулярные выражения.Возможно, вы могли бы спросить этого человека напрямую.

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