2017-06-01 63 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.