git add –interactive“你编辑的块不适用”

我试图使用git add --interactive来有select地添加一些更改到我的索引,但我不断收到“您编辑过的大块不适用,再次编辑…”消息。 即使我select了e选项,我也会收到此消息,并立即保存/closures我的编辑器。 换句话说,根本不编辑大块,补丁不适用。

下面是我正在使用的确切示例(我正在尝试放置一个小的演示):

原始文件:

 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”行到索引。 在文件上运行交互式添加,我select了补丁模式。 它介绍了我

 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 

我以分裂做出回应,然后是“不”,以应用第一个大块头。 第二块,我尝试编辑。 我原本试图删除底线 – 这是行不通的。 离开这个笨蛋完全不起作用,我不明白为什么。

对于这个特定的例子,你需要调整大块的行号。 改行:

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

所以它改为:

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

这就像在这个混帐添加post ?

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

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

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

既然你已经在你最喜欢的文本编辑器中打开了diff(你已经configuration了Git来使用你最喜欢的文本编辑器,对吗?),只要你确保最终的diff应用干净,你可以做任何你想做的事情。

其中的诀窍就在于此。 如果你以前从来没有这样做过,Git会告诉你“你编辑过的块不适用,再次编辑? 所以经常,你会开始讨厌自己,因为你无法弄清楚 ,即使看起来很容易(或Git,因为它不知道你想要什么)。

有一件事情经常让我失望,就是我忘了一个字符缩进。
我会标记一个 – 被删除,但是在大多数插入了-文本编辑器中,它不会覆盖之前的空间。 这意味着你要为整行添加额外的空间,这意味着diffalgorithm无法在原始文件中find/匹配该行,这意味着Git会对你大喊大叫

另一件事是差异仍然是有道理的。 “感觉”意味着它可以被干净利用。 究竟是如何创build一个明智的差异似乎是一个黑暗的艺术(至less对我来说),但你应该永远记住原始文件是什么样子,然后相应地计划你的-s和+ s。 如果你经常编辑你的帅哥,你最终会得到它的挂钩。

当然,我迟到了,但还是想提一下这个问题,去年在git邮件列表上讨论过 ,看起来没有什么变化。

这个特定的问题源于分裂尝试编辑相同的块。 正如杰夫·金(Jeff King)最初公布的那样,基本问题的分析基本上是:

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

只有编辑的补丁检查将工作。 但是这并没有考虑到您的编辑补丁可能无法长期应用,这取决于您是否接受拆分补丁的另一半。 而且我们还不知道,因为用户可能没有告诉我们(他们可能跳过了上半部分,然后在编辑步骤之后再回来)。

杰夫用一个非常实用的解决方法结束了他的职位,总是成功的,因此强烈build议:

所以一般来说,我觉得分裂和编辑同样的块是固有的危险,并会导致这些问题。 而由于编辑提供了function的超集,我认为你应该编辑,并允许应用或不根据您的喜好的第一部分大块。

通过只select编辑一个没有先前分割的块,你将不必处理行号。

如果你不想删除一个被删除的行,如下所示

  first line -second line third line 

要保留第二行的位置,请确保用空格replace-而不是删除整行(正如您将删除添加的行)。 Git将使用该行作为上下文。

我最近从阅读这个线程算出如何进行手动编辑。

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

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

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

 + Line to add + Line to add 

虽然这对大多数人来说是最显而易见的,但直到今天,我还是不能这样认为我应该分享我的经验。 请告诉我这个方法是否有危险。

您可以手动编辑行号,这在某些情况下非常有用。 然而,你可能可以避免这个特殊的问题,不要先分裂大块头。

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

我遇到这个错误时遇到的另一个问题是,当我保存编辑文件时,换行结束了。

我正在使用Windows,并使用记事本进行编辑(只保存Windows行尾)。 我的代码是用Notepad ++编写的,我把它设置为具有Unix / Linux风格的行结尾。

当我改变我的设置,使Notepad ++作为默认的编辑器,我能够编辑我的编辑。

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

我来到这个问题寻找解决相同的问题,并不知道如何改变行号(如上面build议的)在大块git接受它在我的情况。 尽pipe如此,我发现使用git gui更好的方法。 在那里你可以select你想要的diff的行,然后右键单击并select“从提交的行”。 我记得git-cola也有相同的function。