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

时间:2010-07-16 20:23:59

标签: interactive patch git-add

我正在尝试使用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仅将“错误修复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

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

12 个答案:

答案 0 :(得分:97)

这就像在this git-add post

  

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

     
      
  • 空格(表示未更改的行),
  •   
  • 一个-表示该行已被删除,
  •   
  • +表示已添加该行。
  •   
     

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

     

既然你已经在自己喜欢的文本编辑器中打开了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,并且会避免这样的情况:

  

如果你分割一个大块头,编辑第一个子大块,转换一个   如果您尝试暂存,则将上下文行拖尾到删除   第二个subhunk,它会失败。

答案 1 :(得分:43)

当然我迟到了,但是我想提一下这个问题was discussed last year on the git mailing list并且看起来没有太大改变了。

这个特殊问题源于分裂尝试编辑同一个Hunk。 Jeff King最初发布的关于基本问题的分析主要是:

  

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

     

使用进行检查编辑的补丁可以正常工作。但那   没有考虑到您编辑的补丁可能会失败   从长远来看,取决于你是否接受   分裂补丁的另一半。我们还不知道,因为   用户可能没有告诉我们(他们本可以跳过上半场,而且   然后在编辑步骤后再回到它。

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

  

所以一般来说,我认为拆分和编辑同一个块本身就是这样   危险,并将导致这些问题。因为   编辑提供了功能的超集,我认为你应该   只需编辑并允许应用大块的第一部分或   不取决于你的偏好。

只选择编辑之前未拆分的大块,您就不必处理行号。

答案 2 :(得分:37)

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

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

所以它改为:

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

答案 3 :(得分:13)

如果您不想删除暂停删除的行,请参阅

 first line
-second line
 third line

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

答案 4 :(得分: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

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

答案 5 :(得分:7)

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

  

编辑帅哥的秘密

     

编辑帅哥最初可能会让人感到困惑,那就是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 :(得分:6)

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

答案 7 :(得分:6)

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

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

答案 8 :(得分:5)

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

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

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

git config --global core.editor "notepad++"

答案 9 :(得分:3)

如果您将其配置为剥离尾随空白,则可能是您的编辑器出现怪异“您未编辑的大块不适用”消息的原因(可能伴随着类似“错误:补丁片段不带标题的行...”)。显然,这将引起严重的问题,因为修补程序将空行编码为具有一个空格的行,如果使用这种编辑器进行保存,则包含空行的任何块都将无法应用。因此,实际上,如果打开了尾随空白,则包含任何未更改的空行的块将无法在编辑后应用。

答案 10 :(得分:0)

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

答案 11 :(得分:0)

我曾经遇到过这个问题。如果在 Windows 中进行交互式添加,使用 VIM,您不必调整大块头(@@ 之间的内容),您所要做的就是将文件行结尾设置为 Unix (LF)。< /p>

在 VIM 编辑器中,只需在写入/退出之前的某个时间执行以下命令:

:set ff=unix