バージョン コントロールとは

完了

バージョン コントロール システム (VCS) は、ファイルのコレクションに対する変更を追跡する 1 つのプログラムまたは一連のプログラムです。 VCS の 1 つの目的は、個々のファイルまたはプロジェクト全体の以前のバージョンを簡単に復元することです。 もう 1 つの目的は、複数のチーム メンバーが、1 つのプロジェクト、または同じファイルでさえ、互いの作業に影響を与えることなく同時に作業できるようにすることです。

VCS は、ソフトウェア構成管理 (SCM) システムと呼ばれることもあります。 この 2 つの用語は、しばしば同じ意味で使用されます。実際、Git の公式ドキュメントは git-scm.com にあります。 技術的には、バージョン コントロールは SCM に関連する方法の 1 つにすぎません。 VCS は書籍やオンライン チュートリアルなどのソフトウェア以外のプロジェクトにも使用できます。

VCS では、次のことができます。

  • プロジェクトに対して行われたすべての変更について、変更が行われた日時や変更者を確認します。
  • 各変更の背後にある理由を説明するメッセージを含めます。
  • プロジェクト全体または個々のファイルの過去のバージョンを取得します。
  • 実験的に変更を行うことができる、"ブランチ" を作成します。 この機能を使用すると、メイン ブランチに影響を与えることなく、複数の異なる変更セット (機能やバグの修正など) についての作業をさまざまな人が同時に行うことができます。 後で、メイン ブランチに戻したい変更をマージできます。
  • タグをバージョンに添付します (たとえば、新しいリリースをマークするため)。

Git は、高速で、汎用性と拡張性が高く、無料で利用できる、オープンソースの VCS です。 その主な作成者は、Linux の作成者である Linus Torvalds です。

分散型バージョン コントロール

VCS の以前のインスタンス (CVS、Subversion (SVN)、Perforce など) では、集中管理されたサーバーを使用して、プロジェクトの履歴が格納されていました。 この集中管理は、1 台のサーバーが単一障害点になる可能性もあることを意味しました。

Git は "分散型" であり、プロジェクトの完全な履歴がクライアントサーバーの両方に格納されることを意味します。 ネットワークに接続せずにファイルを編集し、ローカル環境でチェックインして、接続が利用可能になったときにサーバーと同期することができます。 サーバーがダウンした場合でも、プロジェクトのローカル コピーは保持されます。 技術的には、サーバーを用意する必要もありません。 電子メールやリムーバブル メディアを用いた共有で変更を受け渡すことができますが、実際にこのような方法で Git が使われることはありません。

Git の用語

Git を理解するには、用語を理解しておく必要があります。 Git ユーザーが頻繁に使用する用語の簡単な一覧を次に示します。 今の段階では、詳細を気にする必要はありません。このモジュールの演習をこなしていけば、これらのすべての用語について理解できるようになります。

  • 作業ツリー: 作業中のプロジェクトが含まれている、入れ子になったディレクトリとファイルのセット。

  • リポジトリ: 作業ツリーの最上位にあるディレクトリ。Git では、プロジェクトのすべての履歴とメタデータがここに保持されます。 リポジトリは、ほとんどの場合、"repos" (英語の場合) と表記されます。 "ベア リポジトリ" は、作業ツリーの一部ではないリポジトリで、共有またはバックアップに使用されます。 ベア リポジトリは、通常、名前が .git で終わるディレクトリです (例: project.git)。

  • ハッシュ: ファイルまたは別のオブジェクトの内容が固定の桁数で表わされる、ハッシュ関数によって生成される数値。 Git では、160 ビット長のハッシュが使用されます。 ハッシュを使用する利点の 1 つは、その内容をハッシュし、結果を以前のハッシュと比較することによって、ファイルが変更されたかどうかを Git が判断できることです。 ファイルの日時タイムスタンプが変更されていても、ファイルのハッシュが変更されていない場合、Git ではファイルの内容が変更されていないと認識します。

  • オブジェクト: Git リポジトリには 4 種類の "オブジェクト" が含まれ、それぞれが SHA-1 ハッシュによって一意に識別されます。 BLOB オブジェクトには、通常のファイルが格納されます。 ツリー オブジェクトは、ディレクトリを表し、名前、ハッシュ、およびアクセス許可が含まれています。 コミット オブジェクトは、作業ツリーの特定のバージョンを表します。 タグは、コミットにアタッチされている名前です。

  • コミット: "コミットする" と動詞として使われた場合は、コミット オブジェクトを作成することを意味します。 この操作の名前は、データベースに対するコミットが基になっています。 これは、自分が行った変更をコミットし、最終的に他のユーザーも見ることができるようにすることを意味します。

  • ブランチ: ブランチは、一連のリンクされた名前付きコミットです。 ブランチの最新のコミットは、"ヘッド" と呼ばれます。 リポジトリを初期化すると作成される既定のブランチには、main という名前が付けられます。Git では、多くの場合 master という名前になります。 現在のブランチのヘッドには HEAD という名前が付けられます。 開発者はブランチで個別に (または一緒に) 作業し、後で変更を既定のブランチにマージできるため、ブランチは Git の非常に便利な機能です。

  • リモート: リモートは、別の Git リポジトリへの名前付き参照です。 リポジトリを作成すると、プッシュ操作とプル操作の既定のリモートである origin という名前のリモートが作成されます。

  • コマンドサブコマンドオプション: Git の操作は、git pushgit pull などのコマンドを使用して実行されます。 git はコマンドであり、push または pull はサブコマンドです。 サブコマンドでは、Git で実行する操作を指定します。 多くの場合、コマンドにはハイフン (-) または二重ハイフン (--) を使用するオプションが付属しています。 たとえば、「 git reset --hard 」のように入力します。

これらの用語および pushpull などの他の用語は、そのうち理解できるようになります。 しかし、どこかで始める必要があります。このモジュールを終えた後で、この用語集に戻って用語を確認すると役に立つかもしれません。

Git のコマンド ライン

Git では、GitHub Desktop など、いくつかの異なる GUI を使用できます。 Microsoft の Visual Studio Code などの多くのプログラミング エディターにも、Git へのインターフェイスがあります。 これらの動作はすべて異なり、異なる制限事項があります。 Git の "すべての" 機能が実装されているものはありません。

このモジュールの演習では、Git コマンド ライン、具体的には、Azure Cloud Shell で実行される Git コマンドを使用します。 しかし、Git のコマンド ライン インターフェイスは、使用しているオペレーティング システムに関係なく同じように動作します。 また、コマンド ラインを使用すると、Git の "すべての" 機能を利用できます。 GUI のみを使用して Git を見ている開発者は、解決できないエラー メッセージに直面していることに気付き、作業を再開するためにコマンド ラインを使用する必要があります。

Git と GitHub

Git で作業する際に、これにより提供されている機能と GitHub で提供されている機能の違いについて疑問に思うかもしれません。

既に説明したように、Git は分散型バージョン コントロール システム (DVCS) であり、複数の開発者や他の共同作成者がこれを使用してプロジェクトを操作できます。 1 つ以上のローカル ブランチを操作した後にそれらをリモート リポジトリにプッシュする方法が提供されます。

GitHub は、中核となるテクノロジとして Git を使用するクラウド プラットフォームです。 GitHub により、プロジェクトでの共同作業のプロセスが簡略化され、Web サイト、コマンドライン ツール、および開発者とユーザーが連携できるようにするための全体的なフローが提供されます。 GitHub は、前述のリモート リポジトリとして機能します。

GitHub によって提供される主な機能は次のとおりです。

  • 発行
  • ディスカッション
  • Pull Request
  • 通知
  • ラベル
  • アクション
  • フォーク
  • プロジェクト

GitHub の詳細については、「GitHub の概要」の Microsoft Learn モジュール、または「Getting started with GitHub」(GitHub での作業の開始) のヘルプ ドキュメントを参照してください。

次の手順では、自分で Git を試してみます。