進行中のリファクタリングをコミットする方法は?


23

それで、私はこの大きなプロジェクトを持っています。それは私によってリファクタリングされるプロセスにあります。私は多くのものを変更しているので、すぐにコンパイルする機会はありません。私は名前を付けた特別なgitブランチに住んでいますcleanupmasterもちろん、最終的にはマージされます)。

問題は、非コンパイルコードをコミットしないというポリシーがあることです(理想的には動作するはずですが、少なくともコンパイルしてリンクする必要があります)。そのため、この巨大なタスクを完了するまで、何もコミットできません(レビューまたは簿記のため)。
これは私が仕事をするのが好きな方法ではありません(ほとんどの人が少なくとも1日に1回程度コミットしていると思います)。

どう思いますか?私が見落としている解決策はありますか?
後でコミットなどを集約するようにgitに指示できますか?ブランチに留まっている限り、コンパイルしないコミットで生きることができcleanupます。

編集

プッシュ/コミットの件名:私はそれが大きな違いであることを知っていますが、後で、私のものをにマージすると壊れたリビジョンがありますmaster。したがって、履歴を参照する(またはgit bisect...)場合、「ローカル」リビジョンは世界中からアクセス可能になります。したがって、ローカルでコミットするだけでプッシュするのは最善の解決策ではありません。それは後で問題が発生するからです(サブジェクトが閉じられ、しばらく忘れられた場合)。

要するに、ローカルコミットは最終的にプッシュされます。グローバル履歴には、コンパイルされていないコミットは表示されません。


1
単一のグローバルコミットで複数のローカルコミットを収集できます。

@Thorbjørnは、以下のJimの推奨事項ですか、それともGit内の別のメカニズムですか?
ブライアン

私はそう信じています-私は正確なコマンドを思い出すことができません。

5
あなたはリファクタリングではなく、もっと大きなことをしています。コードベースでリファクタリングするたびに、コードがコンパイルされ、まったく同じ観測可能な動作が行われます。私の即座の反応は「あなたが持っているものをいつでもコミットし、それがすべてうまくいくはずだ」ということを反映して、質問のタイトルを変更したいかもしれません。
デビッドソーンリー

1
@bitmask書き換えはどうですか?
デイブヒリアー14年

回答:


21

このgit merge --squashコマンドを使用すると、現在のブランチの上に単一のコミットを作成でき、その効果は別のブランチのマージと同じです。このコマンドは作業ツリーを更新し、インデックスの変更をステージングするため、次に行う必要があるのはコミットのみです。

git checkout master
git merge --squash cleanup
git commit -m "Merge cleanup branch"

git rebase -iまた、このコマンドはコミットを潰すが、より多くの作業が必要となることができます。


14

書き換えはリファクタリングではありません

Gitの使用方法に興味があることは理解していますが、Gitを使用する方法よりもリファクタリングの方法を変更することを検討する必要があると主張します(Gitが役立つと思いますが)。

Martin Fowlerはリファクタリングを次のように定義しています次のようにます:

既存のコード本体を再構築し、外部の動作を変更せずに内部構造を変更するための規律あるテクニック。

その中心は、変換を維持する一連の小さな動作です。各変換(「リファクタリング」と呼ばれます)はほとんど行いませんが、一連の変換によって大幅な再構築が行われる可能性があります。それぞれのリファクタリングは小さいので、間違いが起こる可能性は低くなります。システムは小さなリファクタリングのたびに完全に機能し続けるため、再構築中にシステムが深刻に破損する可能性が低くなります。

このメソッドを適用すると、定期的にコミット(およびプッシュ)できます。

これは非実用的であり、大規模なものでは機能しないと主張するかもしれません。これがミカドメソッドですが役立つ場所です。依存関係グラフを作成して、大きなリファクタリングを一連の小さなリファクタリングに分解します。このメソッドは再帰的であり、変更を試みます。チェックインを中断することはありません。それ以外の場合は、変更を元に戻し、前提条件を書き留めます。リファクタリングの主な目標を達成できるまで、これらの前提条件のリファクタリングを1つずつ修正します。

Gitはこの方法を本当に助けてくれます。ローカル(壊れた)ブランチを維持できます。サブゴールをコミット(およびプッシュ)するときrebase、メインゴールは、それが壊れなくなるまで、先ほど行ったコミットの上に分岐できます。


5

git rebase、特にgit rebase -iバリアントのマニュアルページをご覧ください。履歴内の任意の数のコミットを並べ替えたり、削除したり、まとめたりすることができます。これは、探しているもののように聞こえます。私はあなたが説明する状況で常にそれを使用します:公共の消費に適さない多くの小さなコミットを作成し、共有リポジトリにプッシュする前にそれらを単一の「リファクタリング」コミットにまとめます。


3

Gitを使用しているため、コミットは必ずしもプッシュを意味するわけではありません変更する

私見、およびGitを使用して、コンパイルしない場合でも作業をコミットすることは完全に良いことです... もちろん、プッシュする前に、他のユーザーが問題なく変更をフェッチしてマージできるように、正常に動作してコンパイルすることを確認する必要があります。

また、マスターブランチとは異なるブランチで作業しています。したがって、必要に応じて(これをお勧めします)、ブランチをプッシュすることはありません。リファクタリングが完了したら、masterブランチをチェックアウトし、変更をマージしてmasterブランチをプッシュするだけです。

編集

その場合は、使用しgit cherry-pickたり、遊んだりできますgit rebase


重要なメモですが、これを検討しました。私の編集をご覧ください。ありがとうございました。
ビットマスク

上記の私の編集を参照してください。
クリスチャン

できれば-1にします。コミットが利用可能になります!ローカルの進行中のコミットは素晴らしいですが、決してプッシュしないでください。コードを理解しにくくし、git bisectを中断し、履歴を複雑にします。代わりにリベースまたはスカッシュします。
RJファルコナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.