在 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)? '.*$")
这些正则表达式显然是为了匹配为您git merge
格式的默认消息而设计的,或者在一种(第一种(情况下,git pull
指示git merge
为您格式化:
^ +
这将在行首查找一个或多个空格。
Merge
这当然与字面意思"合并"相匹配。
( (branch|branches|tag|tags) .* of)?
这匹配可选branchanythingof
(带前导空格(。 这看起来很像 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
或可能不通过(都可以更改它们。 因此,不可能说出编写这些正则表达式的人的想法。 也许你可以直接问那个人。