在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)? '.*$")
答案 0 :(得分:1)
这些正则表达式显然旨在匹配git merge
为您格式化的默认消息,或git pull
指示git merge
为您格式化的一个(第一个)情况:
^ +
这会在一行的开头查找一个或多个空格。
Merge
这当然与文字“Merge”匹配。
( (branch|branches|tag|tags) .* of)?
这匹配可选的 branch anything 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
或者可能不是 - 可以改变它们。所以不可能说出写这些正则表达式的人是谁。也许你可以直接问那个人。