gpt4 book ai didi

git - 如何在使用 git 删除函数及其文档 block 时创建适当的补丁

转载 作者:太空狗 更新时间:2023-10-29 13:42:48 27 4
gpt4 key购买 nike

当您在多个函数之上有文档 block 时,删除一个函数会创建一个次优补丁。

index.js:

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

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

删除函数 foo 及其文档 block 会生成以下补丁:

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

这意味着任何 merge 带来的提交触及函数 foo 和函数 bar 之间的空间现在都会导致冲突。例如,假设我们在删除 foo 之前创建了一个分支 feature-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.

如果我们删除 middle block ,默认 diff 会保留第二个 block: 行并删除第三个 block: 行。打开压缩将 diff block 向上移动,直到它到达第二个 block: 上方的空白行,这就是我们想要的。

不幸的是,如果我们删除 first block ,压缩启发式尝试将 diff hunk 向上移动以包含第一个 block: 行,但失败了,因为它命中了文件顶部,上面没有空行(因为上面根本没有行)。因此,它保留第一个单词 block: 并删除第二个单词。

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

关于git - 如何在使用 git 删除函数及其文档 block 时创建适当的补丁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40131362/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com