在Git中,内部/外部合并意味着什么?

在Git中,内部/外部合并意味着什么?,git,merge,Git,Merge,在git中,两个分支合并,但有时是内部合并,有时是外部合并。我不熟悉Git。这两个术语是什么意思?它们的使用场景是什么 在一个程序中,作者想弄清楚合并是什么类型的,他定义如下 'ExtMerge': re.compile(r'^ +Merge( (branch|branches|tag|tags) .* of)? ([^ ]+:[^ ]+)( into .*)?\n$'), 'IntMerge': re.compile(r'^ +(Merge|Pull) .* into .*$'), 'IntM

在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
这当然与文字“Merge”匹配

这与的可选分支
匹配(带前导空格)。这看起来很像Python代码;如果是这样,括号表示分组(这是
使整个序列可选所必需的)和检索匹配字符串的能力

 ([^ ]+:[^ ]+)( into .*)?\n$
最后一部分将捕获一些包含一个冒号但没有空格的单词,这些空格至少由冒号两侧的一个字符组成,后跟可选的
输入任何内容
,后跟文字换行符,后跟空行或字符串结尾(
\n$
序列有点复杂,可能是多余的)

因此:

 Merge branch 'foo' of ssh://example.com into bar
(注意合并中
M
前面的前导空格)可能与此处匹配。这是默认消息
git pullssh://example.com 如果您在运行foo时处于分支
栏上,则会生成foo
。这也可能匹配:

 Merge branch 'foo' of ssh://example.com
这是默认消息,
git pullssh://example.com 如果您在分支
主机上,foo
将生成

第二个正则表达式:

^ +(Merge|Pull) .* into .*$
非常相似;它匹配以空格开头的任何内容,并且字面单词
Merge
Pull
后跟一个空格,后面跟有
的任何内容,后面跟有任何内容(包括两个空格)。结尾的
$
是多余的。请注意,此正则表达式还匹配:

因此,如果标签
ExtMerge
IntMerge
是有意义的,那么这个特定的
pull
生成的消息表明合并是“内部”和“外部”的

最后一个正则表达式是:

^ +Merge branch(es)? '.*$
与前面一样,它匹配前导空格(至少需要一个),字面单词
合并分支
,后跟可选的
es
,后跟空格和单引号
,然后是行尾的任何内容。最后的
$
是多余的,就像第二种情况一样,因为
*
无论如何都会消耗行尾的所有内容

这与
git merge
生成的默认合并消息匹配。但是,它也匹配,例如,非常相同的:

 Merge branch 'foo' of ssh://example.com into bar
我们在一开始就看到了,很明显这是一个外部合并和两种不同的内部合并,在你使用的任何源代码的术语中


所有这些默认的合并消息都是可编辑的,无论是谁运行的
git merge
,都有可能通过
git pull
,或者不可以更改它们。因此,不可能说出编写这些正则表达式的人的想法。也许你可以直接询问此人。

术语“内部”和“external”通常不与Git一起使用。它们更常见于Mercurial。您在哪里看到这些术语的?我认为最好在问题中添加以下代码片段:code@Sun别忘了阅读:你应该接受过去问题的答案。
^ +Merge branch(es)? '.*$
 Merge branch 'foo' of ssh://example.com into bar