当任何解决冲突的合并提交被推送到服务器时,我想在服务器端采取措施。具体来说,我想通知其他作者以确保合并工作不受影响,以确保他们的工作不受影响,因此我想知道git服务器端(接收前或接收后)是否可以两者都< / em>检测提交是否是合并 ,并且知道哪些行包含已解决的冲突? (这样可以git blame
进行更早的修订并找到作者进行通知)
答案 0 :(得分:4)
确定一个提交是一个合并提交很容易:它有多个父级。
通常不可能确定提交是合并 code 的结果,因为此类提交没有任何标记。精心挑选和还原的提交是合并代码的输出,有时在提交消息中将其标记为此类。但这只是特殊情况。使用git merge --squash
,任何人都可以调用谓词合并过程,但可以进行普通的非合并提交。可以制定一个策略规则,要求提交者必须标记其冲突,但是执行起来并不容易。 Git曾经将这些内容写出作为其默认提交消息的一部分,以备后用,但在某种程度上仍然可以使用,但是通常将其注释掉。
无论如何,假设您对通过“一个以上的父对象”方法检测合并提交感到满意(即忽略壁球合并和其他特殊情况),从“这是一个合并”中去仍然很棘手。到“这是一个有一些冲突的合并”。 可能会机械地发现存在冲突:只需对每个作为合并提交的提交使用分离的HEAD重新执行合并。如果Git能够自行将合并结果与提交的合并结果进行比较,这时也可以将合并结果进行比较:只需使用git diff-tree
比较两个提交的树。因此:
if (commit $H is a merge):
get list of all of $H parents
git checkout $list[0] # assuming a zero subscript means first
git merge --quiet $list[1:N-1]
if (last command succeeded):
difference=$(git diff-tree -r HEAD $H)
if (no difference):
commit was entirely mechanical
else:
commit is suspicious
else:
commit has conflicts
git reset --hard HEAD # discard work-tree
(此过程必须在具有工作树的存储库中运行,或通过git --work-tree=<path>
使用临时工作树。)
如果合并存在冲突,找到冲突的行并检测作者很棘手。