状況: プル リクエストを作成するとき、受信者がどのような変更を行うかを理解できるようにしたいと考えています。特に次の場合は、それらを 1 つのコミットに押しつぶすと混乱する可能性があります。
同じく移動されたコードへの編集があります - diff はこれを大規模な削除と追加としてレンダリングし、編集を強調表示しません。
コードは一連の同様のセクションに追加されます。例: case ステートメント、カスケード ifs、yacc 生成 - diff は、多くの場合、重複するセクションとして変更を再構築します (たとえば、セクションを追加する代わりに、前のセクションの先頭を使用し、新しい末尾を追加し、別の始まり、次にその前のセクションの仕上げを使用します); は、新しいコーディアン エンディングを追加し、場合によっては、いくつかのマイナーな類似点を選択してから、大量の同一コードを削除および挿入します。(diff は LCS を使用しており、驚くほど高速であることは認識していますが、diff が構文を認識しておらず、表示されるコードの「セクション」を認識できない場合でも、結果を理解するのが難しい場合があります)。
ところで:私は を使用していますgit diff --color-words --ignore-space-change
が、これは素晴らしいですが、再構成を誤ると、詳細を隠すことができます。また、受信者がプレーンgit diff
を使用して、まったく異なるものを表示する可能性があることを懸念しています(再構成が異なる可能性があります)。
TASK : わかりました。これに対する明白な解決策は、プル リクエストを別々のコミットに分割することです。場合によっては、これらは私が開始した実際のコミットである可能性があるため、最初からリベース/スカッシュする必要はありません。しかし、それでも差分が不明確になる可能性があり (特に上記の理由 (2) により)、それらをさらに分離する必要があることがわかりました。
これを行う明白な方法は、 を使用すること
git add --patch/-p
です。ただし、重複する変更に対してパッチを使用するのは困難です。dhunks を ivid したり、edit したりすることもできますが、必要な変更が追加、削除、および共通コードを組み合わせた場合、diff を逆にするという観点から考えると、やや気が遠くなります。私が実際に行ったことは、ファイルを直接編集することです。不要な部分を削除してコミットします。次に、その削除を(私のエディターで)元に戻し、それをコミットします。実際のソースに関して作業することは、差分に関して作業するよりもはるかに明確で直感的です - しかし、私は git と戦って間違ったことをしているように感じます (また、エディターの取り消しに頼るのは事故を起こしやすいようです)。
代わりに最初
git stash
にファイルを作成し、不要な部分を削除して最初のコミットを準備することに私は思いつきます。次にgit stash apply
、その削除を「元に戻す」ことで、2 番目のコミットを準備します。しかし、途中でそれができるかどうかはわかりませんrebase
(まだ試していません)。
質問: これをすべて行うには何時間もかかります... 練習すれば上達すると思いますが... 正しい道を進んでいますか? より良い方法はありますか?そもそも、誤って再構築された差分を防ぐことができますか? 私は明確にするために一生懸命働きすぎていますか?
(公平を期すために、これは少し前に行われた微妙で複雑なコードの多くの編集でした。これらの時間を費やすことで、より深い洞察が明らかになりました。)