ソース管理に変更をコミットする頻度はどれくらいですか?すべての小さな機能の後、または大きな機能のみですか?
私はプロジェクトに取り組んでおり、実装する長期的な機能があります。現在、私はすべての作業、つまりすべてのサブ機能が実装され、バグが修正された後にコミットしています。バグを発見した後、いくつかの機能のテストの新しいチャンクを追加した後でもコミットします。
しかし、私はこのパターンが心配です。仕事の生産的な日に、私は10のコミットをするかもしれません。私がSubversionを使用していることを考えると、これらのコミットはリポジトリ全体に影響を与えるので、本当にたくさん作成するのは良い習慣なのだろうか?
コンパイルして実行するコードの「完全な思考」を完了するたびに、チェックインします。通常、これは15〜60分の間のどこかになります。場合によってはもっと長くなることもありますが、失敗した場合に書き直したくないコードの変更が多数ある場合は、常にチェックインを試みます。また、通常、コードがコンパイルされることを確認し、帰宅する前の作業日の終わりにチェックインします。
「あまりにも多くの」コミット/チェックインの作成について心配する必要はありません。何かを書き直さなければならないときは本当にひどく、念のために少しずつロールバックできるのはいいことです。
あなたの「コミットがリポジトリ全体に影響する」ことを懸念していると言うとき、リポジトリ全体のリビジョン番号が増加するという事実に言及していますか? Subversionが保存に使用するビット数はわかりませんが、リビジョン番号が不足することはないと確信しています! 多くのコミットは問題ではありません。隣の人の10倍の頻度でコミットでき、二酸化炭素排出量はまったく増加しません。
単一の関数またはメソッドは、その機能に応じて名前を付ける必要があります。名前が長すぎる場合は、処理が多すぎます。私は同じルールをチェックインに適用しようとします:チェックインのコメントは、変更が達成することを正確に説明する必要があり、コメントが長すぎる場合は、一度に変更しすぎている可能性があります
私はジェフ・アトウッドのこの小さな記事が好きです: 早めにチェックイン、頻繁にチェックイン
私は、完成した/安定した/コンパイルされたコードのすべての論理グループを個人的にコミットし、その日にやったことをコミットせずにその日を離れないようにします。
大きな変更を行っており、コードで作業している他の人に影響を与えることが心配な場合は、新しいブランチを作成し、変更が完了した後にトランクにマージし直すことができます。
タスクが完了するたびにコミットします。通常、30分から1時間かかります。
バージョン管理コメントが1つまたは2つの文よりも長い場合、おそらく十分な頻度でコミットしていません。
実際に動作しないコードをコミットしないでください。リポジトリをバックアップソリューションとして使用しないでください。
代わりに、不完全なコードを自動化された方法でローカルにバックアップしてください。 Time Machineが私の面倒を見てくれ、他のプラットフォーム用の無料プログラムがたくさんあります。
私はオープンソースのマントラ(言い換え)に従います-早くコミットし、頻繁にコミットします。
基本的に、他のチームメンバーに問題を引き起こすことなく、便利な機能を追加したと思うたびに(ただし小さい)。
このコミットが多い戦略は、他の開発作業に対する統合テストを可能にし、問題を早期に検出できるため、継続的統合環境で特に役立ちます。
私が使用する経験則は、チェックインするファイルのグループが単一のチェックインコメントでカバーできる場合のチェックインです。
これは一般に、チェックインがアトミックであり、他の開発者がコメントを簡単に消化できるようにするためです。
変更がアプリケーション全体のスコープを持つ構成ファイル(SpringコンテキストファイルやStruts構成ファイルなど)に影響する場合、特に当てはまります。チェックインする前に複数の変更の「グループ」を作成すると、それらの影響が構成ファイル内で重複し、2つのグループが互いにマージされます。
どのくらいの頻度で心配する必要はないと思います。ここで重要なことは、何を、いつ、なぜですか。 3時間ごとまたは24時間ごとにコミットする必要があると言うのは、まったく意味がありません。コミットするものがあるときにコミットします。そうでない場合はコミットしないでください。
バージョン管理の推奨ベストプラクティス からの抜粋です:
[...]プロジェクトに多くの変更を同時に行っている場合は、それらを論理的な部分に分割し、複数のセッションでコミットします。これにより、個々の変更の履歴を追跡するのがはるかに簡単になり、後でバグを見つけて修正しようとするときに多くの時間を節約できます。たとえば、機能A、B、およびCを実装し、バグ1、2、および3を修正する場合、各機能に1つ、各バグに1つ、合計で少なくとも6つのコミットが発生するはずです。大きな機能に取り組んでいる場合や大規模なリファクタリングを行っている場合は、作業をさらに小さな部分に分割し、各部分の完了後にコミットすることを検討してください。また、複数の論理モジュールに独立した変更を実装する場合、大きな変更の一部であっても、各モジュールに個別に変更をコミットします。
理想的には、ハードドライブにコミットされていない変更を加えてオフィスを離れないでください。変更が他の人に影響を与えるプロジェクトに取り組んでいる場合は、ブランチを使用して変更を実装し、完了したらトランクにマージして戻すことを検討してください。他のプロジェクト、つまり他の人々が依存しているライブラリまたはプロジェクトに変更をコミットするときは、コンパイルできないコードをコミットしてビルドを壊さないようにしてください。ただし、コンパイルされないコードを持つことは、コミットを回避する言い訳にはなりません。代わりにブランチを使用してください。 [...]
現在のパターンは理にかなっています。 seこのソース管理の方法に留意してください。ロールバックする必要がある場合、または差分を実行する場合はどうでしょうか。これらの場合、説明するチャンクは正確な差分のように見えます:diffは、バグ#(チェックインログで指定)の実装で変更されたものを正確に表示するか、機能を実装するための新しいコードを正確に表示します。同様に、ロールバックは一度に1つのことだけに触れます。
私はまた、多くの場合1日数回の作業を終えた後にコミットするのが好きです。大きなコミットよりも小さなコミットで何が起こっているかを見る方が簡単だと思います。コミットの数が多すぎる場合は、ブランチを作成し、機能全体が終了したときにトランクにマージすることを検討してください。
関連するブログ記事は次のとおりです。 コーディングホラー:早期チェックイン、頻繁にチェックイン
他の人が述べたように、他の開発者の方法で取得できないほど十分に「完全」な1つの論理チャンクをコミットしようとします(たとえば、自動テストをビルドして合格します)。
各開発チーム/企業は、各ブランチにとって「十分に完全な」ものを定義する必要があります。たとえば、ビルドのみにコードを必要とする機能ブランチ、自動テストに合格するためにコードも必要とするトランク、QAテストに合格したことを示すラベルなどがあります。
私はこれが従うべき良いパターンだと言っているのではありません。どのように「行われる」かは、あなたのチーム/会社のポリシーに依存することだけを指摘しています。
あなたがそれについて考える瞬間。
(チェックインが安全である限り)
あなたのソースコードシステムとあなたが持っている他のものに依存します。 Gitを使用している場合は、ステップを完了するたびにコミットしてください。私はSVNを使用しており、機能全体が終了したらコミットするのが好きなので、1〜5時間ごとにコミットします。 CVSを使用していた場合、同じことをします。
私も定期的にチェックインするのが好きです。それは私が目標に向かって一歩を踏み出すたびです。
これは通常は数時間ごとです。
私の難しさは、非常に多くのコードレビューを実行するを喜んで実行できる人を見つけることです。
会社のポリシーでは、何かをチェックインする前にコードレビューを行う必要がありますが、これは理にかなっていますが、すぐにコードレビューを実行する時間がある部署にはいない場合があります。可能な解決策:
いくつかの回答に同意します。コンパイルしないコードをチェックインしないでください。コードまたはその変更の「バックアップ」が懸念される場合は、個人のブランチまたはリポジトリを使用してください。論理ユニットが完成したらチェックインします。
私が追加するもう1つのことは、環境によっては、チェックイン率が時間とともに変化する可能性があることです。たとえば、コンポーネントの各機能部分が完了した後にチェックインするプロジェクトの初期段階では、安全性と改訂履歴の両方に意味があります(後のものが開発されているため、以前のビットがリファクタリングされるケースを考えています)。一方、プロジェクトの後半では、特に統合開発/テスト中に、完全に完全な機能がより重要になります。半分の統合または半分の修正は、誰にも役立ちません。
各バグ修正後のチェックインに関して:修正が些細なものでない限り、絶対に! 1つのチェックインに3つの修正が含まれており、そのうちの1つをロールバックする必要があることを見つけることほど苦痛はありません。多くの場合、そのような状況では、開発者は1つのエリアで3つのバグを修正し、どの変更がどのバグ修正に進むかは悪夢のようです。
正常にコンパイルされ、単体テストにリグレッションがない限り、30〜60分ごとに変更をコミットします。
リリースされないブランチで作業している場合、コミットは常に安全です。
ただし、他の開発者と共有している場合、動作しないコードをコミットするのは少し面倒です(特に重要な場所にある場合)。通常、効果的に「機能する」コードのみをコミットします。完全にテストされているわけではなく、実際にコンパイルされてすぐに失敗しないことを確認しました。
統合されたバグトラッカーを使用している場合、2つのバグを修正した場合、コミットログが正しいバグに反するように、個別のコミットを行うことが役立つ場合があります。しかし、もう一度、1つのコード変更で2つのバグが修正される場合があるため、どちらを適用するかを選択するだけです(システムで1つのコミットが複数のバグに関連付けられる場合を除きます)。
まあ、あなたはあなたが好きなだけコミットすることができるあなた自身のブランチを持つことができ、あなたの機能で終わったら、それをメイントランクにマージすることができます。
コミットの頻度については、このように考えます。ハードディスクがクラッシュし、何かをコミットしなかった場合、どれだけ苦痛になるでしょうか。この何かの量は約2時間です。
もちろん、コンパイルできないものはコミットしません。
少なくとも一日一回。
コミットごとに特定の時間制限はありません。テストに合格するとコミットする傾向があり、コードに満足しています。コンパイルしないコード、または失敗した場合に戻るのが気に入らない状態にあるコードをコミットしない
私は今でも「頻繁にコミットし、早期にコミットする」というフレーズを信じています。 Mercurial のような分散型VCSが好きです。いくつかのことをコミットして、後でアップストリームにプッシュしても問題ありません。
これは本当によくある質問ですが、本当の質問は未完成のコードをコミットできますか?
安全性と回復性の妥協点と、プロジェクト全体の変更管理の容易さのバランスを取る必要があります。
私が使用した最高のスキームには、その質問に対する2つの答えがありました。
2つの完全に別個のリポジトリーを使用しました。1つはプロジェクト全体のリポジトリーで、もう1つは私たち自身の個人リポジトリーでした(当時はrcsを使用していました)。
開いているファイルを保存するたびに、非常に定期的に個人リポジトリをチェックします。そのため、個人リポジトリは基本的に、大きくて長い範囲の取り消しバッファでした。
コンパイルし、正常にテストされ、一般的な使用の準備が整ったものとして受け入れられるコードのチャンクを作成したら、プロジェクトリポジトリにチェックインしました。
残念ながら、このシステムは、さまざまなVCSテクノロジーの使用に依存して機能していました。同じタイプのVCSを2つ(たとえば、2つのSubversionリポジトリ)使用して、同じ結果を達成するための満足のいく方法が見つかりませんでした
しかし、Subversionリポジトリに「個人用」開発ブランチを作成することにより、許容できる結果が得られました。定期的にブランチをチェックインし、完了時にトランクにマージします。
動作するコードを終了し、アップデートで他の誰かがそれを入手したとしても、誰も邪魔することはありません。
そして、あなたが適切にコメントしていることを確認してください。