【问题标题】:Apply git diff/patch multiple times多次应用 git diff/patch
【发布时间】:2015-10-18 11:11:52
【问题描述】:

我使用 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";
    }

}

当时是否可以在developnewFunction 之间应用diff?可能使用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";
    }   
}

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

【问题讨论】:

    标签: php git merge patch


    【解决方案1】:

    回答

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

    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 modified 用于文件,git ls-files -u 将显示类似

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

    处理合并冲突的附加提示

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

    $ 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"
    

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

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

    【讨论】:

    • 太棒了,我的 IDE (intellij) 处理合并冲突毫不费力,我最终遇到了与您的 kdiff 相同的情况。
    猜你喜欢
    • 2018-08-10
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2020-12-13
    相关资源
    最近更新 更多