【发布时间】:2013-06-24 09:03:06
【问题描述】:
情况:在提出拉取请求时,我希望接收者能够了解它所做的更改。我发现将它们压缩到一个提交中可能会令人困惑,尤其是在以下情况下:
对代码的编辑也被移动了 - diff 将其呈现为批量删除和添加,而不是突出显示编辑。
-
代码被添加到一系列类似的部分,例如case 语句、级联 ifs、yacc 产生式 - diff 通常将更改重建为重叠部分(例如,它不添加一个部分,而是使用前一部分的开头,添加一个新的结尾和另一个开头,然后使用前一部分的结尾);添加新的代码结尾,在某些情况下,挑选出一些小的相似之处,然后删除并插入大量相同的代码。 (我意识到 diff 使用 LCS 并且速度非常快 - 但有时它的结果很难理解,即使考虑到 diff 不具备语法感知能力并且无法识别您看到的代码“部分”)。
李>
顺便说一句:我使用git diff --color-words --ignore-space-change,这很好,但也错误重构,可以隐藏细节 - 我担心收件人可能会使用普通的git diff 并看到完全不同的东西(他们可以不同地重构) .
TASK:好的,因此显而易见的解决方案是将拉取请求分成单独的提交。有时,这些可能是我开始时的实际提交,所以我需要做的就是首先不要 rebase/squash。但我发现即使那样,差异也可能不清楚(尤其是出于上述原因(2)),我需要进一步将它们分开。
执行此操作的明显方法是使用
git add --patch/-p。但是,补丁很难用于重叠更改 - 您可以divide and even edit the hunks,但是当您想要的更改结合了添加、删除和公共代码时,考虑反转差异有点令人费解。我实际上所做的是直接编辑文件:删除我不想要的部分并提交;然后撤消删除(使用我的编辑器)并提交。根据实际来源工作比根据差异工作更清晰和直观 - 但感觉就像我在与 git 作斗争并且做错了(而且,依赖编辑器撤消似乎很容易发生意外)。
我想到先
git stash文件,然后通过删除我不想要的部分来准备第一次提交;然后git stash apply“撤消”该删除以准备第二次提交。但我不确定你是否可以在rebase中间这样做(还没有尝试过)。
问题:我需要 几个小时 才能做到这一点...我想我会通过练习有所提高,但是... 我在正确的轨道上吗?有没有更好的办法?你能从一开始就防止错误重构的差异吗?我是否为了清晰而努力工作?
(说句公道话,这是不久前对微妙而复杂的代码进行的许多编辑 - 花费这些时间揭示了更深入的见解。)
【问题讨论】: