ソースコードをチェックインする前のいくつかの良い習慣は何ですか?[閉まっている]


47

私のチームはソース管理にTeam Foundation Serverを使用しています。今日、チェックインする前にいくつかのバグとスモークテストアプリケーションを修正しましたが、コードをコメントするのを忘れていました。(このコードにより、UIが少し奇妙になりました。)

コードをチェックインする前に、どのような優れたプラクティスがあるのか​​を知りたい-この種の間違いを二度とやりたくない。

回答:


149

私が習慣にしていることの1つは、チェックインする直前に、チェックインしようとしているすべてのファイルの差分を常に確認することです。


46
+1は明らかですが、もし誰かがこれをしていないなら、彼らは間違っています!
デビッドヘ

6
+1実際には、それはそれほど明白ではありませんが、あなたがそれをしないならば、あなたは後悔するでしょう。
ネマンジャトリフノヴィッチ

14
+1また、これがあまりにも多くの作業だと思う場合は、おそらく一度に多くのコミットをしていることになります。
mpeterson

5
また、diffを見ると、特に複数の修正を行った場合に、変更で何を達成しようとしていたかについての記述ノートに入れるべき内容を簡単に知ることができます。
ジョナス

4
それはを通して見て価値がないなら、それはおそらく価値がチェックではありません。
ロバート・ジェプセン

63

コメントアウトされたコードをチェックインしないでください。チェックインする前にコメントアウトする必要があるコードがある場合、それは間違っています。

ルールに関して:

  1. 最新情報を入手
  2. マージの競合を修正
  3. 構築する

    3.1ビルドエラーを修正

  4. テストを実行する

    4.1壊れたテストを修正する

  5. 1に移動します(取得する新しいものがなくなるまで)

すべてのステップが完了したときにのみチェックインしてください。

チェックインダンスをご覧ください


その他の良い習慣:

  • チェックインするファイルのリストを確認して、期待されるファイルであることを確認します。
  • 各ファイルの変更を確認します(削除/追加/差分)

ここでダブルテイクをしました。おそらく、「コメントアウトされたコード」を意味しますか?私自身、コメントされていないコードをチェックインしないようにしたいと思います!
ポントゥスガッジ

11
+1-これはかなり完全なリストです!ビルドを壊さないでください!!
-ozz

1
@Philip- これが良い習慣ではないことを知っている限り、そしてこれが単純な短期の仲介者である限り、これはそのルールを破る数少ないケースの1つです。人々がコメントアウトされたコードをチェックインして「失わない」ようにするとき、私はそれをもっと気づきます。
Oded

2
@Philip、だからgitはいいです。これらのWIPの変更rebase -iは、必要に応じてローカルでコミットできます。その後、メインリポジトリにプッシュする前に、必要に応じてコミットを破棄し、ローカルヒストリをクリーンアップします。
アレックスブドフスキー


20

などTFS、SVN、PERFORCEの、として、私はあまりここpantsweaselのことをしようとしないんだけど、この問題の仮定は(とすべてが、答えの1)ほとんどの集中VCSに適用される
フェア十分にはそれが何です、 OPが使用しています。

一方、DVCS(MercurialやGitなど)を使用する場合は、通常、チェックインを待つ必要はありません。また、回答に記載されているもの(diff、最新版、マージなど)のほとんどは不要です。 。コードレビューやテストなどのことでも、チェックイン後に行う方が良いでしょう(ただし、プッシュする前に依存する可能性がありますが...)
ここで見た1つの例外は(これまで)ワークアイテムとの関連付けです。もちろん、チェックインについてコメントすることも良いです...


5
チェックインにコメントするための+1。私の店ではそれはポリシーではありませんが、後で私の記憶をジョギングするためだけに、説明的なメモを残すように常に心がけています。
PSU

合意-Odedのワークフローは、各ステップ間、または少なくとも各ループ間でのバージョン管理の恩恵を受けると思います。
ケビンフェルメール

7
これらの手順はすべて、チェックイン時からプッシュ時に移行するだけではありませんか?
user13278

@ user13278そのうちのいくつかは行いますが、異なります。たとえば、マージはまったく別の体験です。プッシュ中に行うので、getlatest-merge-tryagainサイクルは不要です。そして、すべての変更セットに対してそれを行うことができ、すべてのチェックインを再マージする必要はありません。一般に、これらの手順の多くは、チェックインとはあまり関係がありません。たとえば、チェックイン(またはプッシュ)するためではなく、必要なときにプルします。もちろん、まだテストする必要がありますが、それは独自の時間枠で行うことができます。プッシュは依然としてはるかに軽量のままですが、もちろん、あなたはがらくたを押さないようにしたいです。
AviD

2
+1。GitやHgでは、作業項目との関連付けが難しいのです。Kilnのようなパッケージ全体を実行する必要があります。これは、TFSが有効な(唯一の)エリアです。ただし、バージョン管理には有害です。
ロバート

8

他の答えには見られなかった3つのこと:

新しいファイルを含める

  • チェンジリストに含まれていない新しいファイルを探します
  • PerforceのようなSCMに固有のものである可能性があります。変更内容をすべて伝えなければなりません。

変更されていないファイルを元に戻す

  • 他の人の変更を見ていて、9つのファイルを持つ変更リストがありますが、変更されたのはそのうちの3つだけです。
  • また、空白やその他の意味のない変更を含むファイルを元に戻します。

送信したコミットを確認する

  • コミット後、ビルドが緑色のままであることを確認してください。
  • コミット後に同期、ビルド、実行する2台目のマシンを使用していたので、何か問題が発生した場合は簡単にジャンプして修正できました。

Gitを使用するときの2つのこと:

アトミックコミット:

  • コミットのために個々の機能変更のみをステージングします。
  • コミットをできるだけ小さくします。簡単にパッチを当て、元に戻し、理解できるようにします。
  • 私が使用しgit add --patch、必要に応じて複数の部分に私の変更を分割します。

要約しながら差分を表示

  • 私はいつもチェックインしているgit commit --verboseので、コミットメッセージを入力している間に変更の差分を見ることができます。(または、パッチを適用したgit-vimを使用して差分を表示します。)
  • これにより、変更を簡単に確認し、コミット全体を説明できます。時々、私はこの段階で意図しない変更を見つけます。(変更を説明すると、それについて考えるのに役立ちます。)

アトミックコミットに言及する唯一の人物であるため、+ 1。
スティーブンポールガー

7

私のチームのサーバーに適用する「良い習慣」のいくつかの項目は非常に簡単です。まず、チェックインする前に、常に最新のものを取得してローカルビルドを実行し、コード内で他の誰もチェックしていないことを確認する必要があります。さらに、サーバーではなく、ローカルマシン上のコードの競合に注意してください。最新のコードがダウンロードされたコードが適切にビルドおよび動作することが確認されたら、次のステップに進む準備ができています。自動化されたテストを実行し、チェックインを開始して、引き続き正常に機能することを確認します。その後、念のため、もう一度最新情報を入手してください。

TFS管理者として、すべてのチェックインにコメントを強制することができます。強制されているかどうかに関係なく、常にチェックインコメントを入力することをお勧めします。そうするオプションがある場合は、強制します。コメントは、少なくとも、最後にコードをチェックインしてから変更した内容の一般的な要約であることを確認してください。そうすれば、何か問題が発生した場合は、チェックインを調べて、おおよその内容を確認できますそのチェックインで変更されました。壊れたビルドのデバッグがずっと簡単になります。

さらに、TFS管理者権限がある場合は、チェックインでローリングビルドを強制し(チェックインが何かを中断した場合に他の人がすぐにわかるように)、ゲートチェックインを実行するようにサーバーを設定できます(チェックインされたコードがビルドを壊した場合、サーバーはそれを拒否します)、または単にバグを作成し、ビルドを壊した人にそれを割り当てることができます。

すべてを適切に保つためにオンまたはオフにすることができる他のオプションがいくつかあります。


私はこの答えが好きです。QAとして、バグを表示する原因となったコミットまでさかのぼることがあります。説明的なコメントを用意しておくと便利です。また、リリース時に、当店はリリースノアと呼ばれるものを作成します。これは、新機能と変更の蒸留であり、チェックインノートはこの情報の重要な情報源です。
オメガケンタウリ


4

Windowsからチェックインする場合、コードにこれらの目に見えない^ M文字がないかどうかを確認してください-UNIXのエディターは、そのためにエラー/警告を出すことがよくあります。

また、タブを試してみてください-異なるユーザーは、4つのスペース、8つのコード、およびコードの可読性が良くないタブストップを別の方法で見ることになります。

私見の最善のアプローチは、事前に定義されたスクリプトに、組織のコーディングガイドラインに対してコードをチェックさせることです。ソース管理システムの負荷にはこの機能があります。


4
^ M文字のチェックは、UNIXボックスが実際に何らかの形で開発プロセスに関与している場合にのみ意味があります。一部の企業は全Windowsショップです。
ディマ

1
まさに。これが、タブを使用しない理由です。
アレックスブドフスキー

いくつかのSCMが行末を処理します(他のSCMは他よりも優れています)。Perforce(kb.perforce.com/?article=063)、git(git configのcore.eol)、svn(svn:eol-style)など
idbrii

@Alex:またはどこでも一貫してタブを使用します。あなたが一貫している限り、あなたがどちらをするかは関係ありません。
ドナルドフェローズ

@donal、いいえ。ここに問題があります。タブはエディターの構成の影響を受けるため、本質的に一貫性がありません。cmd.exeやほとんどのLinuxコンソールなど、一部の「エディター」は構成不可能であるため、自分自身と矛盾することさえあります。
アレックスブドフスキー

4

私の会社では、チェックインレビューを使用しています。これらは詳細である必要はありませんが、チェンジリストで差分を誰かに見せて、それらを話すだけで、テストで見落とした奇妙なタイプミスを強調することがあります。

ソース管理サーバーでは、コメントにレビュー担当者の名前を記入しない限り、チェックインできません(たとえば、!イニシャルの形式で、たとえばBruce Wayneがレビューを行った場合は!BW)。レビュー担当者は、レビューに協力したことを通知するメールを受け取ります。これは明らかに悪用される可能性がありますが、かなりうまく機能しているようです。


4

可能な限り、チェックインをワークアイテムに関連付けたいと思っています。これにより、変更された理由だけでなく、変更された理由に関するコンテキスト情報が得られます。TFSにはかなりまともな作業項目追跡システムがあるため、チェックイン時にこれを行うのはかなり簡単です。

(これは私の変更の差分を確認することに加えて)


2
これはチェックインポリシーとして設定できるため、ワークアイテムに関連付けずにコードをチェックインすることはできません。
ジョンサンダース

良い点、ジョン。私は実際、私が仕事をしている場所ですぐにこれをやりたいと思っています。
mpeterson

物を強制することは通常逆効果です。代わりに、それが彼らにとって良いことであることをあなたの人々に理解させてください。
ロバートジェプセン

3

私がやっていることの1つは、実際に変更されていないファイルをチェックインしないことです。これらのファイルは、誤って変更された可能性があります。または、ロールバックされたか、さもなければ無意味にされたリファクタリングに関係している可能性があります。

このようにして、ワークセットに関連付けられた変更セットには、ワークアイテムを満たすために必要なファイルが正確に含まれます。


3

ここですべての回答を組み合わせて、完全なチェックリストを提供するには

  1. [チェックイン/チェックアウト]他の人が作業しているストリームに直接チェックインしないでください。例えば、開発者ごとに、他の人を煩わせることなく独立してチェックインおよびチェックアウトできるストリームを作成する必要があります。安全であるが、あなた自身の開発ストリームにあるので[あなた自身の開発ストリームにのみ]。チェックインのたびに、変更セットと呼ばれるその変更に対して変更がアトミックになるように変更レコードに関連付けます(したがって、「すべて」を配信することなく、個々のrfcやバグなどを配布できます)。

  2. [そして、あなたのチームストリームでリベースします]これは、自分のストリームで他の人から変更を取得することを意味します。その操作中に、マージダイアログですべての「差分」を確認し、それらを通過することができます...または数千がある場合、および/またはコードではなくデータモデル/ Siebelプロジェクトなどを使用している場合...非自明なマージ、自明な自動マージおよび自明な手動マージ、最後のカテゴリには難しいものが含まれます。まだ自分のストリームで作業していることに注意してください。

  3. [完全なリベース]すべてが問題なければ、チームストリームから取得したすべての変更をチェックインします。あなた自身のストリームは最新です

  4. [配信]は、チームストリームに作業を配信します。すべてを配信したくない場合は、たとえば、特定のバージョンのファイルを含む1つの特定のRFC、または解決済みのRFC /欠陥のセットを選択することもできます。

  5. [テスト配信]は問題ありませんが、誰かが変更を配信する可能性があるため、チームストリームの最新の変更で作業が機能するかどうかをテストできます。違いを示す同じマージダイアログを使用します。

  6. [完全な配信]配信を完了すると、作業はチームストリームに追加されます。

より複雑にするために:提供した作業がまだ可能性があるため、別のバージョンで作業している可能性がありますが、提供後に常にベースラインを設定し、他のユーザーがリベースするのに好ましいベースラインを指定する必要があります。これにより、他の開発者がストリームの最新バージョンではなく推奨バージョンを取得することが保証されます(そのシナリオで作業している場合)。これはトリプルチェックでもあるため、チームストリームの最新バージョンが「悪い」場合でも、他のユーザーがリベースまたは参照するバージョンではなく、構成マネージャーは前のバージョンを次のバージョンにマージして元に戻すことができますあなたの配達。

  • histumnessからの答えは2回発生します:ステップ2および6
  • チェックインダンスでのOdedの答え:明確ですが、チェックイン/チェックアウト時にデリバーとリベースの追加レイヤーを使用して、孤立した作業を行い、後の段階でもエラーを簡単に取り除くことができます
  • 回答したギルドからの答え:最新の取得はステップ2です。ビルドの場合:ビルドがあるかどうかによります...私の世界では、データモデル、ワードドキュメント、要件シート、informaticaからの構成データ、siebel、など。そして、Javaコード、.netコードなども含まれます。したがって、ここには実際には「ビルド」はありませんが、「コード」からの単一のビルドが他のすべてのものと統合されるかどうかに応じて、より高い統合があります。コンパイルされたものである可能性のあるテスト環境が必要であるか、別のチームの何かが必要なため、より高い配信で別のビルドが必要です。
  • コメントと必須のギルドバウンティからの答え:バージョンと変更セット(およびタイプ:欠陥、RFC、hotfi)の統合のないすべての環境は成熟していないと思います。たとえば、リリースノートを自動化できず、タッチされた正確なバージョンにクリックスルーできるバグとrfcの量がある場合(たとえば、hello.cのバージョン1とバージョン3は非常にうまく配信される可能性があるため) 2は後のリリースの一部であるが、一部のnoobが既にそれを入れているため、2は配信されませんでした(したがって、helloのバージョン3を削除する場合は手動で決定することを意味します)。cただし、バージョン3を削除するということは、RFC /欠陥の影響を受ける他のすべてのバージョンも削除する必要があることを意味します。その同じRFC)が、少なくともあなたはそれを決定するためにそれの周りのものなどが必要です...)。追加のドキュメントは常に便利ですが、変更セットを関連付けることで完全な円を取得できます。バージョン<-変更セット<-ワークアイテム<-チケット/ rfc / defect <-要件。意味:どの要件が完全にまたは完全に提供されているかがわかります。1つの要件に複数のRFCまたはバグなどが含まれています。RFCには、複数の人のための複数の作業項目があります。そのワークアイテムは、一連のバージョンの存在する変更セットに対応します(たとえば、バージョン1ではなく、統合ストリーム上のhello.cのバージョン1および3)
  • luis.espinalからのコメント:ビルドを壊さないでください。リベースで二重チェックされ、まだ配信されます。「メインブランチで直接作業しない」はい、ストリーム構造は大きくても単純でもかまいませんが、本質的には開発者が独自のストリームを持ち、リリースストリームに配信するチームストリームに配信します。->すべてのチーム(例:ドキュメントチーム、要件チーム、開発チーム、

あなたの例では、コードをコメントアウトするのを忘れたことを伝えます。間違いが起こります。その周りの構成管理システムがそれを処理する必要があります。たとえば、数千の変更が発生し、「ビルド」と「統合」が異なるサーバー上のストリームの階層で発生し、時間の経過とともに処理されます。したがって、5か月後にコメントアウトされたコードが統合サーバーでテストされたとしても、コードは他のコードやシステムとの統合を必要とするため、変更セットをアトミックに取り出して継続することが可能です。そのため、ベストプラクティスは多かれ少なかれ高いレベルで行われます。構成管理ストリームの全体的な設計がそれを処理する必要があります。個々の開発者にとってのベストプラクティスは、もちろん検証/単体テストです。しかし、全体像から「


2

以下のいくつかは、SCMに応じて他の(または異なる形式で)適用されるため、ここで説明します。

  1. ビルドを壊さないでください-コンパイルするコードのみをチェックしてください。
  2. チェックインにコメントを付けます(SCMがそのオプションを提供している場合は、チェックアウトも可能です)。
  3. 長い間、チェックを外したままにしないでください。
  4. 頻繁にチェックインします(可能な場合は1日に数回)。
  5. 意味のあるラベルを付けます。
  6. 定期的にラベルを付けます。
  7. メインブランチで直接作業しないでください。
  8. 本番環境へのすべてのリリースには、独自のラベル(および、可能であればメインブランチからの読み取り専用ブランチ)が必要です。可能な場合は、UAT /統合/運用前テストリリースでも同じことを行います。
  9. SCMにあるものやラベルから、製品にあるものを正確に構築できるはずです。

:項目のいくつかは、上記のかなり明白に見えるが、あなたは最初の生産上のメインブランチやメイクの変化にどのように多くの人々 、実際に仕事を信じていないでしょうし、その後、手動で直接、メインブランチに...バージョン管理に行くためにデルタを作成します。 ..およびラベル付き。発酵させた胆汁のような甘いものに、洗っていない脇の下のジュースを混ぜて…ええ、そのように。


2

個人用のチェックリストを用意してください。入り口で台無しになったら空にしてください。第二の性質になったら、リストから削除します。

テストを実行します。合格した場合はチェックインします。混乱してテストを通過した場合は、テストを作成します。


1

私たちは次のことを行います...

  1. テスト-動作することを確認したい。少なくとも、それが何も壊さないことを知りたいです。

  2. コードレビュー、または少なくともバディチェック-これは、知識が広まり、人々が最新の状態に保たれることを保証する素晴らしい方法です。また、チェックインする前にバグをキャッチするのにも役立ちます。

  3. 事前通知の送信-チェックイン前に事前通知がグループに送信されます。目的は、どのファイルまたは領域が変更されているかを他の人に知らせることだけでなく、それらの変更がそれらに影響を与えると予想される場合に注意を促します。

  4. 事前通知を送信してから数時間後、チェックインが実行され、グループにメールで通知されます。グループの全員が、バグまたは機能に関する特定の作業がいつ完了したかを知ることができます。

  5. チェックイン通知のコピーは、バグまたは機能に関連付けられた修正レコードに貼り付けられます。レコードを検索するとき、修正/機能が何を伴うのかを知ることが非常に便利であることがわかります。



1

コードが適切にフォーマットされていることを確認します(Javaの場合:コードを選択して、EclipseでCtrl-Shift-Fを押します)。ただし、ドキュメント全体に対して同じことを慎重に行ってください。


1

常に、常に、常に、あなたが行った変更がビルドを壊さないことを確認してください。特に些細なことのように見える小さな変更。

週末に仕事を辞める直前に問題を引き起こすとは思わなかった、非常に小さな変更を加えました。案の定、その小さな変更によってビルドが中断され、プロジェクトの夜間テスト実行は実行されませんでした。Q&Aチーフはそれについてあまり満足していませんでした。


1

スタンドアロンユニットとして使用できる変更の部分を探します。

多くの場合、コードの作業修正または機能拡張を行うまでに、かなりの数の変更があります。それらのいくつかは、私がしようとしている行動の変化に固有のものです。他のものは、私がその変更をよりきれいにするためにしたリファクタリングです。

次のように、独自の変更記述を使用して、各リファクタリングを個別にチェックインすることを好みます。

REFACTORING:Xの名前をYに変更

Xは以前は理にかなっていましたが、今ではYになっているはずです。これは、問題#9の作業に関連しています。

その後、適切なリファクタリングがそれぞれチェックインされると、最終的な動作の変更はたいてい些細なことです。

また、一部の変更は多くのコード行に影響を及ぼしますが、あまり面白くありませんが、他の変更は非常にローカライズされていますが、重要な影響があります。これらの変更を一緒にチェックインすると、差分を読みにくくなる可能性があります。だから、私はそれらを別々に保ちます。

後に、誰かが変更履歴を読んでいるとき、物事が現在の状況にどのようになったか、そしてなぜそうなっているのかは明らかです。また、他の多くの編集と絡み合っていないため、動作の変更を元に戻すのも簡単です。


0

あなたが誰かから借りたものを返すときにあなたがすることをしてください。きれいで、形が整っていることを確認してください。混乱した場合は、コードを所有者(ほとんどの場合、雇用主)に返す前に必ずクリーンアップしてください。


gitは、公開する前に混乱を解消するのに役立ちます。残念ながら、集中型VCSはそうではありません。
アレックスブドフスキー

0

私は仕事のために地元のhgリポジトリを保持しています。

  • 何かをチェックインするたびに、差分を確認し、すべての変更が受け入れられることを確認します。
  • チェックインの重要な機能に注意してください。
  • 各コミットサイズを1つの重要な機能に維持しようとしています。

私はこれらが最高だと主張していませんが、彼らは私のために働いています。


0

チェックインするつもりはないことがわかっているコードを書くとき、「// TEMP:」を含む行の前と「// END TEMP。」を含む行を追加します。これは、チェックインする前にdiffを実行することとともに、そのコードを誤ってチェックインしないことを約束します。


0

追加または変更したすべてを徹底的にテストします。考えられるすべてのケースを試してみてください。テストをQAに任せないでください。マイナーチェンジを行うたびにサンドイッチを用意し、安全のためにテストケースをいくつか試してみて、すぐに問題を見つけたら、サンドイッチがたくさんあります。私は大声で「それを試したことが本当にうれしい...」と自分に言います。

変更後にUIが奇妙になったと言います。チェックインする前にプログラムを実行してUIを確認するだけであれば、問題に気づいたでしょうか?

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