2017-06-01 20 views
0

gitはリポジトリを小さくするために、ファイル全体ではなくファイルの違いを管理していると聞きました。 git diffは、コミット(または複数のコミット)の行の追加と削除を示します。また、gitは*.patchファイルを適用できます。コミットの変更された行の順番を変更

しかし、ここで:コミットの違いの変更された行をどのように並べ替えることができますか?例えば、私はちょうど3つの割り当てを並べ替えている

c = new C() { 
    @Override 
    method3() { 
    do_nothing(); 
    } 
}; 
b = new B() { 
    @Override 
    method2() { 
    do_whatever(); 
    } 
}; 
a = new A() { 
    @Override 
    method1() { 
    do_something(); 
    } 
}; 

にファイル

a = new A() { 
    @Override 
    method1() { 
    do_something(); 
    } 
}; 
b = new B() { 
    @Override 
    method2() { 
    do_whatever(); 
    } 
}; 
c = new C() { 
    @Override 
    method3() { 
    do_nothing(); 
    } 
}; 

を変更したとします。このため

コミット、git diff@Overrideキーワードが適切に動かないので、論理的ではない

diff --git a/a b/a 
index cd702e1..7baebbe 100644 
--- a/a 
+++ b/a 
@@ -1,7 +1,7 @@ 
-a = new A() { 
+c = new C() { 
    @Override 
- method1() { 
- do_something(); 
+ method3() { 
+ do_nothing(); 
    } 
}; 
b = new B() { 
@@ -10,9 +10,9 @@ b = new B() { 
    do_whatever(); 
    } 
}; 
-c = new C() { 
+a = new A() { 
    @Override 
- method3() { 
- do_nothing(); 
+ method1() { 
+ do_something(); 
    } 
}; 

を示しています。また、コミット私はパッチファイルを作り、それの行の順序を変更し、コミットとしてそれを適用するときに

-a = new A() { 
- @Override 
- method1() { 
- do_something(); 
- } 
-}; 
+c = new C() { 
+ @Override 
+ method3() { 
+ do_nothing(); 
+ } 
+}; 
b = new B() { 
    @Override 
    method2() { 
    do_whatever(); 
    } 
}; 
-c = new C() { 
- @Override 
- method3() { 
- do_nothing(); 
- } 
-}; 
+a = new A() { 
+ @Override 
+ method1() { 
+ do_something(); 
+ } 
+}; 

しかし、以前のものとgit diff同じを持って(@Overrideない:

私のようなものを取得したいです移動した)。

複雑な改行を含むコミットの場合、デフォルトポリシーgit diffは変更の意味を反映することができません。また、(これは意見ではあるが)行の変更が管理されていない場合でも、競合が発生する可能性がある。

がどのようにコミット

+0

なぜそれが同じ行があることをだならばgitのでしょうか? – odradek

+1

Git diffには "移動した行"の概念はなく、単にあなたが "これらを削除しました"と "あなたがこれらを追加しました"したがって、あなたのケースでは、周囲の線は変更されていないので、変更の一部とはみなされません。また、 "git diff"は単に違いを説明するためにgitがそれらのファイルのスナップショットを内部的に保存するので、diffは単純に出力され、保存されないことに注意してください。 –

答えて

3

の変更行の順序を変更することができ、私はgitのリポジトリを小さくするために、ファイル全体ではなく、ファイルの差分を管理していることを聞きました。

これは間違っています。 Gitはファイルの内容をdeltasやdiffsではなく、スナップショット(ファイル全体)として保存します。あなたの質問に貼り付けたものなどの差異は、要求されたときに必要に応じて計算されます。

Gitはさまざまなdiffアルゴリズムをサポートしており、どちらを使うかを選択できます。 1つのオプションはの忍耐アルゴリズムです。あなたが望む差分を正確に生成するわけではありませんが、それはデフォルトのアルゴリズムよりも近いです。次に例を示します。

diff --git a/a b/a 
index cd702e1..7baebbe 100644 
--- a/a 
+++ b/a 
@@ -1,18 +1,18 @@ 
-a = new A() { 
- @Override 
- method1() { 
- do_something(); 
- } 
-}; 
-b = new B() { 
- @Override 
- method2() { 
- do_whatever(); 
- } 
-}; 
c = new C() { 
    @Override 
    method3() { 
    do_nothing(); 
    } 
}; 
+b = new B() { 
+ @Override 
+ method2() { 
+ do_whatever(); 
+ } 
+}; 
+a = new A() { 
+ @Override 
+ method1() { 
+ do_something(); 
+ } 
+}; 

--diff-algorithmオプションを使用してアルゴリズムを指定できます。

git diff --diff-algorithm=patience 

利用可能なアルゴリズムはgit-diff(1)にリストされている、と私はここでそれから引用されます:

--diff-algorithm={patience|minimal|histogram|myers} 
    Choose a diff algorithm. The variants are as follows: 

    default, myers 
     The basic greedy diff algorithm. Currently, this is the 
     default. 

    minimal 
     Spend extra time to make sure the smallest possible diff is 
     produced. 

    patience 
     Use "patience diff" algorithm when generating patches. 

    histogram 
     This algorithm extends the patience algorithm to "support 
     low-occurrence common elements". 

    For instance, if you configured diff.algorithm variable to a 
    non-default value and want to use the default one, then you have to 
    use --diff-algorithm=default option. 
関連する問題