使用 git add --patch <filename> 手动编辑

Posted

技术标签:

【中文标题】使用 git add --patch <filename> 手动编辑【英文标题】:Manually editing using git add --patch <filename> 【发布时间】:2013-07-23 09:01:48 【问题描述】:

所以,我有一个我一直在分支 A 中处理的文件,我正准备提交它。但是,查看差异,我认为最好将其放入两个单独的提交中(好吧,在这种情况下,可能是两个单独的分支)。我之前使用过 git add --patch 来分阶段,所以我想我可以使用它。问题是,我需要分裂我的一个帅哥。运行git add --patch SdA.py 并使用e 编辑问题块...

# Manual hunk edit mode -- see bottom for a quick guide
@@ -50,13 +50,74 @@ import PIL.Image as im

 import constant

+
+def exp_range(min=None, max=None, step=None):
+    """
+    Generate an exponentially increasing value scaled and offset such
+    that it covers the range (min, max].  Behaviour is similar to
+    exp(x), scaled such that the final value generated is equal to
+    'max'.  'step' defines the granularity of the exponential
+    function.  The default value is 5, corresponding to a step-size
+    of tau.
+
+    :type min: float
+    :param min: minimum value of range (offset)
+
+    :type max: float
+    :param max: Maximum (final) value of range
+
+    :type step: int
+    :param step: Number of incremental steps within the range
+                 (min, max]
+    
+    """
+    if min is None:
+        raise StopIteration
+
+    # One input argument (same as range(10))
+    if min is not None and max is None and step is None:
+        step = min
+        min = 0.
+        max = 1.
+    elif step is None:
+        step = 5
+
+    for i in xrange(step):
+        exp_rate = np.exp(i - (step-1))
+        yield min + (max - min) * exp_rate
+    raise StopIteration
+
+
 def norm(input):
+    """
+    Return the norm of a vector or row-wise norm of a matrix
+
+    :type input: theano.tensor.TensorType
+    :param input: Theano array or matrix to take the norm of.
+    
+    """
     return T.sqrt((input * input).sum(axis=0))


 def normalize(vector, scale=1.0, offset=0.5):
+    """
+    Normalize (Zero and scale) a vector such that it's peak to peak
+    value is equal to 'scale', and it is centered about 'offset'.
+
+    :type vector: numpy.ndarray
+    :param vector: Vector to normalize to the given parameters.
+
+    :type scale: float
+    :param scale: Peak-to-peak range to stretch or shrink the vector's
+                  current peak-to-peak range to.
+
+    :type offset: float
+    :param offset: Value at which to center the peak-to-peak range at.
+    
+    """
     return (vector - vector.min()) * scale / vector.ptp()

+

没关系。底部有一个迷你指南。我明白了。因此,我们希望将新函数放入此提交中,并将其他函数的文档放入另一个提交中。根据迷你文档:# To remove '+' lines, delete them.

# Manual hunk edit mode -- see bottom for a quick guide
@@ -50,13 +50,74 @@ import PIL.Image as im

 import constant

+
+def exp_range(min=None, max=None, step=None):
+    """
+    Generate an exponentially increasing value scaled and offset such
+    that it covers the range (min, max].  Behaviour is similar to
+    exp(x), scaled such that the final value generated is equal to
+    'max'.  'step' defines the granularity of the exponential
+    function.  The default value is 5, corresponding to a step-size
+    of tau.
+
+    :type min: float
+    :param min: minimum value of range (offset)
+
+    :type max: float
+    :param max: Maximum (final) value of range
+
+    :type step: int
+    :param step: Number of incremental steps within the range
+                 (min, max]
+    
+    """
+    if min is None:
+        raise StopIteration
+
+    # One input argument (same as range(10))
+    if min is not None and max is None and step is None:
+        step = min
+        min = 0.
+        max = 1.
+    elif step is None:
+        step = 5
+
+    for i in xrange(step):
+        exp_rate = np.exp(i - (step-1))
+        yield min + (max - min) * exp_rate
+    raise StopIteration
+
+
 def norm(input):
     return T.sqrt((input * input).sum(axis=0))


 def normalize(vector, scale=1.0, offset=0.5):
     return (vector - vector.min()) * scale / vector.ptp()

看起来不错。让我们添加那只小狗...

error: patch failed: SdA.py:50
error: SdA.py: patch does not apply
Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]?

嗯...git add --interactive "Your edited hunk does not apply" 和How to read the output from git diff? 解释说我必须更新受影响的行号。为此,现在,我可以手动计数并说“嗯,我删除了 1、2、3……23 行。我之前编辑了 74 行,现在我正在编辑……嗯……希望我有一个计算器…….. 51 行”(“哇,我出汗了”)

这似乎是一种过于复杂的方法。我仍然认为补丁是正确的方法,但是如果我需要手动更新目标文件中受影响的行数,我一定是做错了。有人对如何更轻松有效地做到这一点有任何建议吗?

【问题讨论】:

【参考方案1】:

# 注释掉要删除的行,而不是删除它们,解决了这个问题。我不确定该行为是否是 emacs 的一部分,但评论一行实际上会减少补丁消息顶部的计数器。我发现另一个有用的功能是使用s 首先拆分大块,然后单独添加每个块。在这个特定的示例中,这将是更好的解决方案。

【讨论】:

这在崇高的情况下也适用于我(虽然没有计数器自动递减)【参考方案2】:

有 Git GUI 可以很容易地选择性地暂存行,您所要做的就是选择单独的行并添加它们,无需手动编辑大块。

两个这样的 GUI 是 SourceTree 和 Git Cola。

【讨论】:

我有点反感 GUI,因为我觉得它们给大多数东西添加了不必要的抽象。这可能是好的也可能是坏的。对于复杂的操作,GUI 变成了一种工具,而且可能比我曾经做的要好得多。但是对于简单的操作,(而且我感觉这个补丁是一个简单的操作),我认为应该首选命令行。我会等几天,看看是否有其他答案。不过,谢谢你的建议。 @Phox 对于它的价值,我几乎完全从命令行使用 Git,但对于选择性暂存,我的经验是 GUI 让它更快、更容易。 +1 for git-cola,我一直在为 linux 寻找该功能,我经常使用 git add -p 但由于某种原因,“s”不能很好地工作。跨度> 这根本不能回答问题。这个问题涉及 CLI git(它是一个适当的客户端),并且有一种方法可以用它来做到这一点,而不管其他工具如何比较的意见。

以上是关于使用 git add --patch <filename> 手动编辑的主要内容,如果未能解决你的问题,请参考以下文章

如何在 git add --patch 中使用 --color-words?

如何在 git add --patch 中使用 --color-words?

如何使用寻呼机进行长 git add --patch hunks?

`Git add --patch` 多个文件:从上一个文件转到大块

[Git] Use git add --patch for better commit history and mitigating bugs

git am 合并 patch 时冲突的解决方法