如何强制手动审查合并中的所有更改?

时间:2017-08-28 13:44:20

标签: git merge git-merge

请看以下示例:

git log --all --oneline --graph

*   fc89735 (HEAD -> master) Merge branch 'feature'
|\
| * 034f1de (feature) modify the calculate function
| * 57aaea2 added another calculation function
* | 382de62 just add a comment
|/
* 303a4ed initial commit

这是我做的:

1。初始提交(feature.php)(303a4ed):

<?php
function calculate($a) {
    return ($a + 500) * 0.4 + 10;
}

2。我创建了一个分支 FEATURE ,其中我刚添加了另一个功能,一个功能......(57aaea2):

<?php
function calculate($a) {
    return ($a + 500) * 0.4 + 10;
}

function anotherCaluclation($b) {
    return ($b - 500) * 0.2 + 5;
}

3。我在计算函数中修改了计算以符合 FEATURE (034f1de)的要求:

<?php
function calculate($a) {
    $a += 1243028;
    return ($a + 500) * 0.4 + 10;
}

function anotherCaluclation($b) {
    return ($b - 500) * 0.2 + 5;
}

4。在 MASTER 中,我在计算函数中添加了注释(382de62)

<?php
//a crazy calculation function calculate($a) {
    return ($a + 500) * 0.4 + 10;
}

5。功能已完成,我想介入它。此时 MASTER FEATURE 已经分歧,快进合并是不可能的。在 FEATURE 中,计算被大量修改,这对于分支是正确的,但对于项目的其余部分是不正确的,包括 MASTER 。 但是,想象一下,问题是未知的,我正在做git merge,将 FEATURE 合并到 MASTER (fc89735)中:

git merge feature

我得到以下日志:

Auto-merging feature.php
Merge made by the 'recursive' strategy.
 feature.php | 5 +++++
 1 file changed, 5 insertions(+)

这是由此产生的内容:

<?php
//a crazy calculation function
function calculate($a) {
    $a += 1243028;
    return ($a + 500) * 0.4 + 10;
}

function anotherCaluclation($b) {
    return ($b - 500) * 0.2 + 5;
}

正如您所看到的: FEATURE 分支中添加的行$a += 1243028;(对于该分支正确但对项目的其余部分不正确)已合并到 MASTER中

这意味着,从现在开始,GITs自动合并引入了项目中的一个错误。

你如何处理这类问题?有什么可能的策略?从这个例子我恳求:所有自动合并操作都需要手动审查!

在进行合并时,是否有办法强制手动审核所有更改?

2 个答案:

答案 0 :(得分:1)

在做了进一步的研究之后,我想目前这个问题的最佳解决方案如下:

(* HEAD 是对最新 MASTER 提交的引用)

  1. git merge --no-commit feature执行合并但不提交,因此可以审核更改。
  2. 现在用工作目录 HEAD FEATURE 进行三通差异会很不错。但目前GIT不可能做到这一点是不可能的。所以:

    1. git difftool HEAD将工作目录与 MASTER 分支的最后一次提交进行比较,必要时更正错误
    2. git difftool FEATURE将工作目录与 FEATURE 分支的最后一次提交进行比较,必要时更正错误
    3. 提交(更正)合并

答案 1 :(得分:0)

研究为git创建自定义合并驱动程序。以下是一个示例:https://stackoverflow.com/a/5091756/346912

基本上,创建一个始终无法合并的自定义合并脚本,然后告诉git将该脚本用于所有文件,或仅用于特定的文件集。然后合并将始终失败,您可以手动合并所有内容。