如何使用git删除函数及其docblock时创建适当的补丁

当您拥有多个函数以上的docblock时,删除函数会创建一个次优补丁.

index.js:

/**
 * Function foo description.
 */
function foo() {}

/**
 * Function bar description.
 */
function bar() {}

使用docblock删除函数foo会生成以下补丁:

diff --git a/index.js b/index.js
index f4e18ef..933004f 100644
--- a/index.js
+++ b/index.js
@@ -1,9 +1,4 @@
 /**
- * Function foo description.
- */
-function foo() {}
-
-/**
  * Function bar description.
  */
 function bar() {}

这意味着任何带有它的合并提交触摸函数foo和函数栏之间的空间现在会导致冲突.
例如,想象一下我们在删除foo之前创建了一个分支特征-1,并且在index.js中添加了两个函数foobar.冲突如下:

/**
<<<<<<< HEAD
=======
 * Function foo description.
 */
function foo() {}

/**
 * Function foobar description.
 */
function foobar() {}

/**
>>>>>>> feature-1
 * Function bar description.
 */
function bar() {}

我想如果/ **从顶部被抓住就不会有问题.我敢肯定,git更喜欢从最终删除,但我想强迫它从一开始就抓住它.有没有办法轻松做到这一点?或者是手动补丁编辑的唯一方法?

最佳答案 它远非完美,但Git 2.9中新的–compaction-heuristic经常做你想要的.有关详情,请参见
this blog post.您可以将其配置为默认打开,但鉴于它有时会使事情变得更糟,我还没有这样做:

git config --global diff.compactionHeuristic true

你的Git版本必须至少为2.9才能产生任何效果.

当前实现中的一个缺陷是它在字面上需要在修改部分上方留下空白行.从文件顶部开始是不够的.例如,假设我们从:

block:
This file has
three blocks.

block:
There is a blank line
between each.

block:
This is the third
block.

如果我们删除中间块,则默认diff保留第二个块:line并删除第三个块:line.打开压缩会移动差异块,直到它到达第二个块上方的空白行:这就是我们想要的.

不幸的是,如果我们删除第一个块,压缩启发式尝试将diff块向上移动以包含第一个块:line,但是因为它到达文件的顶部而失败,因为它上面没有空行(因为它有它上面没有线路).因此它留下第一个单词块:就位并删除第二个单词块.

(修复此问题只需要压缩算法提供一个空白的“虚线零”.请注意,问题本身永远不会发生在文件的末尾,因为默认差异有利于删除后面的行.同时,一个丑陋的解决方法是在每个文件的顶部留一个空行,以便压缩可以看到它.)

点赞