動作しないコードをコミットしても大丈夫ですか?


40

動作するコードのみをコミットすることを要求するのは良い考えですか?

このコミットでは、リポジトリを次のように動作状態のままにする必要はありません。

  • ...設計の初期段階にありますが、コードはまだ安定していません。
  • ...あなたはプロジェクトの唯一の開発者です。物事がうまくいかない理由を知っています。さらに、壊れたコードをコミットして誰かの作業を停止することはありません。
  • ...現在、コードは機能しません。これに大きな変更を加えます。物事がugくなる場合に戻るポイントを得るために、コミットしましょう。
  • ...チェーンが長く、壊れたコードがローカルブランチに存在する場合は問題ありません。すなわち

    1. ローカルファイル
    2. ステージングエリア
    3. ローカルブランチでコミット
    4. リモートの個人機能ブランチでのコミット
    5. リモートdevelopブランチとマージ
    6. リモートmasterブランチとマージ
    7. リモートreleaseブランチとマージ
  • ...早くコミットし、頻繁にコミットします。

したがって、上記のリンクされた質問では、回答の大半は、コンパイルできないコードをコミットしても、ローカルおよび機能ブランチでは問題ないと述べています。どうして?壊れたコミットの価値は何ですか?


追加:ローカルブランチでは、好きなことは何でもできると言っている、非常に投票されたコメントがいくつかあります。ただし、質問の技術的な側面には興味がありません。むしろ、ベストプラクティス-業界で長年働いてきた人々が最も生産性を高めてきた習慣-を学びたいと思います。


膨大な量の素晴らしい答えに驚いています!彼らは、コードを整理するためにブランチを使用するのが十分ではないという結論に至ります。


28
ローカルブランチではすべてが行きます。あなたが望むものは何でもコミットします。プッシュする前にクリーンアップしてください。
ヨアヒムザウアー

@Joachim Sauer、良い習慣築くために、ベストプラクティスとそれらの背後にある理由について尋ねています。現在、私はしばしば壊れたコードをコミットします。そして、過去数日間の数十のコミットを通じて、復帰は悪夢です。
ヴォラック

9
独自のブランチで各機能を開発する場合、その決定は簡単です。ブランチを破棄し、現在のマスターで作成された新しいブランチから続行します
Joachim Sauer

1
コミットを「破壊」するものを定義しない限り、この質問に正式に答えることはできません。参照:プログラマーは他の誰かの失敗したビルドを修正する必要がありますか?
-gnat

1
「なぜ?壊れたコミットの価値は?」問題を特定し、その上で複数の異なる解決策をテストし、問題が発生している状態や新しい解決策ではなく、自分が知っていた問題に確実に戻ることができる機能。
ジョシュアテイラー

回答:


20

分岐理念の一つ(に分岐戦略とコードラインポリシーの開発セクション高度なSCM分岐戦略 -も読んPERFORCEのベスト・プラクティス、そのPDFファイルを他のいくつかの詳細に入る)あなたはincompatabileポリシーに分岐するということです。

コードラインポリシーは、コードラインのフェアユースと許容されるチェックインを指定し、コードラインSCMの重要なユーザーマニュアルです。たとえば、開発コードラインのポリシーでは、リリース用ではないことを明記する必要があります。同様に、リリースコードラインのポリシーは、承認されたバグ修正への変更を制限する必要があります。このポリシーでは、チェックイン中の変更を文書化する方法、必要なレビュー、必要なテスト、およびチェックイン後のコードラインの安定性の期待についても説明できます。ポリシーは、文書化された強制可能なソフトウェア開発プロセスにとって重要なコンポーネントであり、SCMの観点からは、ポリシーのないコードラインは制御不能です。

(Perforceベストプラクティスから)

たとえば、リリースをビルドするブランチ「リリース」(または「マスター」)と、開発者が作業コードをチェックインする「トランク」(または「開発者」)があるとします。これらはブランチのポリシーです。「作業コード」が「dev」ブランチポリシーの一部であることに注意し、壊れたコードをdevブランチにコミットしないでください。多くの場合、CIサーバーがこれらのブランチに接続され、壊れたコードをdevにチェックインすると、すべてのブランチが台無しになり、ビルドが壊れることがあります。

ただし、機能しない部分的なコードをチェックインすることが適切な場合があります。これらのインスタンスでは、分岐する必要があります-トランクとの互換性のないポリシー。この新しいブランチでは、ポリシーを決定し(「壊れたコードはOK」)、コードをコミットできます。

コードラインを分岐する必要があるかどうかを判断する簡単なルールが1つあります。ユーザーが別のチェックインポリシーを必要とするときに分岐する必要があります。たとえば、製品リリースグループには厳密なテストを実施するチェックインポリシーが必要な場合がありますが、開発チームには部分的にテストされた変更の頻繁なチェックインを許可するポリシーが必要な場合があります。このポリシーの相違には、コードラインブランチが必要です。ある開発グループが別の開発グループを見たくない場合

(Perforceベストプラクティスから)

これは、強力な企業マインドセットを持つ中央サーバーベースのSCMからのものであることを認識してください。核となるアイデアはまだ良いです。これらはしばしば暗黙的に考えられます-テストされていない開発コードをリリースブランチにチェックインしません。それがポリシーです。

ブランチです。このブランチではコードが壊れてコミットされてしまう可能性があります。


40

Linus Torvaldsが提案した哲学の1つは、創造的なプログラミングは一連の実験のようなものであるべきだということです。あなたにはアイデアがあり、それに従ってください。常にうまくいくとは限りませんが、少なくとも試してみました。開発者に創造的なアイデアを試すように促し、それを行うには、その実験を試すのは安く、回復するのは安くなければなりません。これは、gitコミットが非常に安価(高速で簡単)であるという真の力です。それは、この創造的なパラダイムを開き、開発者が他にはないものを試すことができるようにします。これはgitの解放です。


2
それは確かに美しいものです。コミュニティがgitとDVCSを一般的に評価することを本当に学んだとは思いません。
ChaosPandion

5
この哲学を試行錯誤のプログラミングと混同しない限り、避けるべきです。
ピーターB

10

はい、リリースブランチでない限り。

個人のブランチでは、実験がうまくいかなかった場合、すべてが進行し、その後廃棄されます。それがDVCSの主な利点の1つです:自由

壊れたコードをコミットする価値?:コラボレーション実験


微調整:はい、実稼働環境で実行されない限り。たとえば、機能の切り替えで非表示になっているコード。
ロブクロフォード

5

はい、大丈夫です。

コンパイルできないコードを(少なくともブランチで)コミットすることのポイントは、コードが進行中の場合もありますが、これまでに行われた作業は保存および/または他の人と共有する価値があることです

私のプラクティスは次のとおりです。

  • 最初にテストを書く
  • wip(進行中の作業)コミットは良い
  • 頻繁に(1日以内に複数)コミットし、早期に(「作業」手順を保存して)
  • コミットのたびにプッシュします(ハードドライブがクラッシュした場合/バスがヒットした場合)。
  • 常に最初にブランチで作業する
  • 可能であれば、作業コードをマスターにマージするだけです
  • マスターマージの前にwipsをスカッシュするためのgitでのインタラクティブなリベース

主な問題、そしておそらくあなたが触れている問題は、基本的に機能し、ビジネスに非常に必要な(したがって「マスター」である必要がある)機能があるが、いくつかの失敗したテストがある場合です。ここでのオプションの1つは、現在進行中のテストを実行することです。ただし、テストが修正されることはなく、テストを修正する代わりに単純に「保留」する他の領域にパターンを設定する可能性があるため、これには危険が伴います。

別のオプションは、ブランチを一時的に使用して展開することです。これは特定の状況で役立ちますが、一般的に推奨されておらず、持続可能ではありません。

おそらく最良の選択肢は、基本的にソフトウェア開発に対してより専門的なアプローチを取ることであり、コミットされたコードに対して実際にテストを行う必要があります。これは、多くの人が想像するコーディングではなく、ソフトウェア開発の「ハード」な部分であることがよくあります。より良いアプローチには、より良い初期推定、リソース割り当て、優先度設定などが必要になる可能性があります。さらに、アジャイル開発中に、十分な時間を確保し、発生時とグルーミング中の問題を修正するために十分な規律を使用して-ポインティングセッションを行う必要があります。

「完了」の意味に注目してください-コードとテストが作成され、リファクタリングされて動作することを意味します。「ほぼ完了、テストの作成/修正/リファクタリングが必要なだけ」などのコメントを聞いた場合、それは行われません。機能が技術的に完全にならずに行われたと言うことは、ジュニアプログラマの最も一般的な間違いの1つです。


3

壊れているかどうかに関係なく、コミットの価値は、コードがサーバーにコミットされることです。プロフェッショナルな環境では、そのサーバーは安全で冗長であり、バックアップを実行しています。私が一日中働いている場合、コミットとは、ローカルマシンで起こったことが何であれ、コードが生き残るようにすることです。ハードディスクは死にます。ラップトップは紛失または盗難に遭います。建物が焼損した場合でも、リポジトリサーバーのバックアップを利用できます。


8
これは、DVCSには必ずしも当てはまりません。たとえば、ローカルの個人リポジトリまたは機能ブランチがローカルである場合、バックアップされる場合とされない場合があります(これは、企業リソースにアクセスせずに企業ネットワークからオフラインで作業している場合に特に当てはまります)。マスターブランチとリリースブランチはバックアップされた場所にある必要がありますが、ローカルブランチには必ずしも当てはまりません。
トーマスオーエンズ

DVCSでさえ、コミットは価値があります。そのコードはファイル内のコードよりも「永続的」です。少なくともgitでは。
ヨアヒムザウアー

3
@ThomasOwens、敬意を表して、DVCS管理者がローカルリポジトリまたはブランチがバックアップされないようにシステムをセットアップした場合、DVCS管理者はバカであり、彼の才能により適した新しい仕事を見つける必要があります(それでフライする?」)。IT担当者から指示されたためにDVCS管理者がそのようにした場合、それはIT組織にも当てはまります。どちらかといえば、これは間違いなく全体DVCS概念の起訴です:VCSにコードをコミットする必要がありBY DEFINITION自動バックアップにコミット意味します。
ジョンR.ストローム

6
@ JohnR.Strohm旅行中、私はしばしばネットワークアクセスが制限されているため、バックアップリソースやネットワークドライブにはアクセスできません。ネットワークにアクセスできるようになるまで、バックアップなしで開発しています。これがDVCSのポイントです。ネットワークは必要ありません。リポジトリをバックアップする必要がありますか?おそらく、それはリリースまたはマスターリポジトリの要件にすぎません。とにかく、バックアップされたレポジトリにプッシュすることを何日もすべきではありませんが、それらのプッシュは壊れたコードであってはなりません。
トーマスオーエンズ

1
@ThomasOwens私のポイントは、前述のバックアップサーバーへのアクセスは散発的ですが、コードへのアクセスよりも優先されるべきだということです。コードはいつでも別のマシンで動作させることができ、チームの他の人でもコードを自分のマシンで動作させることができます。それがあなたのマシンのみにある場合、顧客はおそらくそれが機能するかどうか気にしません。顧客は、ビルドサーバーからの新しいリリースを気にし、サーバーリポジトリから順番に引き出します。
nvoigt

3

このように考えてください。開発者としてあなたがする最も破壊的なことの1つは、チームの他の開発者がタスクに取り組むことを止めることです。

作業コードのみをコミットするという哲学は、リポジトリ内の同じ単一のトランクで作業する開発チームから来ています。今では狂気のように思えるかもしれませんが、10年前はこれが通常の作業方法でした。安定したリリースを作成するときにブランチが表示されますが、新しい機能を実装するためにブランチで作業する開発者の考えはほとんど前代未聞です。

ご使用の環境が、コミットが他の開発者にすぐに影響しないことを意味する場合、頻繁にコミットします。コードのセキュリティが強化され、コードの間違いを簡単にロールバックできます。また、多くのソース管理システムにより、コミットされたコードに対するコード保護が提供されます(すべてではありません)。

今、他の開発者と共有されているブランチとのマージが機能することを確認し、このレベルに昇格するコードがすべてコンパイルされ、すべての単体テストと他のチームベースの健全性チェックに合格することを確認します...パブでビールを買い続けます...


3

バージョン管理を使用する方法について独断的になり始める前に、バージョン管理を使用する理由を考える価値があります。

バージョン管理にコミットすると、将来の参照のためにコードの状態がフリーズします。他のものはすべてこれから外れます。差分を見てパッチを作成することは、スナップショット間でコードがどのように変化したかを見るだけです。ブランチとタグは、スナップショットを整理するための単なる方法です。他の開発者とコードを共有することは、特定のスナップショットを見るだけです。

いつコミットする必要がありますか?合理的な機会があれば、将来コードの状態(または変更を説明するコミットメッセージ)を確認します。

Gitは、スナップショットを整理する方法に関して非常に多くの柔軟性を提供します。中央リポジトリがないため、状態を「メイン」リポジトリにプッシュせずにコードを他の開発者と共有できます。ブランチを簡単に作成、マージ、削除して、メインコードのナラティブから一連の状態の詳細を分離できます。ローカルでコミットして、現在の開発のフォローを取り消すことができます。その後、すべてを1つのコミットにまとめてから、他の人に見せるようにします。特定のリビジョンにタグを付けて、後で簡単に見つけられるようにすることができます。

キス。小さなプロジェクトの開発の初期段階で単一の開発者に最適なことは、10年前のミッションクリティカルなシステムで100人の開発者が作業している場合に行う必要があるものとはまったく異なります。ソフトウェア開発プロセスでは、他の誰かがあなたにそうするように言ったからといって、不要なアーティファクトを作成しないでください。


あなたの答えは刺激的ですが、私にはあいまいです。手元にある私の問題は、私があまりにも多くのコミットを作成していると思うことです。コンテキストは、5未満の小規模チームの単独開発です。「頻繁にコミットする」ことをあまりにも遠ざけており、回復する必要があるかもしれません。コミットを行うにはどうすればよいですか?
ヴォラック

1
コンパイル/テストするたびにコミットする必要がある場合は、元に戻す履歴を追加できる優れたエディターを見つける必要があるかもしれません。変更を有意義に表現するコミットメッセージを作成できない場合は、コミットしないでください。
ショーンマクサムシング

どのコミットに戻るか覚えていない場合は、変更を十分に頻繁にマージしていません。「安定」ブランチ、「開発」ブランチ、および「実験」ブランチを維持します。コードが動作したら、変更を「実験」から「開発」にマージし(最初にコミットをつぶします)、「削除」して「開発」から新しいブランチを作成できるので、「実験」を中断してください。機能全体が完成したら、devをstableにマージします。
ラバーダック

2

ブランチのビルド/リリース

破損したコードを意図的にビルドブランチにコミットすることはできません。継続的に統合されているブランチ、またはリリースまたは毎日のビルドが行われるブランチは、常に潜在的に解放可能な状態である必要があります。

他のブランチ:状態を頻繁に保存

プライベートブランチまたは機能ブランチの場合、多くの場合、目標は異なります。頻繁にコードをチェックインする(動作するかどうかに関係なく)ことが望ましい場合があります。一般に、現在の状態に巻き戻す必要がある場合はいつでもコミットする必要があります。

保存された状態が大きな利点を提供するこれらの例を考えてみましょう。

  • グローバルな検索と置換を実行する直前にコミットを実行すると、問題が発生した場合に1回の操作でツリーを元に戻すことができます。
  • 複雑なコードをリファクタリングしながら一連の暫定コミットを実行して、プロセスで何かが壊れた場合に二分したり巻き戻したりできるようにします。
  • いつでも現在の作業ツリーの状態に戻ることができる一方で、実験的なものを試したい場合は、コミットを実行したり、新しいブランチを開始したり、タグを作成したりできます。

0

壊れたコードベースをコミットしても、それがローカルであれば問題ありません。

どうして?

  • 開発のセーブポイントとしてコミットを使用することが不可欠です
  • 製品の開発中に使用された思考のパターンを示しています。
  • これは、共同作業を中断されません

ただし、プログラマーのチームが存在する場合、プログラミングハウスの哲学は最優先事項であり、個々のコミット動作に優先します。すべての進行状況を記録することを決定するプログラミングハウスもあれば、機能を解決するコードのみをコミットすることを決定するプログラミングハウスもあります。この場合、壊れたコミットの値(ソフトウェア管理の観点からはcost)は悲惨です:

  1. さらなる機能に使用される時間は現在、エラーの修正に費やされています...
  2. 開発カットが満たされていません...
  3. 製品は時間通りに出荷されません

これら3つの効果を指数関数的に会社のメルトダウンにカスケードすることで、他のポイントを追加することができます...もちろん、これは悪いコードを常習的に慢性的にコミットする効果でなければなりません。


0

壊れたコードをコミットしても大丈夫だとは思わない。

どうなりますか

  • 緊急のホットフィックスが必要です。コードベースは壊れた状態です。ロールバック、修正、展開を余儀なくされます。

  • あなたが壊れたコードをコミットしたことを知らずに、他の誰かが同じブランチで働き始めます。彼らは彼らの変化が何かを壊したと考えて「赤いニシン」を追いかけているかもしれません。

  • あなたは会社を辞めるか、休暇に行くか、何らかの理由で仕事に行くことができません。同僚は、何が壊れているのか、なぜ壊れた状態でコミットされているのかを見つけるために、深く掘り下げる必要があります。

  • 誰かがあなたの「壊れたコード」をデプロイしますか?これは、個人データまたは支払いプロバイダーで作業している場合、「ゲームオーバー」になる可能性があります。

@WarrenTへの返信

誰もが機能ブランチで作業する理想的な世界では、機能しないコードをコミットしても機能する可能性があることに同意します。私は大規模なプロジェクトに取り組んできましたが、それでも複数の人が1つの機能ブランチで作業しなければならない場合がありました。また、リリースが数週間先であり、翌日に修正する予定であるため、人々がメインブランチに「動作しない」コードをコミットするのを見てきました。これらはすべて災害の候補であり、私はそれらがどんな犠牲を払っても回避されるべきだと強く信じています。


ダウン投票。標準のDVCSワークフローを使用している場合、これらのシナリオはほとんどありません。
user16764

1
git(または他のDVCS)ワークフローを使用して、開発者はメイントランクではなくブランチ、ローカルブランチで作業しています。次の質問は、開発者が壊れたコードを別のリポジトリにプッシュすることです。これは、チームがどのブランチが何のためにあるのかを理解し、コミットに対して適切なコメントを使用するという問題です。ホットフィックスはリリースブランチでのみ行われます。もちろん、壊れたコードをそこにマージすべきではありません。チームにはワークフローのルールが必要ですが、ローカルリポジトリで行われることはまったく異なります。
ウォーレン

「動作しないコード」(OPが要求したもの)と、あなたが参照する「壊れたコード」には違いがあると思います。
サイモン

@WarrenT返信をご覧ください。
CodeART

-1

動作しないコードをコミットしてもよいかどうかを判断するのに役立ついくつかの質問:

  1. 働きすぎですか?
  2. チームメイトは常にビルドを壊していますか?
  3. あなたのコードベースは混乱していて、一見悪くなることはありませんか?

上記のいずれかに「はい」と答えた場合、はい、機能しないコードをコミットしてもかまいません。

できるだけ早く修正し、適用可能な単体テストでカバーし、ビルドを壊したことを謝罪することを忘れないでください。

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