多次应用git diff / patch

时间:2015-10-18 11:11:52

标签: php git merge patch

使用git flow我在newFunction分支之外创建一个新分支develop。 我将newFunction添加到示例类:

class ExampleClass
{

    public function exampleFunction(){
        return "example";
    }

    public function newFunction(){
        return "new";
    }

}

让我说我把它合并到develop,几个月后我回来了,我的班级看起来像这样。

class ExampleClass
{

    public function exampleFunction(){
        return "example";
    }

    public function anotherFunction(){
        return "another";
    }

    public function yetAnotherFunction(){
        return "yetAnother";
    }

    public function newFunction(){
        return "new";
    }

}

是否可以在diffdevelop之间应用newFunction?可能使用git patch或某种黑魔法。 所以我运行了一个神奇的git something命令,我最终得到了类似的东西:

class ExampleClass
{

    public function exampleFunction(){
        return "example";
    }

    public function anotherFunction(){
        return "another";
    }

    public function yetAnotherFunction(){
        return "yetAnother";
    }

    public function newFunction(){
        return "new";
    }

    public function newFunction(){
        return "new";
    }
}

如果我再次这样做,我会得到这个:

class ExampleClass
{

    public function exampleFunction(){
        return "example";
    }

    public function anotherFunction(){
        return "another";
    }

    public function yetAnotherFunction(){
        return "yetAnother";
    }

    public function newFunction(){
        return "new";
    }

    public function newFunction(){
        return "new";
    }

    public function newFunction(){
        return "new";
    }   
}

等。 我知道它当前生成的代码不正确,因为函数具有相同的名称。 例如,我会用它来在遗留系统中生成样板代码。

1 个答案:

答案 0 :(得分:1)

答案

我认为你要找的命令是 git apply 。假设newFunction分支上的最后一次提交只为newFunction添加了四行,您可以使用以下命令在develop分支上应用相同的更改:

git checkout develop
git diff newFunction^ newFunction | git apply --3way
# "newFunction^" means the second last commit on newFunction branch

Git apply将在这里尝试将在newFunction分支上的最后一次提交中完成的相同更改应用到开发分支。

使用测试存储库进行测试时,为每次提交添加一个函数,上面的git apply不能完全应用。但是当使用三向模式时,它将打开结果以供手动解析,例如git status将为文件显示both modifiedgit ls-files -u将显示类似

的内容
100644 21ecaba537582661c82c9dd2dff920a88a4b69a1 1   file.php
100644 56728941868d309cc06a49a8c49afc72cb0285b7 2   file.php
100644 0bbcab178802667c0228e424ce84f4c13a2b4c94 3   file.php

处理合并冲突的其他提示

默认的git行为是为合并冲突部分插入一些文本标记,我觉得很难处理。我更喜欢使用KDiff3以图形方式合并,并且使用ls-files的输出,我们可以获取所有相关版本并创建具有相应内容的文件,我们运行kdiff3。 E.g。

$ git cat-file blob 21ecaba537582661c82c9dd2dff920a88a4b69a1 > file1.php
$ git cat-file blob 56728941868d309cc06a49a8c49afc72cb0285b7 > file2.php
$ git cat-file blob 0bbcab178802667c0228e424ce84f4c13a2b4c94 > file3.php
$ kdiff3 -o file_merged.php file1.php file2.php file3.php
$ mv file_merged.php file.php
$ git add file.php
$ git commit -m "Manually resolved git apply result"

使用两个手动差异对齐,不难解决:

KDiff3 screenshot

就个人而言,我已经创建了一个脚本,其核心是执行上述命令来解决git冲突,虽然有点复杂,我一直都在使用它,我喜欢kdiff3。