ほとんどのシステム開発の現場では、複数人で開発を行っているかと思います。
その中でファイルに対して変更を行った際に「誰が」「なぜ変更したのか」、「変更した前の状態に戻す」などの状況が多々あります。
その際にバージョン管理ツールを使うことでファイルに対しての変更を管理することができます。
ここでは、バージョン管理で登場する基本的な用語や操作について記載しています。
バージョン管理機能を使ったファイルの管理
1. バージョン管理とは
ファイルに対して「誰が」「いつ」「どのような変更をしたのか」などの情報を記録することを指します。
バージョン管理を行わない場合、ファイルを上書き保存するため、変更前後の差分の確認、過去に遡ってファイルを復元することができません。
そのため、ファイルをコピーして変更前後を比較する、特定の場所にファイルをコピー(バックアップしておく)などを行えば管理できますが、管理する際のルールが適切に行われていないと「どのファイルが最新なのか」「なぜ同じ様なファイルが複数あるのか」などの問題が生じます。
システム開発などの現場で、複数のファイルに対して複数人で管理運用する場合にバージョン管理ツールを使うことで簡単かつ効率的にファイルの管理を行うことができます。
バージョン管理を行う際に利用するツールによって「集中管理方式」と「分散管理方式」に分かれています。
1-1. 集中管理方式
中央リポジトリと呼ばれる場所でファイルのバージョン管理を行う方式を指します。
集中管理方式は、「Apache Subversion(SVN)」などにて利用されている方式になります。
1か所で管理している場所(中央リポジトリ)にてバージョン管理が行われており、利用者は必要なファイルをチェックアウト(ダウンロード)して変更を行います。
その後、変更したファイルをチェックイン(アップロード)することで変更が管理されます。
1-2. 分散管理方式
利用者のパソコン内にあるローカルリポジトリとサーバー上にあるリモートリポジトリを使ってファイルのバージョン管理を行う方式を指します。
分散管理方式は、「Git」などにて利用されている方式になります。
利用者は、リモートリポジトリから必要なファイルをローカルリポジトリにプル(ダウンロード)して変更を行います。
その後、変更したファイルをローカルリポジトリにコミットすることで利用者のパソコン内でバージョン管理が行えます。
また、リモートリポジトリに対してファイルをプッシュ(アップロード)することでサーバー上で管理されます。
また、集中管理方式や分散管理方式のどちらの場合でも、複数の利用者でバージョン管理を行っているため、同一ファイルを同時に変更してしまう可能性があり、その際にコンフリクト(衝突)が発生しコミットが失敗します。
できるだけ複数人で同一ファイルを変更するのを避けて作業を行う、変更中の利用者とコミュニケーションを取りながら変更しても問題ない箇所の修正を行うなどコンフリクトが発生しない工夫を行うことで防ぐことができます。
2. 基本的な用語
・リポジトリ
ファイルや変更履歴(ファイルに対して「誰が」「いつ」「どのような変更をしたのか」などの情報)などを保管しておく場所になります。
・リモートリポジトリ
インターネット上で管理するリポジトリ(GitHubなど)やLAN内のネットワーク上で管理しているリポジトリになります。
設定次第では、全世界の人や開発チームのみがアクセス可能になります。
・ローカルリポジトリ
利用者のパソコン(ローカル環境)で管理しているリポジトリになります。
リモートリポジトリを直接変更できないため、ローカルリポジトリにて変更を行いリモートリポジトリにプッシュする必要があります。
・コミット
利用者のパソコン上で変更したファイルなどをローカルリポジトリに反映します。
・プッシュ
ローカルリポジトリで管理している変更をリモートリポジトリに反映します。
・プル
リモートリポジトリの内容をローカルリポジトリに取り込む操作を行います。
「fetch」と「merge」を行うことでもリモートリポジトリからローカルリポジトリに取り込むことができます。
・ステージング
ファイルに何かしらの変更があった場合にコミットする対象であると認識させることを指します。
ステージング状態になってファイルの変更がリポジトリに反映されます。
自動的にステージングされないため、作業者がコミットを行うファイルを指定する必要があります。
・アンステージング
ファイルに何かしらの変更があってもコミットされない状態のことを指します。
ファイル変更後などでステージングを行う操作をしない限りアンステージング状態になっており、コミットが行われてもファイルは無視されます。
・アントラッキング
ファイルがリポジトリで管理されていない状態を指します。
ファイルに変更やコミットが行われても、アントラッキング状態のファイルは無視されます。
・ブランチ
変更をコミットする際にリリースするバージョンなどを分けて管理する際に使用する機能になります。
メインのブランチから分岐して管理することで他のシステムに影響なく変更を取り込むことができます。
・タグ
特定のコミットに対して名前を付けて管理することができます。
リリース時のバージョンなどをタグつけしておくことで、タグからコミットを遡ることができるようになります。
また、タグには「計量タグ」と「注釈付きタグ」の2種類があります。
計量タグには、名前のみを付けることができますが、注釈付きタグには、名前以外にコメントや署名を付けることができます。
・プルリクエスト
バージョン管理を行っているソースコードで、修正したコードをいきなり本番適用した場合にバグが発生してしまう可能性があります。
そこで、プルリクエストを行うことで、関係者へソースコードのレビューを依頼し、問題がないものをマージする仕組みになっています。
これにより、ソースコードの変更箇所が分かりやすく表示されたり、関係者とのやり取りを残しておくことができます。
3. Gitを使った基本的な操作
3-1. Gitとは
バージョン管理とはの項でも記載しましたが、分散型管理方式でファイルのバージョン管理が行えるツールになります。
WindowsやLinux、Mac OS などの環境で使用することができます。
基本的には、CUIで操作を行いますが、Git機能を使えるGUIツールと組み合わせることでGUIで操作することができます。
操作イメージ
3-2. リポジトリへのステージング
<file>に指定したファイルをコミットができる状態にします。
また、<file>に「.」を指定することでフォルダ内のファイルをまとめて指定することができます。
・1つのファイルを指定する場合
$ git add <file>
・複数のファイルをまとめて指定する場合
$ git add .
3-3. ローカルリポジトリへコミット
ステージングされているファイルをローカルリポジトリへコミットします。
コミットメッセージの入力が必要になるため、コマンド実行後のエディタに入力します。
・変更対象のファイルをコミット
$ git commit
3-4. リモートリポジトリへプッシュ
・リモートリポジトリに反映
$ git push
3-5. リモートリポジトリからプル
・リモートリポジトリに反映
$ git pull
4. まとめ
Gitの概要や登場する用語などを概要レベルで記載してきました。
あくまで概要レベルでの記載になるのでより理解を深めていくためには、各操作(コマンド)がどのように処理を行っているのかを裏側を知ることも大切になるかと思います。
また、Gitを操作するツールなどについても学んでいく必要があります。