Software Configuration Managementを初めて使用する学生にSCMクラスを教えると、「What's the difference between checkin and checkout?
」のような質問が出てきます。
そしてそのバリエーションは、そのような学生がこれらのSCMの概念について混乱することです(彼らはそれらを他の方法として理解しています)。
では、この重要なSCMの概念をそのような聴衆に説明するために、どのようなメタファーを使用できますか?
Software Configuration Managementを初めて使用する学生にSCMクラスを教えると、「What's the difference between checkin and checkout?
」のような質問が出てきます。
そしてそのバリエーションは、そのような学生がこれらのSCMの概念について混乱することです(彼らはそれらを他の方法として理解しています)。
では、この重要なSCMの概念をそのような聴衆に説明するために、どのようなメタファーを使用できますか?
回答:
誰かに何かを説明するために、彼らが(できれば)すでによく知っているものと比較してみてください。
だから私はそのような質問に答えるだけです:
滞在する場所(ホテル、リゾートなど)に到着したと考えてください。
- 非常に最初の(あなたが到着したときに)あなたが事はしています
checkin
。- 非常に最後の(あなたが去るとき)あなたが事はしています
checkout
。あなたがいることを除いて...ソフトウェアコンポーネントに変更を適用したい場合にも、同様のSCMの概念が適用され、それが他の方法で回避を適用します:
- 非常に最初の(あなたが起動したときに)あなたが事はしている
checkout
(またはそれを借りるようにそれを考えます)。- 非常に最後の(終了したら)あなたが事はしている
checkin
(または戻ってそれを与えるようにそれを考えます)。
注:これは、集中システム(メインフレーム環境で使用されるシステムなど)に適用されます。以下のようなシステムではgitの「checkout
」(これらのシステムではほとんどの両方の概念について混乱がない理由IMOもある)という概念は全く異なる意味を持ちます。
「チェックイン」と「チェックアウト」という用語は、SCMシステムのタイプに応じて異なる意味を持つことに注意することが重要です。
TFVC、Subversion、Clearcaseなどの集中型システムは、「排他的な」チェックアウトを使用します。これは、一度に1つのユーザーだけがファイルをチェックアウトできる、Pierreの本借用メタファーのようなものです。
gitのような分散システムには「チェックアウト」コマンドがありますが、これは完全に異なるものを意味します。git checkout
ローカルリポジトリを操作するときにブランチを切り替えるために使用されます。
集中型システムの場合、テクニカルライブラリのようなものだと考えてください。(この仮想ライブラリがどのように機能するか想像力のストレッチかもしれません...)
あなたがドキュメントの作成者である場合checkout
、ライブラリをコピーし、変更を加え、check it back in
世界中の人に見てもらうためにライブラリに戻すことができます。
これは、ライブラリにデジタルコピーがありcheckout
、ドキュメントであり、他の誰かがchecks out
ドキュメントでもある場合、問題が発生する可能性があります。そのとき、このための最初の「修正」は排他的なcheckout
機能です...
もちろん、大規模なプロジェクトのための重要なマージ競合の問題の可能性はそう(人々がシステムの異なる部分の作業をおこなう予定)が低減されるcheckout
/ checkin
限りほとんど必要ありません。また、設計上の分散システムには、他の多くの利点とともに、優れたマージ機能が多少必要であるため、その概念は実際にはgitやその他のDVCSには存在しません
次に、SCMリポジトリを主な主題として」
- チェックアウトは、リポジトリ内のオブジェクトのブランチの変更に対する排他的ロックです。
- チェックインは排他ロックのリリースです。
分岐の最小単位に応じて、2種類のソース管理システムがあります。
1)リポジトリごとの分岐(CVS、SVN、GIT、Perforceなど)
リポジトリ全体をブランチする製品では、通常、チェックアウトはリポジトリ全体のローカルブランチ(コピー)への変更を作成するか、有効にします。これらの製品では、チェックインは多くの場合使用されず、コミット操作の一部になります。これは、リモートブランチのチェックアウト、ローカルパッチの適用、およびリモートブランチのチェックインを一度の操作で行います。ローカルブランチは恒久的にチェックアウトされているため、チェックインしません。(注:GITでは、リモートブランチにコミットするのではなく、ローカルコミットをプッシュします。厳密には構文上の違いがあります。)
2)オブジェクトごとの分岐(ClearCase、AccuRev、Oracle ADE)
ディレクトリ、ファイルなどの個々のオブジェクトを分岐する製品。チェックアウトとチェックインの概念は、分岐ごとのオブジェクトごとに適用されます。あなたはでそれを修正するために、オブジェクトをロックしますチェックアウトし、それを解放しチェックイン。これらの製品では、多くの場合、ロックによって誰も作業を妨げられないプライベートブランチで作業し、ローカルブランチを共有ブランチにマージするときに、オブジェクトはシャードブランチ(メイン、マスター、機能ブランチなど)でもチェックアウトされます)マージの競合が解決され、オブジェクトが共有ブランチでチェックインされます。これにより、同じオブジェクトを変更しない限り、複数の人が共有ブランチに同時に「コミット」できます。