web-dev-qa-db-ja.com

いつコードをコミットするのですか?

プロジェクトで作業する場合、コードは1日でかなり速く開発される場合もあれば、数週間/月/年の長期にわたって少しずつ開発される場合もあります。コードコミットはプロジェクト開発の指標と見なされるようになってきているため、コミットが少ないプロジェクトよりも多くのコードが記述されているという意味ではありません。

問題は、いつリポジトリに実際にコミットして、そのコミットが正当化されるかです。

アドオンとして:コミットに基づいてプロジェクトの開発を測定することは正しい方法ですか?

62
user22662

覚えておきたいコードベースの状態に達したときにコミットします。特定のコードベースの状態を覚えておきたい理由はたくさんあります。そのため、いつコミットするかについて厳格な規則はありません。ただし、コミットの数は品質や進捗状況の尺度ではありません。

80

この文脈では、コーディングをロッククライミングとして考えるのが好きです。あなたは少し登り、それから岩にアンカーを置きます。万が一落下した場合でも、最後に植えたアンカーがあなたを固定するポイントなので、数メートル以上落下することはありません。ソース管理と同じ。少しコーディングして、ある程度安定した位置に到達したら、リビジョンをコミットします。ひどく失敗した場合でも、いつでも最後のリビジョンに戻ることができ、安定していることがわかります。

とは言っても、チームで作業する場合は、コミットするものがすべて完了し、理にかなっていて、クリーンにビルドされ、他の人の作業を中断しないことを確認するのが慣例です。他の人の作業を妨げる可能性のある大きな変更を行う必要がある場合は、ブランチを作成して、他の人の邪魔をせずにコミットできるようにします。

また、使用しているSCMシステムにも依存します。分散システムは通常、マージとフォークを簡単かつ高速に行うことができ、ローカルでコミットできます。つまり、多くの作業を実行し、かなりの量の作業を完了したときにプッシュ/マージする必要があります。 svnやcvsなどの一元化されたシステムでは、コミットにコストがかかり、すべての人に影響します。分岐はこの問題を部分的に解決しますが、サーバーで発生するため、非常に遅くなり、マージが面倒になる場合があります。したがって、集中型SCMを使用すると、かなり慎重な文化が必要になることが多く、かなりの量の作業を行った後にのみコミットします。

アドオンについて:しないでください。コードの行、コミットの数、発見/解決されたバグの数などはすべて、品質や量の非常に悪い測定値です。

36
tdammers

MercurialやGitのようなDVCSを使用している場合は、かなりの量の作業を行ったときはいつでもローカルリポジトリにコミットする必要があります。ただし、それが機能し、テストされた自己完結型の変更が機能した後でのみ、それを共有リポジトリーにプッシュします。

非分散VCS(SVNなど)の場合、同じロジックが適用されます。ローカルリポジトリの代わりに、Pushの代わりにプライベートブランチを使用します—メインブランチにマージします。

13
vartec

早い段階で頻繁にコミットする必要があります。

私は90秒ごとにコミットする人を知っています。真剣に。彼らにとってはうまくいくようです。私はファイルを保存するたびにコミットする実験をしてきましたが、これはおそらく90秒よりも頻繁です。今日、私はおそらく約15分ごとにコミットします。複数のコミットを1つにまとめ、ローカルコミット(gitなど)を許可するVCSを使用すると、これがはるかに簡単になります。

どのくらいの頻度でコミットすべきですか?言うのは難しいが、おそらく今よりも頻繁に。ますます頻繁にコミットし続け、不条理に頻繁すぎると感じるポイントを見つけて、少し後退します。おそらく、あなたは妥当なものになってしまうでしょう。

ユーザーに提供される価値に基づいて製品の開発を測定します。他に正確な測定はありません。

10
Rein Henrichs

コミットは、バージョン管理されたデータ/コードのビルディングブロックです。各コミットは、次のいずれかを正確に実行する必要があります。

  • 新しいデータまたは関数を追加する
  • 1つまたは複数のバグを修正します(可能な場合は修正ごとに1つのコミット)。修正は次のようになります。
    • パフォーマンスの向上
    • 間違ったコードの動作を修正する
    • 誤植の削除
  • セマンティクスを変更せずにコードまたはデータをリファクタリングする。これも:
    • オリジナルと同じように動作するコードを書き換える
    • データの表現を別の形式に変更する
    • プロジェクトのフォーマットガイドラインを満たすためのコードまたはデータのフォーマット
  • 別のブランチ(上流/下流)からの変更をマージ

また、ブランチで作業する場合、コミットはより適切なブランチに移動する必要があります。 2つのコミットは、同じコミットメッセージ(類似の変更を意味する)を持つべきではありませんが、コラボレーターを混乱させるため、異なるブランチにある必要があります。より良い方法は、メインブランチにコミットし、機能ブランチにマージすることです。

コミッターが上記のルールに従えば、次のことは簡単になります。

  • 副作用なしで特定の変更を元に戻す
  • コード形式の変更からコード変更を変更する動作を特定する
  • ほとんどの競合を回避して、異なるブランチ間をマージします
  • 変更を簡単にプルできる他の開発者と協力する

コミットに基づくプロジェクトの進捗状況の測定に関しては、リファクタリングコミットとバグ修正コミットが考慮されていない場合は可能です。

8
justjkk

特定の機能/モジュール/機能の単体テストが正常に完了し、統合またはシステムテストの準備ができていることが合理的に保証されている場合にのみコミットします。

そして、あなたの追加の質問に答えるために-いいえ!プロジェクトがどこにあるかの基準は、コミットの数によって決定されるべきではありません...実際に何がコミットされたのか誰が知っていますか?システムテストまたは単体テストさえ成功していますか。それがコミットされているからといって、それが生産準備が整っているという意味ではありません。

7
Catchops

アドオンとして:コミットに基づいてプロジェクトの開発を測定することは正しい方法ですか?

いいえ、ありません 毎日のWTFでした なぜそれが恐ろしい考えなのかについてです。

コードのコミットに関する私の一般的な経験則は、コードのチャンクを完了してコンパイルされるときにチェックインすることです。チャンクは実際には定義されていません。小さな仕事なら、完了するまでチェックインしないかもしれません。大きい場合は、各論理部分が完了した後でチェックインする場合があります。

ただし、コンパイルできない場合はチェックインしないでください。実際に大声で言うのは馬鹿げているように思えますが、以前は人に説明しなければなりませんでした。

6
Tyanna

何かを壊すとは思わないすべての重要な変更をコミットします。コミットすべきではない唯一のものは、スタイルの変更です。なぜなら、それらはロジックの変更を具体化しないからです。しかし、それ以外の場合は、コミットする変更が小さいほど良い結果が得られます。

コミットが小さいほど、思考プロセスを詳細に文書化できます。これは、優れたコミットログの1つの側面です。優れたコードレビューは、コードの結果だけでなく、思考プロセスについても行う必要があります。

また、小さなコミットがたくさんあると、二分するのが簡単になり、バージョン管理の機能があまりにも少なくなりすぎて、干し草のコードベースで針のバグを探すのに何時間も節約できました。

要するに二等分。現在のコードベースで問題を発見します。次に、特定の問題が存在しなかったことが確かである変更ログでコミットを選択します。 「良い」バージョンと「悪い」バージョンの中間にあるコミットをチェックすることから始めます。問題がまだ存在するかどうかをテストして確認します。もしそうなら、「良い」と以前にテストされたコミットの真ん中をさらに振り返る必要があります。問題がなくなった場合は、この特定の変更後に導入されたため、「不良」と以前にテストされたコミットの中間を確認する必要があります。繰り返す。最終的には、問題を引き起こしたコミットで終わることになります。しかし、小さなコミットがある場合にのみ、そうでなければ、問題が存在するようになった大きな変更の山に、それがわかるだけです。

ここ はGitでどのように機能するかですが、プリンシパルはすべてのバージョン管理に適用されます。

1
Jasper Kennis

コードを他のコードユーザーと共有する準備ができたとき-比較的安定していて安全で、適切にテストされているときにコミットします。

そして、いや、コミットはプロジェクトの開発にとって素晴らしい指標ではないと思います。私は、小さな変更や小さな変更をすべてコミットする開発者もいれば、機能への大きな変更のみをコミットする開発者もいるからです。あるコミットの価値を別のコミットの価値に対してどのように定量的に測定しますか?

対応するタスクが完了するとすぐにタスクは、ユーザーストーリーの一部です。

次の場合、タスクが実行されます

  • 対応する単体テストに合格、
  • コードは適切に文書化され、
  • コードがコミットされます。

別の 完了の定義 を使用できます。

コミット数を測定する価値はありません。ただし、同じユーザーストーリー(さらに悪い場合はストーリー)で長期間働いている人を見ると、これはにおいです。

1
user2567