git add --interactive“你编辑的hunk不适用”

问题描述 投票:75回答:11

我正在尝试使用git add --interactive有选择地为我的索引添加一些更改,但我不断收到“你编辑的hunk不适用。再次编辑...”消息。即使我选择了e选项,我也会收到此消息,并立即保存/关闭我的编辑器。换句话说,根本不编辑hunk,补丁不适用。

这是我正在使用的确切示例(我正在尝试整理一个小型演示):

原始档案:

first change
second change off branch
third change off branch
second change
third change
fourth change

新文件:

Change supporting feature 1
first change
second change off branch
third change off branch
second change
third change
fourth change
bug fix 1
change supporting feature 1

我试图展示如何使用git add --interactive只将“bug fix 1”行添加到索引中。在文件上运行交互式添加,我选择了补丁模式。它告诉我

diff --git a/newfile b/newfile
index 6d501a3..8b81ae9 100644
--- a/newfile
+++ b/newfile
@@ -1,6 +1,9 @@
+Change supporting feature 1
 first change
 second change off branch
 third change off branch
 second change
 third change
 fourth change
+bug fix 1
+change supporting feature 1

我回答分裂,接着是“否”来应用第一个大块头。第二个大块头,我尝试编辑。我最初尝试删除底线 - 这不起作用。彻底抛弃大块头也不起作用,我无法弄清楚原因。

interactive patch git-add
11个回答
38
投票

对于此特定示例,您需要调整大块中的行号。换行:

@@ -1,6 +2,8 @@

所以它改为:

@@ -2,7 +2,8 @@

3
投票

奇怪的是“你编辑的hunk不适用”消息(可能伴随着“错误:没有标题的补丁片段在行......”)可能是你的编辑器,如果它被配置为剥离尾随空格。这显然会导致重大问题,因为补丁将空行编码为具有一个空格的行,如果使用这样的编辑器保存,则任何包含空行的块都将无法应用。因此,实际上,任何包含任何未更改的空行的块都将无法应用,如果启用了剥离尾部空格,则无法应用。


0
投票

仅供参考,我得到一个稍微相互关联的错误...当我按照上面建议的说明添加补丁时...但是没有显示错误。我反复要求我提出相同的大块...我注意到我正在运行Vim 7.4的旧版本...我升级了vim,它现在按预期工作。希望这会帮助某人..


98
投票

这就像在this git-add post

手动编辑大块是非常强大的,但如果你以前从未做过,也会有点复杂。 要记住的最重要的事情是:除了其他任何缩进之外,diff总是缩进一个字符。 角色可以是:

  • 空格(表示不变的线),
  • 一个-表明该线已被移除,
  • +表示该线被添加。

没有其他的。它必须是空格, - 或者+。还有别的,你会得到错误 (更改的行没有字符,因为这些是通过删除旧行并将更改后的行添加为新行来处理的)。

既然你已经在自己喜欢的文本编辑器中打开了diff(你确实配置Git使用你最喜欢的文本编辑器,对吗?),你可以做任何你想做的事 - 只要你确保产生的差异干净利落。

这就是诀窍。如果您以前从未这样做过,Git会告诉您“您编辑的大块不适用。再次编辑?”通常情况下,你会开始讨厌自己无法解决这个问题,即使它看起来很容易(或Git,因为它无法弄清楚你想要什么)。

让我常常被绊倒的一件事就是我忘记了一个字符缩进。 我要标记一行 - 要删除,但在大多数插入-的文本编辑器中,它不会覆盖之前的空间。这意味着你要为整行添加一个额外的空间,这反过来意味着diff算法无法找到/匹配原始文件中的行,这反过来意味着Git会对你大喊大叫。

另一件事是差异仍然有意义。 “Sense”意味着它可以干净利用。究竟你如何创建一个明智的差异似乎是一个黑暗的艺术(至少现在对我来说),但你应该始终记住原始文件的样子,然后相应地计划你的-s和+ s。如果你经常编辑自己的帅哥,你最终会掌握它。

另见commit on git add -p

Ortomala Loknianswer指的是Joaquín Windmüller博客文章“Selectively select changes to commit with git (or Imma edit your hunk)

Git想要做的不是计算线条,而是在应用所述编辑的块之前合并重叠的块(当编辑一个块时)。 这是discussed mid-2018,并将避免像以下情况:

如果您拆分一个块,编辑第一个子块,将一个尾随上下文行转换为删除,那么如果您尝试暂存第二个子块,它将失败。


43
投票

当然我迟到了,但是想要记录一下,这个问题was discussed last year on the git mailing list和它看起来没那么多变化了。

这个特殊问题源于分裂和尝试编辑同一个大块。最初由杰夫金发布的分析基本问题主要是:

嗯。好的我明白了。 “这个差异应用”检查将分割补丁的两个部分都提供给git-apply。但当然第二部分永远不会正确应用,因为它的上下文与第一部分重叠,但不考虑它。

只使用编辑过的补丁进行检查就可以了。但是,这并没有考虑到您编辑的补丁可能无法长期应用,具体取决于您是否接受拆分补丁的另一半。我们还不知道,因为用户可能没有告诉我们(他们可能已经跳过了上半部分,然后在编辑步骤后再回到它)。

杰夫以非常实用的解决方案总结他的帖子,总是成功,因此强烈推荐:

所以一般来说,我认为拆分和编辑同一个大块本质上是危险的,并且会导致这些问题。因为编辑提供了功能的超集,我认为您应该只编辑并根据您的偏好允许应用或不应用块的第一部分。

通过仅选择编辑之前未拆分的块,您将不必处理行号。


13
投票

如果您不想删除暂存以进行删除的行,请参阅

 first line
-second line
 third line

如果你想保留第二行,请确保用空格替换-,而不是删除整行(因为你要删除一行)。 Git将使用该行作为上下文。


11
投票

我最近想通过阅读这个线程如何进行手动编辑。

我使用的技巧是,如果我有这样的差异。

+ Line to add
+ Line to add
+ Line I dont want to include
+ Line I dont want to include

诀窍是删除我不想完全使得生成的差异看起来像这样的两行。

+ Line to add
+ Line to add

虽然这对大多数人来说很明显,但直到今天才对我有用,我想我应该分享一下我的经验。请告诉我这种方法是否有任何危险。


7
投票

同样正确修改hunk标头(例如@@ -1,6 +1,9 @@)也很重要。 Joaquin Windmuller在他的一个blog post中揭示了大块头编辑的秘密。

编辑帅哥的秘密

编辑帅哥一开始可能会让人感到困惑,git为你提供帮助但却不足以开始使用的说明。

# —||

# To remove ‘-’ lines, make them ’ ’ lines (context).

# To remove ‘+’ lines, delete them.

# Lines starting with # will be removed.

#

# If the patch applies cleanly, the edited hunk will immediately be

# marked for staging. If it does not apply cleanly, you will be given

# an opportunity to edit again. If all lines of the hunk are removed,

# then the edit is aborted and the hunk is left unchanged.

秘诀是...计数线:

  • 如果删除以+开头的行,则将一行减去新的行数(块的标题的最后一位)。
  • 如果删除以 - 开头的行,则在新行计数(hunk标题的最后一位)中添加一行。
  • 不要删除其他线(参考线)。

这应该允许您快速修改帅哥以选择您想要的部分。


6
投票

我来到这个问题寻找相同问题的解决方案,并且无法弄清楚如何更改大块中的行号(如上所述)以获得git接受它在我的情况下。我找到了一个更好的方法,使用git gui做到这一点。在那里,您可以选择要分级的差异中的线条,然后右键单击并选择“从提交中分割线条”。我记得git-cola也有相同的功能。


6
投票

您可以手动编辑行号,这在某些情况下非常有用。但是,您可能已经避免了这个特殊问题,而不是首先拆分大块。

如果你看到你可能需要稍后在Git自动选择的大块中编辑某些东西,最好只编辑整个大块而不是分割,分段一半,然后编辑另一半。 Git会做得更好。


5
投票

我收到此错误时遇到的另一个问题是,当我保存编辑文件时,行结尾发生了变化。

我使用Windows并使用记事本进行编辑(仅使用Windows行结尾保存)。我的代码是用Notepad ++编写的,我将其设置为具有Unix / Linux样式的行结尾。

当我更改我的设置以将Notepad ++作为默认的git编辑器时,我能够对hunk进行编辑。

git config --global core.editor "notepad++"
© www.soinside.com 2019 - 2024. All rights reserved.