コードをコミットするタイミング


59

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

では、問題は、いつコミットを正当化できるようにリポジトリに実際にコミットするかです。

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


9
簡単に定量化できるもののほとんどは、過度に単純化されているか、特定の測定に対してうまく機能するように簡単に調整できるため、悪いメトリックです。
-unholysampler

入力いただきありがとうございます。回答全体に分散されるコミットを行う正当な理由は数多くあり、複数の回答を受け入れることはできません。これまで最高得票の回答を受け入れています。しかし、私はあなたの答えをすべて取り入れます。

回答:


79

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


10
トランクは別の話であるという補遺に同意します。たとえば、私のチームのトランクをチェックインするには、a)正しくビルドし、b)何かを完了する必要があります。いずれのチームメンバーは、しかしブランチを作成して自由であり、それは彼らがそれを好きな状態にすることができる。
エドワード・ストレンジ

34

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

とは言っても、チームで作業する場合、コミットするものはすべて完了し、理にかなっており、クリーンにビルドし、他の人のものを壊さないことを確認するのが一般的です。他の人の作業を妨げる可能性のある大きな変更を加える必要がある場合は、他の人を邪魔することなくコミットできるようにブランチを作成します。

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

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


同じことが新しいブランチにも当てはまると思います。すべての新しい開発は自分のブランチにコミットされ、機能の準備ができたらプッシュしますか?すなわち。あなた自身のプライベートブランチに多くの不完全なコードをコミットするかもしれません。
ジュハウンティネン

はい、しかしそれほどではありませんが、(元の回答を参照)誰にも直接邪魔することはありません。問題のSCMに応じて、アップストリームをマージする前にコミット履歴をクリーンアップすることをお勧めします(例git rebase -i)。
tdammers

13

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

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


+1これはこれ以上支持されなかったことに驚いた。それは私が最初に考えた- DVCSまたはVCS
マイケル・デュラント

9

早く、頻繁にコミットする必要があります。

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

どのくらいの頻度でコミットする必要がありますか?言うのは難しいですが、おそらくあなたよりも頻繁になります。ますます頻繁にコミットを続け、それがあまりにも頻繁にあるように感じられるポイントを見つけてから、少し離れてください。合理的なものになってしまう可能性があります。

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


1
+1。あなたは、アトミックコーディング、および表現力の高い言語をドロップするまで、90秒をすることができ、リファクタリングをBDD-AS-IF-あなた平均それを組み合わせると長いコミットせずに行く時間。
ヨルグWミットタグ

8

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

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

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

コミッターが上記の規則に従うと、次のことが簡単になります。

  • 副作用なしで特定の変更を元に戻す
  • コードフォーマットの変更からコード変更を変更する動作を特定する
  • ほとんどの競合を回避する異なるブランチ間のマージ
  • 変更を簡単に実行できる他の開発者と協力する

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


この答えは受け入れられた答えでなければならないと思いますが、おそらく質問者はもっと簡単な説明を探していたでしょう:)
Behnam Rasooli

7

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

そして、アドオンの質問に答えるために-いいえ!! プロジェクトがどこにあるかの尺度は、コミットの数によって決定されるべきではありません...実際にコミットされたものを誰が知っていますか?システムテストやユニットテストに成功しましたか。コミットされているからといって、それが生産準備が整っているという意味ではありません。


5
トランクにコミットしている場合はそうですが、機能ブランチまたはプライベートブランチにコミットしている場合は、統合の準備をする必要はありません。
ニールバターワース

1
@Neil Butterworth:...同じブランチで作業している他の開発者がコードに依存している場合を除きます。
-FrustratedWithFormsDesigner

@Frustratedその場合、確かにコンパイル可能でなければなりませんが、統合とシステムテストの準備ができている必要があるとは思いません。
ニールバターワース

1
ここで、分散vcと集中vcの間の興味深い二分法。分散型vcを使用すると、機能ブランチにローカルでコミットし、他の開発者の邪魔にならないようにすることができるため、これは懸念事項にはなりません。
ジョージマウアー

2
@George-これは誤った二分法です。実際の二分法は、プライベート(開発者ごと)ブランチの使用とパブリック(複数の開発者による共有)の使用の間です。これは、集中型分散VCSを使用しているかどうかとは直交します(ただし、ブランチを公開するまでブランチはプライベートとして開始されるため、DVCSはプライベートブランチを推奨します)。
スティーブンC.スチール

6

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

いいえ。なぜそれが恐ろしいアイデアであるかについて、毎日のWTFがありました

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

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


1
コンパイル警告の場合は+1。オフィスには貯金箱があり、その結果、ビルドが失敗する原因となった何かをコミットするたびに誰もが料金を支払う必要がありました。悲しいことに、少なくとも最初はこの方法でかなりのお金を手に入れました:)
レイ

@Ray-私の最後の場所で、罰金はロト基金に支払われました。悲しいかな、私たちはこの悪い習慣から豊かにそれを打ったことはありません。:P
ティアナ

1

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

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


分散システムでは、!= shareをコミットしてください。あなたはすべきプッシュする、あなたが共有する準備ができて何かを持っている場合。
ラインヘンリヒズ

@Rein Henrichs:良い点ですが、ここの作業中のソース管理にはその機能がありません(少なくとも私の知る限り)。何かがコミットされると、プロジェクトの他の全員がそれを確認して再同期できます(そして通常は盲目的に行います)。
FrustratedWithFormsDesigner

これは、より良いツールの恩恵を受ける可能性を示している可能性があります。頻繁なコミットを妨げるものはすべて、不必要な障害です。
ラインヘンリヒズ

@Rein Henrichs:私はそれを主張しません!!
FrustratedWithFormsDesigner

1

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

タスクが実行されたとき:

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

doneの異なる定義を持つことができます。

コミット数の測定に値が表示されません。ただし、同じユーザーストーリー(またはさらに悪いことにストーリー)で誰かが長期間作業しているのを見ると、これは臭いです。


1

あなたが何かを壊すとは思わないすべての重要な変更をコミットします。コミットすべきではない唯一のものは、スタイルの変更です。これは、ロジックの変更を具体化しないためです。しかし、そうでなければ、コミットする変更が小さければ小さいほど良いです。

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

また、小さなコミットを多数行うと、二分するのが簡単になります。これは、バージョン管理の機能の使用が少なすぎるため、haystackコードベースの針のバグを探すのに多くの時間を節約できました。

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

ここでは、それはGitリポジトリで動作しますが、本人が任意のバージョンコントロールに適用する方法です。


これは、以前の10の回答で作成および説明されたポイントに対して実質的なものを提供していないようです。また、最後の段落はgit固有の機能を参照しているようですが、質問はgitについてではないようです
-gnat

分割はgit固有ではありません。私がGitはそれがで構築持って承知しているとして、これは一例にすぎだった、バージョン管理のいずれかのタイプを行うことができます。
ジャスパーKennis

-1

いつ:

  • ビルドします(常に)
  • 単体テストに合格
  • 機能します(「作業中」として明確にマークされていない限り)
  • コードの状態を保存することの利点は、テストを実行する手間、適切なコミットメッセージを考えること、およびコミットプロセス中のマージ競合を解決することの面倒さを上回る

これに賛成するのがベストプラクティスです。
jersoft
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.