私はいたずらだった...「カウボーイコーディング」が多すぎて、十分なコミットができなかった。さて、ここで私は非常に大きなコミットメントを持っています。はい、私はずっとコミットしていたはずですが、今では遅すぎます。
何が良いですか?
注:現在のところ、このプロジェクトに取り組んでいるプログラマは私だけです。少なくともより多くのプログラマーを雇うまで、これらのコミットコメントのいずれかを見る唯一の人は私です。
ところで:SVNとSubclipseを使用しています。これらの変更を行う前に、新しいブランチを作成しました。
詳細情報:そもそもどうしてこのような状況に陥ったのかについて別の質問をしました: アプリケーションの書き換えを準備する方法接着剤
答えるには、これらのコミットの結果を将来どのように使用するかを自問する必要があります。最も一般的な理由は次のとおりです。
最初の2つの理由は、変更されたコードの各行に等しく適用されるチェックインメッセージを作成できると仮定して、1つの大きなチェックインでも同様に提供できます。あなたが唯一のプログラマーである場合、小さなコミットでマージを簡単にすることはできません。未送信の変更の一部のみでリリースまたはテストを行う予定がない場合、最後の2つの理由は当てはまりません。
小さなコミットを行う理由は他にもありますが、それらは変更の真っ最中にあり、その時間が過ぎているためです。これらの理由により、間違いや実験的な変更を取り消すことが容易になり、巨大な恐ろしいマージを行わなくても同僚との同期を維持しやすくなります。
あなたが説明したあなたの状況についての私の理解から、現時点でコミットを分割することにはほとんどメリットがないようです。
私はあなたが何をしても、あなたがコードをチェックインしないようにしてくださいknowはコンパイルされません。
3番目のオプションが実行可能であると考える場合は、コミットのシーケンスによってコンパイル不可能なシステムが作成されないことを確認できる限り、それはそれを行うための良い方法かもしれません。それ以外の場合は、1つの大きなコミットを実行してください。それは醜いですが、それはシンプルで迅速で、それを成し遂げます。今後は、もっと頻繁にコミットする。
頻繁に、小さく、有意義なコミットを行う最も重要な理由は、コードの履歴の理解を助けることです。特に、理解可能な差分を生成することが難しい場合、コードがどのように変更されたかを理解することは非常に困難です。
オプション1行った変更の履歴を難読化しますが、それ以外の場合は問題は発生しません。
オプション2行った変更の履歴を難読化します。おそらくオプション1よりやや少なくなりますが、コミットが明確であると想定するか別の方法で結論を出すと、自分や他の人に他の問題を引き起こす可能性があります。独立して他のブランチにマージできます。これがオプション1よりも好ましい実際的な理由がない限り、これはそれより理想的ではありません。
オプションが最適で、他はすべて同じですが、他の場所で説明したように、これを行うには「極端な」時間が必要になるか、他の大きなコストが発生する場合は、重量を量る必要がありますよりクリーンなコミットを作成することの期待される利益に対するこれらのコスト。
あなたが提供した情報に基づいて、私はオプション1を選びます。たぶん、変更をコミットするように促すリマインダーを設定する必要がありますか?
特に、唯一のプログラマーであるというあなたのメモと、比較的新しいコードベースで作業しているという私の考えに照らして、覚えておくべきもう1つの考慮事項は、変更のコミットに関して異なる習慣を身につけることがおそらく良いことです。新しいコードのプロトタイプを作成するのではなく、既存のコードを維持または拡張するのです。おそらく両者の間にはそれほどはっきりとした区分はありませんが、それでも有用な区別だと思います。
新しいコードのプロトタイプを作成するときは、変更を保存したいときはいつでもコミットします。ほぼ確実にブランチで、おそらく別のプロジェクトでコミットします。または、バージョン管理の外で完全に作業することもできます。代わりに、検討しているさまざまな仮説または設計の実現可能性に関する証拠の収集に集中できます。私はしばしば、さまざまなツールを使用して小さなプロトタイプを作成します。 Visual Studio for C#コードの代わりにLINQPad。
特定の仮説または設計を検証したら、メインプロジェクト(理想的にはブランチ)でそれを書き直し、変更の性質について他の人(将来のあなたを含む)の理解に最も役立つ小さな意味のあるコミットを行いますあなたが作っています。
唯一の合理的な答えは トランクを壊さない ですが、それができない場合もあります。たとえば、コミットしすぎると、svnがコミットを中断する可能性があります(オプションか機能か、私にはわかりません)。そのような特別な場合は、単にチェックインしてください。あなたは一人のプログラマなので、誰の邪魔にもなりません。
したがって、オプション1を選択します。それが不可能な場合は、オプション2を使用します。
オプション3は多くの労力を必要とし、それだけの価値はありません。
ファイルに複数の修正、変更、追加のメソッド名などがあるため、コンパイルできない可能性が高い小さなコミットに分割してみてください。
私が同じような状況にあると思ったとき、私は次のテクニックを使いました:
git add --patch
git stash save --keep-index
私はSVNに精通していないので、これが特定の状況に当てはまるかどうかはわかりませんが、基本は同じであるはずです。コードの小さな部分を分離して、個別にテストします。
オプション4:一時的な場所でリポジトリの現在の状態をバックアップし、リポジトリを元の状態に戻し、行ったすべての変更のリストを作成し(一時的なバックアップを確認できます)、手動で再実装(およびコンパイル)します。そしてテスト!)それらを別々のコミットとして。
すでにコードを記述しているため、これはより簡単なはずです。一時バックアップからコピーして貼り付ける部分を特定するのはほんの少しです。
すべての変更をきれいに再実装し、コミットが自己完結型で小さく、コンパイルされていることを確認したら、一時バックアップを削除できます。すべてのものが(コミットの時刻/日付を除いて)完全に同じになります。あなたが最初からそれを正しくやっていたらそうだったでしょう。
あなたは唯一のプログラマーです。あなたがしたことの重要な部分を詳述する単一の大規模なチェックインを行うだけです。
あなたがしたことの「部分」をロールバックする可能性はありますか?そうでない場合は、オプション1に進んでください。
コードをバージョン管理システムにチェックインする理由はいくつかあります。そして、それらすべてが、あなたが唯一の開発者である場合、安全性を中心に展開します。つまり、失敗した場合、マシンが死ぬか、何であれ、いつでも最後のチェックポイントに戻ることができます。
後でプロジェクトに参加するプログラマーは、コンパイルされないバージョンにロールバックしたくないでしょう。したがって、私見、オプション2は狂気です。
オプション3はそのような時間のシンクのように聞こえます。私があなたの上司で、これをやって何時間も無駄にしていたのを見たなら、私はあなたとあなたの時間の価値について少し話をするでしょう。
反復する:コードをチェックインすることで、マシンで障害が発生した場合に備えて、お尻を覆い、保存します。それ以外のすべては、1人のチームでウィンドウドレッシングです。
私のルールは次のとおりです。深刻なコードレビューなしではチェックインできません。一人でいる場合は、自分でコードを確認する必要がありますが、コードはwill確認されます。あなたは他の誰かがレビューすることができないコード変更の量を持っているように見えるので、それをあなた自身でレビューすることはできません)。
誰もが完全に破ることのできないルールは次のとおりです。ビルドさえしないコードをチェックインしないでください。また、機能しないコードをチェックインしないでください。
解決策:変更したコードをコピーして、元のポイントに戻ります。一度に1つの変更を元のコードにマージし、それを確認し、テストし、チェックインします。説明したプログラミング方法では、深刻なバグをその方法で見つける必要があります。
また、プログラミングの習慣を身につけるための良い方法でもあります。
心配しすぎだと思います。あなたが唯一のプログラマーであり、それに対応するスペックシートがない場合、それはあなたが何をするか完全にあなた次第です。大規模なコミットを行ったことで誰もあなたを罰するつもりはないと思います。そのため、発生する唯一の問題は技術的なものであり、コミット内で個々のファイルの変更をロールバックできないなどです。現時点ではレポを独占的に管理しているので、それも大きな問題ではありません。
実用主義と独断主義の間に線を引く必要があります。あなたがしたことはチームでは良い考えではなく、おそらくこれ以上繰り返すべきではありませんが、あなたの状況では私は大きなコミットを提出するだけです。