更改提交更改行的顺序

时间:2017-06-01 03:55:53

标签: git

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

只是重新排序三个作业。

对于此提交,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的默认策略无法反映更改的含义。 (这会给同行评审带来困难。)此外,(虽然这是一种意见),如果没有像我的意思那样管理线路的变化,就会发生冲突。

如何更改提交更改行的顺序

1 个答案:

答案 0 :(得分:3)

  

我听说git管理文件的差异,而不是整个文件,以使存储库更小。

这是不正确的。 Git将文件内容存储为快照(整个文件),而不是增量或差异。您问题中粘贴的差异会在被要求时按要求计算。

Git支持各种diff算法,您可以选择使用哪种算法。一种选择是耐心算法。它不会产生您想要的差异,但它比默认算法更接近。这是一个例子:

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.