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

时间:2018-06-01 08:02:37

标签: git merge

在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 :(得分: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 .*$

非常相似;它匹配以空格开头的任何内容,字面词MergePull后跟一个空格,后跟任意后跟into(包括两个空格)后跟任何内容。最后的$是多余的。请注意,此正则表达式匹配:

 Merge branch 'foo' of ssh://example.com into bar

因此,如果标签ExtMergeIntMerge意图有意义,则此特定pull生成的消息表明合并是“内部”“外部”。

最后一个正则表达式为:

^ +Merge branch(es)? '.*$

这和以前一样,匹配前导空格(至少需要一个),文字单词Merge branch后跟可选的es后跟空格和单引号'然后任何事情直到一条线的末端。最后的$是多余的,与第二种情况一样,因为.*无论如何都将消耗所有内容。

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

 Merge branch 'foo' of ssh://example.com into bar
我们在开始时看到的。显然,这是一个外部合并和两个不同种类的内部合并,在您使用的任何源代码的命名法中。

所有这些默认合并消息都是可编辑的,对于正在运行git merge的人 - 可能是通过git pull或者可能不是 - 可以改变它们。所以不可能说出写这些正则表达式的人是谁。也许你可以直接问那个人。