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