簡體   English   中英

多次應用git diff / patch

[英]Apply git diff/patch multiple times

我使用git flow從develop分支創建了一個新分支newFunction 我將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";
    }   
}

等等。我知道它當前生成的代碼是不正確的,因為這些函數具有相同的名稱。 例如,我將用它來生成遺留系統中的樣板代碼。

回答

我認為您正在尋找的命令是git apply 假設newFunction分支上的最后一次提交僅添加了newFunction的四行,則可以使用以下命令在developer分支上應用相同的更改:

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

Git apply將在此處嘗試將與newFunction分支上一次提交相同的更改應用於dev分支。

在使用測試存儲庫為每個提交添加一個功能的測試時,上述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文件的輸出進行武裝,我們可以獲取所有相關版本並創建具有相應內容的文件,並在其中運行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"

通過兩個手動差異對齊,不難解決:

KDiff3屏幕截圖

我個人創建了一個腳本,該腳本的核心是執行上述命令來解決git沖突,盡管稍微復雜一些,而且我一直都在使用它,我喜歡kdiff3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM