毎日コードをコミット/チェックすることは良い習慣ですか?


63

私は継続的インテグレーションに関するMartin Fowlerのメモを読んでおり、彼は必須項目として「毎日メインラインにコミットしている」としています。

私が取り組んでいるセクションが完全でない限り、コードをコミットするのは好きではありません。実際には、3日ごとにコードをコミットします:1日目はタスクを調査/再現し、いくつかの予備的な変更を行い、2日目は変更を完了します、そして3日目でテストを書き、提出のためにクリーンアップします^。コードをもっと早く提出するのは気が進まないでしょう。

現在、リポジトリから変更を取得し、通常は1日に2回ローカルに統合しますが、小さな作業を分割できない限り、頻繁にコミットしません。

質問:毎日コミットすることは、それを順応させるためにワークフローを変更する必要があるほど良い習慣ですか、それともお勧めできませんか?

編集: CVSの意味で「コミット」(別名「プッシュ」)を意味していることを明確にすべきだったと思います。

^順序はより任意であり、タスクに依存します。私のポイントは、正確なシーケンスではなく、時間とアクティビティを説明することでした。


20
コンパイルしていくつかの有用なロジックを実行する場合、コードをコミットできます。チーム環境で作業している場合は、短いサイクルでコードをコミットすることをお勧めします。
ELユスボフ

4
Martin Fowlerは、配布されていないVCSを想定していますか?
user16764

4
その記事の日付に注意してください:2006年5月1日。GitとMercurialは2005年4月まで開始されませんでした。私の印象では、2008年頃に実際に注目を集め始めました。したがって、2006年のこの記事では、SVNのような集中ソース管理システムを想定しています。このアドバイスは、DVCSを使用しているチームには適用されません。
キラレッサ

2
@Kyralessa:この記事には、「Subversionは最新の[バージョン管理システム]」とさえ記載されています。
チェ

4
最初にコード、次にテスト?

回答:


43

私はこの規則に同意せず、Mason Wheelerの発言に同意します。いくつかのアイデアを追加したいと思います。

私はコミットする意味のある変更があるたびにコミットしようとします:これは、いくつかの小さなバグを修正する場合は1日に数回、残りの部分では使用できないより大きなソフトウェアに取り組んでいる場合は週に1回になることがあります一貫した状態に達するまで、意味のある方法でコードを作成します。

また、私は解釈コミットとして意味のあるリビジョン公開コードベースに新しい機能を貢献しています。コミットする前にコードをクリーンアップして、他の開発者が変更履歴を見て変更の意味と目的を理解できるようにする必要があると思います。他の開発者が履歴に表示する変更が少ないほど良い:改訂履歴を見るとき、意味のある機能を追加する増分を見たい。私は、各開発者が持っていたすべての小さなアイデアに興味がなく、彼らがソリューションに到達する前に試してみたいと思っていました。

さらに、コードの現在のスナップショットがコミットされるバックアップ機能としてSVNサーバー(またはバージョン管理システム)を使用することは良い考えではないと思います(コンパイルされている場合):USBスティックを使用できますまたは、外部USBドライブまたはネットワークディスクを使用して現在のコードをミラーリングし、コンピューターが故障しても失われないようにします。リビジョン管理とデータバックアップは2つの異なるものです。リビジョンの公開 は、コードのスナップショット保存と同じではありません。

最後に、時々コミットすることは問題ではないと思います(つまり、コードの現在の状態に本当に満足している場合のみ)。異なる人が同じファイルを同時に操作すると、多くのマージ競合が発生します。これは悪い習慣です(この記事のポイント7を参照)。マージの競合は、プロジェクトを明確なインターフェイスとできるだけ少ない依存関係を持つモジュールに分割し、開発者の作業を調整して、作業するコードができるだけ重複しないようにすることで軽減する必要があります。

ちょうど私の2セント。

編集

私が思いついた時期尚早のコミットに対するもう1つの理由は、(非常に)バグの多いバージョンをテストできないことです。トランクでコミットしていて、テストチームが毎日テストしている場合、数時間(または1日間)テスト可能なバージョンがない場合があります。バグを修正せずに変更を元に戻そうとしても、再構築には数時間かかる場合があります。たとえば、チームで5人のテスターが働いている場合、非アクティブなためにチームの時間の5 x 2 = 10時間を無駄にしています。それは一度私に起こったので、私は本当にできるだけ早くコミットの名前で時期尚早なコミットを避けようとします


23
「コミット」は「公開」ではありません。「コミット」は「スナップショット」を意味します。「公開」は、scm-lingoでは「プッシュ」と呼ばれます。もちろん、SVNは両方の概念を1つに統合するだけで、多くの賢明なワークフローを不可能にしますが、これはツールの制限であり、一般的なソース管理ワークフローの制限ではありません。
-tdammers

3
Revision control and data backup are two different thingsはい、私は間違いなくこのように感じています。
そり

1
@tdammers:非公式な方法で公開することを意味しました。コードがコンピューター上にある限り、それは一般的なコードに対する個人的な変更です。コミットするとすぐに公開され、他のチームや公式プロジェクト履歴の一部に知られます。
ジョルジオ

1
その場合、「コミット」はおそらく間違った言葉です。多くのSCMではローカルコミットが許可されており、コードを他のチームと共有することは、通常「プッシュ」と呼ばれる別個のアクションです。繰り返しになりますが、SVNは2つの概念をまとめていますが、それはツールの制限であり、ワークフローの邪魔になる場合は、別のSCMへの切り替えを検討してください。
-tdammers

@tdammers:ローカルのコミットとパブリッシュを明確に区別することは一歩前進です。SVNでは、そのために別のブランチを使用できます。しかし、もう一度、なぜ私にはあまり意味がないリビジョンを追跡したいのだろうか?ちょうど5時で家に帰るという理由だけで、新しい改訂(プライベートな改訂であっても)が必要だとは思いません。代わりにバックアップが必要です。
ジョルジオ

107

は1日に数回コードをコミットします。コードがコンパイルするのに十分に完了し、他のことを壊さないポイントに到達するたびに、それは入ります。

1日に数回安全にチェックインできるように、作業を分割する必要があります。

これの理論的根拠は2つです。

  1. チェックインされていない作業は失われる可能性があります-コンピューターに壊滅的な障害が発生する可能性があります。この場合、待つ時間が長いほど、より多くの作業が失われます。
  2. チェックインせずに行う作業が多いほど、最終的にベイク処理を決定したときに他のコードを統合する必要があります。これにより、競合やマージの問題が発生する可能性が高まります。

2
競合やマージの問題で深刻な問題が発生した場合は、プロジェクトマネージャーが仕事をしていないことを意味します。同様の機能を含む複数のケースが同じ開発者に送られる必要があります。そうすることで、 2人以上のコーダーが互いの作業を踏み潰すことがなくなります。
メイソンウィーラー

14
@MasonWheeler-コミットされていない3日間の作業の後、他の人が同時に持っているコードに触れた可能性が非常に高くなります。多数のプログラマーがこれを行っている場合、最高のプロジェクトマネージャーは競合の発生を避けることができません。
-Oded

3
@Oded:たぶん。私の応答は、私たちの開発者(チームの約12人のコーダー)がすべて重複しない責任を持つ傾向があるほど十分に大きいコードベースでの私の経験によって色付けされていると思います。小規模なプロジェクトでどの程度異なるかはわかりません。
メイソンウィーラー

3
@ArtB-3日ごとにしかチェックしない自分のような人がいる場合はどうなりますか?それとも週に一度?あなたは他の人が正しいことをしていることに頼っています。
オッド

3
質問を読んだとき、私の応答は「毎週シャワーを浴びるのは良い考えかと尋ねるようなものですか?」でした。
アンドリューグリム

39

背後にある理由を理解せずに方法論や実践を順守することは決して良い考えではありません。それが貨物カルトプログラミングの起源です。

したがって、「Martin Fowlerがそう言ったので、私は毎日コミットする必要があります」はただ愚かです。そして時にはそれも非現実的です。複雑な新機能に取り組んでいる場合、数日間作業するまでチェックインする価値のあるポイントに到達しないかもしれません。

これは、チェックインする前にすべてが完璧であることを確認する必要があるという意味ではありません。これは、何かがうまくいかない場合に仕事を失う良い方法です。正しいことは、問題について適切な判断を下して使用することです。経験則は、あなたをとても助けます。


1
複雑な機能の統合/開発の場合、コミットせずに、おそらくトランクにではなく、少なくともこの機能のブランチでは、それは大きな損失です、それがブランチの目的です!
ビンセントB.

2
「チェックインする価値がある」とはどういう意味ですか?他の人のコードを壊さないのなら、なぜチェックインしないのですか?
カークブロードハースト

2
「「チェックインする価値がある」とはどういう意味ですか?他の人のコードを壊さないのなら、なぜあなたはチェックインしないのですか?」ある時点。将来取得したい有用な情報が含まれている場合は、コードの古いコピーも保持したいです。それ以外の場合、改訂履歴で無駄なノイズを生成しています。
ジョルジオ

3
+1。私はかつてチームで働いていましたが、コードが急増したり、役に立たない調査であっても、コードを毎日vcsにチェックインする必要がありました。特に、VCをクリーンアップするために定期的なメンテナンスが必要だったため、非効率的で無駄が多いことがわかりました。それは、何かをやり直すのに少し時間を失う可能性があるということに対する妄想の組み合わせによるものであり、マネージャーは毎日コミットすべき本を読んでいたからです。極端な例かもしれませんが、真剣に、何かをチェックインする「価値がある」かどうかを判断する判断がなければ、おそらくその仕事にはあまり適していません。
-S.ロビンズ

14

Odedは、できるだけ頻繁にコードをコミットする2つの重要な理由を挙げました。さらにいくつか追加します。

  1. コードの作業中に、他の人はそのコードでいくつかの機能を必要とする場合があります。彼らはそれを得るために6日間待つべきではありません。この場合、同僚は通常、コードの一部にプロトタイプを作成してコミットし、本文を追加して再度コミットします。そして、これは通常数時間で行われます。

  2. 「共通」コードは、すべての変更をできるだけ早く確認するためのものです。作業中のコードが他の作業と完全に分離されていて、待機させない場合は、作業用のブランチを作成することをお勧めします。メインライン。


1
(IMO)でこの答えが唯一の正解で正確な答え(ポイント2)であるため、なぜ評価が低いのですか?!もちろん、それがブランチのポイントです!@Mason Wheeler:それでは、一度コミットせずに生で数日間コーディングを楽しんでいますか?では、なぜバージョン管理システムを使用するのでしょうか?!
ビンセントB.

2
これは正解です。タスクが使用可能になるまでに何日もかかっている場合は、分岐します。それ以外の場合は、チームメンバーが最新バージョンを持っていることを確認するために機能するたびにコミットし、機能することをテストして、追加/不足している機能をできるだけ早く特定します。
カークブロードハースト

「だから、一度もコミットせずに生で数日間コーディングするのが好きですか?それからなぜバージョン管理システムを使用するのですか?!」:盲目的に毎日コミットすることを強いられなくても、最終的にリビジョンをコミットしたいからです。むしろ、1日に数回コミットするか、コミットせずに3日間続けて作業するかを決めるのはあなた次第です。誰も使用できない未完成の機能をコミットすることには意味がありません。バックアップを作成するだけで、翌日には完了してコミットできます。
ジョルジオ

8

私は、維持する価値のあるすべての論理的な変更をコミットすることを強く信じています。頻繁にコミットし、コードを維持する価値がない場合は、クリーンな状態に戻します。コードをプッシュ/パブリッシュするのを長く待つほど、実装が難しくなり、実行される問題が多くなります。また、貢献に関するフィードバックをより迅速に受け取ることができます。

  • 彼らはビルドを壊しますか?
  • 他のチームメンバーの努力を複製していますか?
  • 何か間違ったことをしていますか?
  • または人々はあなたからのものを待っていますか?

小さな変更は管理がはるかに簡単です。

また、異なるバージョン管理システムの違いに注目する価値があります。Git(分散型)などの一部では、公開の準備ができたときにのみプッシュして、履歴全体をローカルでコミットおよび制御できます。SVN(集中型)のような他のものは、小さなコミットを非常に非効率的にする2つのステップを結合します。

コミットは本質的に変更ドキュメントであることを忘れないでください。物事がうまくいかないとき、あなたは十分ではないよりも多くの歴史を持つことができます。1週間の作業を1回行うだけでは役に立たないようです。最終的には、各論理チャンクの要約ではなく、変更されたコードのすべての行を読むことになります。


5

ここでの答えのほとんどは、Martin Fowlersの声明の主要なポイントの1つを逃していると思います。これは継続的インテグレーションに関連しています。メインラインにチェックイン(プッシュ/公開/マージ)されていないコードはテストされません。

これは、オフィスを離れるときはいつでも、ローカルマシンにあるコードをコミットすることを推奨するものではありません。ここでいくつかの他の人が指摘したように、それは悪いことであり、ビルドを壊し、不安定なメインラインを引き起こします。

ただし、問題を引き起こすことなくメインラインにチェックインできる小さな手順で変更を行うことをお勧めします。これにより、コードをすべて切り離して書き換えるのではなく、コードの進化が促進されます。

さて、この働き方の良いところは何ですか?

  1. 大量のコードや革新的な変更をコミットしないと、ビルドが壊れる可能性が低くなります。
  2. コミットがビルドを壊した場合、問題が何であるかを特定し、それを元に戻してから修正バージョンをすばやくコミットするのはかなり簡単です。
  3. コードの小さな変更ごとにすべてのテストが実行されるようにすることで、継続的な統合スキームの外でコードが成長することによる微妙なバグやリグレッションが発生しないようにします。

もちろん、すべての変更がこのアプローチに適しているわけではありません。他の人が指摘したように、絶対的なルールはありません。ただし、長期間メインラインから外れることが予想される変更については、独自の継続的統合スキームを使用して代替メインラインを設定し、同じアプローチに従ってください。今日の分散型VCSでは、これは非常に簡単です。


+1:「もちろん、すべての変更がこのアプローチに適しているわけではありません。」これがポイントだと思います。ファウラーのアドバイスは大丈夫だと思いますが、ケースごとに判断すべきです。代わりに、このアドバイスはしばしば絶対ルールに一般化され、それ以上の考慮なしに従います。
ジョルジオ

@Giorgio、それについてはあなたに絶対に同意します。誰がその背後にいても、絶対的な規則として助言をとるべきではありません。
ハラルド

これに関するいくつかのアイデア。「メインラインにチェックイン(プッシュ/公開/マージ)されていないコードはテストされません。」:これは良い原則であり、チェックインしてコードをテストするまで数週間待つべきではないことに同意します。ただし、この原則のブラインドアプリケーションは、テストすらできない破損したアプリケーションにつながる可能性があります(私はこれを実際に見ました:テストチーム全体が数日間アイドル状態になり、コードが使用可能な状態に戻るまで何もテストできません)。他のユーザーが書いたものは状況によっては当てはまるかもしれませんが、一般的ではありません。
ジョルジオ

1
不安定なコードをチェックインしても大丈夫です。CIを破壊するコミットは元に戻す必要があります。小さな増分の変更を頻繁にコミットする場合、長期間テストされていない大きな変更がある場合よりも、そのような破損を引き起こす可能性は低くなります。また、ビルドが壊れた場合に元に戻す方が簡単かもしれません。しかし、あなたが言うように、時には破壊的な変化以外に方法がありません。次に、できる限り最善の方法で磨き、コミットする前に徹底的テストします。ポイントはルールに従うことではなく、アドバイスの出所を理解することです。
ハラルド

3

毎日チェックインするための引数:

  • コードは保存され、ハードドライブの障害に対してバックアップされます
  • アクティビティはコミットノートに記録できます(木曜日に何をしましたか...?
  • 既存のコードベースとの統合はより早く、より小さなチャンクで行われ、競合またはマージの問題をより早く特定することが望まれます
  • あなたのチームはあなたが取り組んでいるものの可視性を持っています
  • あなたの同僚はあなたのインターフェースに対してより早く取り組むことができ、あなたの「大きな複雑なコード」と統合するためのより多くの時間を与えます
  • あなたのコードは実世界でより早くテストされるか、少なくともあなたが与えるよりも多くの使用にさらされ、バグや省略のより早い特定につながります。

毎日のチェックインに対する議論:

  • する必要がない、またはしたくない
  • まだ私のコードを「クリーンアップ」していない、それは混乱です
  • 時間がない

怠lazや混乱を除けば、毎日チェックインするよりも良い理由はないと思います。開発環境で実行されているコードが開発ブランチのコードと一致しないのは、誰かが「まだ終了していない」ためチェックインしていないためです。

私はこれについて間違っていると思いますので、毎日のチェックインに対する正当な議論を教えてください。


「怠や混乱を除いて、毎日チェックインする正当な理由はないと思います。」:まったく同じ理由で反対を信じています。時間をかけてコードの現在の状態を確認し、覚えておく価値のある関連情報が含まれているかどうかを判断できます。または、怠け者で混乱している場合は、単純にチェックインできます(情報がほとんどない追加のリビジョンを作成できます)内容)コンパイルする限り。
ジョルジオ

1
私はあなたのポイントを理解して、コードを毎日チェックインできるように怠zyにしてはいけません。一方、いくつかの複雑なコードで作業している場合、クリーンアップには数時間かかる可能性があるため、これを達成するのは困難です、コードをクリーンアップするためだけに毎日数時間を費やすことはできません。
ジョルジオ

@Giorgioでは、数日かけてコードをクリーンアップしますか?私は毎日チェックインするいくつかの正当な理由を与えました-あなたの理由はあなたがあなたのコードをきれいにしなければならないということです?きれいなコードをまっすぐに書いてください。
カークブロードハースト

これは常に可能であるとは限りません。たとえば、正しく実行するには多くの実験を必要とする複雑なコード(> 4000 LOC)をゼロから開発している場合です。1日の終わりにコードが少し乱雑になり、数日後の一貫した状態になるまで修正したくない可能性があります。残念ながら、私は頭の中で完成した完璧なコードを作成するほど頭が良くないので、数時間(つまり1日の終わり)にいつでもすべて書き留めることができます。私は最近そのような経験があり、典型的な開発サイクル(一貫した状態から次の状態まで)は2、3日でした。
ジョルジオ

@Giorgioにチェックインしている開発ブランチがありませんか?他の人がコードを確認およびテストできるように、コードをチェックインする必要があります。
カークブロードハースト

2

「メインラインへのマージ」として「コミット」を意味している場合、顧客にリリースされているソフトウェアプロジェクトでそのようなことを絶対にしないでください。メインラインが常に機能し、リリース可能になり、機能が途中で壊れた状態にならないように、実行およびテストされた変更をマージする必要があります。

ただし、今日の分散バージョン管理を使用することの贅沢さは、メインラインを安定させると同時にgit/hg/whatever commit、物事の状態を維持したいと思うたびにその両方を行えることです。私はこれを数時間に一度、間違いなく毎日の終わりに行います。

DVCSを使用すると、作業を公開し、チーム内の他のユーザーと共同作業し、メインラインブランチの変更に合わせて最新の状態に保つことができます。顧客や他のチームが依存するコードの安定性を汚染することなく、これらすべてを実行できます。

Subversionが最新のテクノロジーであり、極端な苦痛を伴わずに機能ブランチを分岐およびマージする方法がなかった時代には、いくつかの異なる機能が同時に構築されていたメインラインを持つことが最善のアプローチだったかもしれません。しかし、この優位性は2010年を超えて拡大することはありません。


2

Team Foundation Serverでは、チェックインとは異なる「シェルブ」を実行できますが、マシンが死んだ場合でも変更を失わないようにコードのバックアップを作成するだけです。

また、「開発者ライン」と「メインライン」があるソフトウェアハウスを見てきました。開発者は、適切と判断した場合はいつでも開発者ラインに自由にチェックインでき、メインラインにアクセスできるのはチームリーダーのみです。

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