2017-06-01 72 views
0

我聽說git管理文件的差異,而不是整個文件,以使存儲庫更小。 git diff顯示了提交的行添加和刪除操作(甚至是多次提交)。另外,git可以應用*.patch文件。更改提交行的順序

但是在這裏:如何重新排序提交差異的改變行?例如,假設我改變了文件

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

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

這是剛剛重新排序3個分配。

對於此提交,git diff顯示

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(); 
    } 
}; 

因爲@Override關鍵字不適當地移動這是不合乎邏輯的。

我想要得到的東西,如:

-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將文件內容存儲爲快照(整個文件),而不是增量或差異。當您詢問時,您在問題中粘貼的那個差異會根據需求進行計算。

Git支持各種差異算法,您可以選擇使用哪一種算法。一種選擇是耐心算法。它不會產生您想要的差異,但它比默認算法更接近於此。以下是一個示例:

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.