私は多くのコミットを持つ開発ブランチを持っています。これらのコミットには、実際の変更(機能の追加など)と一時的な変更(たとえば、テストコードを1回のコミットで追加した後、後でコミットするなど)が含まれます。このブランチからの実際の変更は、徐々にマスタに追加されています。追加のたびに、私は新しいマスターの開発ブランチをリベースします。サイクルごとに、開発ブランチとマスターの違いは小さくなっています。ただし、リベースされた開発ブランチには、元の(現在リベースされている)コミットがすべて含まれています。これらのコミットのうちのいくつかは、現在、ネット効果がゼロです。自動的にコミットを削除する方法Gitで自分自身をキャンセルするコミット
簡単な例:この時点で
DEV_BRANCH
Commit ...
Commit D: Remove all test code from f.cpp
Commit ...
Commit C: Add new feature to f.cpp
Commit ...
Commit B: Add more test code to f.cpp
Commit A: Add some test code to f.cpp
Commit ...
MASTER
Commit X: Add new feature to f.cpp
Commit ...
、コミットC
からf.cppへの変更はX
をコミットするように既ににマスターし、合わせたときA
+ B
+ D
をコミット変化がありません〜f.cpp。言い換えれば、ブランチとマスター間のdiffは、ファイルf.cppに対して何も表示しません。
(実際には、A、B、Cを、コミットおよびDは、他のファイルへの変更を含んでいてもよい。)
が自動的にリベース中またはその他のいずれかの開発ブランチにコミットを簡素化する方法はあります?上記の簡単な例で
は、に自動的はC
コミット除去(変化と既に今「空」従って習得するマージ)、また、B
、及びD
(合わせ変化なし)をA
コミットすることが可能です?
さらに複雑なシナリオでは、f.cppが他のファイルも変更すると、開発ブランチ内のコミットから自動的にファイルf.cppの変更を削除することができます(簡略化するため)。それらが他のファイルへの変更を含んでいる場合、存在しますか?
改訂版では、開発ブランチのすべてのコミットのファイルにすべての変更を適用すると、マスターのファイルと同じファイルになりますが、開発ブランチからこのファイルへの変更をプルーニングできますか? (これは、他のファイルへの変更を、ネット効果のないファイルへの変更と同期させる必要がある場合、これが副作用につながる可能性があることを認識しています。しかし、これは私のシナリオでは問題ありません。 - 開発ブランチの中間の状態にピックします。)
@quetzalcoatlはい、私は一般にこれは難しい問題であることを認識しています。しかし、私の状況は制約されているように見えますが、devブランチ自体に中間的な状態は必要ありません。私はマスターから新しいブランチを作成し、オリジナルのdevブランチからすべての変更されたファイルをコピーすることを考えました。しかし、これは1つの新しい一括コミットを作成し、すべての細分性を失います(実際の変更をすべて実行するまでは便利です) –
はこれを考えています。コミット後フィーチャ・オン・マスターとrebase-devel-あなたはdevelとmasterの間で 'merge --squash --no-commit --no-ff'を行うだけで、どのファイルが実際に変更されたかを検出できます。これにより、エフェクトを変更したファイルの一覧が表示されます。** chg **と呼びます。mergeを中止し、HEADのダウンストリームマスターから 'filter-branch'(removeemptycommits)でdevelの履歴を参照し、各コミットを編集してファイルを削除します**これはchg **にはありません。これは、適切な変更だけでなく、誤ったポジションでもコミットを残します。 – quetzalcoatl
その部分は幾分清潔で、簡単で、指数関数的な複雑さなどではなく、おそらくbashスクリプトとして実装可能です。しかし、偽陽性を解決することは元の問題と同じくらい難しいようです。楽観的です大文字小文字の問題ではなく、実際の解決策ではありません – quetzalcoatl