Git と Visual Studio 2017 その 1 : レポジトリの作成
Git や Visual Studio 2017 の Git サポートは既に情報が多くある為、自分が書く意味が無いと思いましたが、Visual Studio で Git を使い始めた頃は結構不安であった事を思い出しました。このシリーズでは Visual Studio 2017 でソース管理をした場合、裏ではどのように Git が動いているのかという観点で情報をまとめます。英語ではすでに書き終わっているので、お急ぎの場合はそちらをどうぞ。
Git の仕組み
まずは Git の根本的な仕組みを知ることが大事。様々な情報がありますが、個人的には以下のビデオがおすすめです。
Advanced Git Tutorial [video]
GOTO 2015 • Deep Dive into Git • Edward Thomson [video]
英語ですがとてもよく説明されています。是非一度見てください。入門的なものはこちらをどうぞ。
しばらくローカル実行
中央管理システムと違い、Git は分散型のソースコード管理システムです。そのためサーバーがなくても動作するため、しばらくはローカルでのみ作業します。
コンソールアプリプロジェクト作成
Git を使うにあたりまずプロジェクトを作ります。
1. Visual Studio で C# のコンソールアプリプロジェクトを作成。「新しい Git リポジトリの作成」にはチェックを**いれない**。
2. [OK] をクリックして作成。準備完了。
レポジトリの作成 : Git
Visual Studio で作業する前に、まず Git での動作を確認します。
1. コマンドプロンプトを開き、ソリューションを作成したフォルダに移動。
2. ‘git init’ を実行。すると .git 隠しフォルダが作成される。出ない場合、隠しフォルダも見えるように設定。
3. この時点でブランチを確認。’git branch’ を実行。期待値としては master は既定であるはずだが、実際にはない。
4. ブランチは実際はコミットに対する参照。現時点でコミットがないのでブランチもない模様。.git ディレクトリには HEAD ファイルがあり、現在のブランチを保持しているため、’type .git\HEAD’ で内容を表示。type は Linux でいうところの cat コマンドで中身が表示可能。
5. HEAD ファイルは refs\heads にある master ファイルをポイントしているが、実際にはファイルはまだない。
ステータスの確認およびステージングとコミットの実行
コミットを実行するには、対象となるフォルダやファイルをステージングエリアに追加する必要があります。この概念は重要で、Git はコードを保持する場所として 3 つのエリアを持っています。
- 作業ディレクトリ: 現在作業しているフォルダ。
- ステージングエリア: コミットする対象を保持するエリア。このエリアがあることで、どのファイルやフォルダをコミットしたいか選択ができる。一度ステージされたファイルは”追跡対象”となる。
- ローカルレポジトリ: コミットしたアイテムが保存されるエリア。
1. ‘git status’ を実行して、現在の状態を確認。まだ何もステージされていない状態。
2. ‘git add .’ を実行してすべてを追加。個別に追加対象を指定する場合は、‘git add .vs VS_Git.sln VS_Git/*’ を実行。再度 ‘git status’ を実行して、ステージングエリアに追加されていることを確認。実際は obj フォルダ等一部のファイルやフォルダは管理対象外にしたいが、方法は後述。
3. ‘git commit -m “初回コミット”’ を実行して、ステージされたアイテムのコミットを実行。 コミット ID として aa28ae9 が表示されている。
4. ‘git status’ を再度実行。今回は “nothing to commit” ということでコミット対象はなし。この表示の場合、作業ディレクトリ、ステージングエリアと最新のコミットが同じ状態。
5. ‘git log’ を実行してコミット履歴を確認。文字化けが発生。
6. 回避のために ‘set LESSCHARSET=utf-8’ を実行して再度 ‘git log’。黄色の文字はコミットの ID となる SHA1 ハッシュ値。また HEAD が master をポイントしている。
Git オブジェクト
では実際、ステージングエリアにファイルを追加したりコミットをすると何が起きるのか?答えはすべて Git オブジェクトとなり、SHA1 ハッシュ値が計算されます。オブジェクトは全部で 3 種類あります。
- ブロブ: ファイルに相当
- ツリー: フォルダに相当
- commit: コミットの実行者名や時間など情報を保持。またコミットに紐づく tree オブジェクトの SHA1 ハッシュ値も保持
1. 一度コミットをしたので、master ファイルが存在するか確認。今度はファイルが存在。中身を確認すると SHA1 ハッシュ値を含んでいるだけだが、この値は先ほどコミットした際に表示されていた値と一致。つまり HEAD ファイルは現在のブランチをポイントしており、ポイントされたファイルは現在のコミットをポイントしている。
2 .git\objects フォルダを確認。複数のフォルダがあるが、これらは各オブジェクトのハッシュ値初めの 2 文字。今回のコミットの場合は aa がフォルダ名となっており、ファイル名は残りのハッシュ値を利用。
3. ‘git cat-file commit aa28ae9’ を実行してコミットオブジェクトを表示。Git オブジェクトはテキストファイルではないが、cat-file コマンドを使えば表示可能。SHA1 ハッシュ値を全て渡してもよいが、初めの 6、7 文字で特定できるため、ここでははじめの 7 文字を利用。
4. ツリーオブジェクトのハッシュ値を含んでいるので、‘git ls-tree 17806763’ を実行してツリーオブジェクトを表示。コミットしたフォルダ構造と同じく、2 つのツリーとブロブオブジェクトを含んでいる。
5. VS_Git ツリーも確認。‘git ls-tree 361e2e7’ を実行した結果から、Program.cs を表示するため、‘git cat-file blob bd87f23’ を実行。
Git レポジトリの削除
Git での管理をやめたい場合は、.git フォルダを削除するだけです。フォルダを削除後、Visual Studio 2017 を再起動します。
レポジトリの作成 : VS
次に Visual Studio 2017 で Git レポジトリを作成してみましょう。
1. Visual Studio 2017 でソリューションを開く。
2. ソリューションを右クリックして、”ソリューションをソース管理に追加” をクリック。VS が .git フォルダが作成。
3. 連携が行われるとソリューションエクスプローラーのアイコンが変化。
4. コマンドプロンプトを開き、ソリューションのディレクトリに移動。’git status’ を実行すると、先ほどと違いコミット対象がないと表示される?
5. ‘git log’ を実行してコミット履歴を確認。すでに 2 つもコミットがあることを確認。はじめのコミットで .gitignore および.gitattributes ファイルを追加。次のコミットですべてのプロジェクトアイテムを追加。
6. フォルダにも .git フォルダ以外に追加のファイルを確認。
7. .gitignore ファイルを開くと、ファイルやフォルダのリストが記載されており、Git では追跡されない。既定で多くのアイテムが記載済。
8. ‘git cat-file commit 2390071’ を実行して最新のコミットに含まれるツリーを確認。
9. ‘git ls-tree cb09f33’ を実行すると .vs フォルダが含まれていないが、これは .vs フォルダが .gitignore に含まれているため。
10. さらに ‘git ls-tree b2dfadc’ を実行。こちらでも obj フォルダが含まれていないことを確認。
まとめ
今回は Visual Studio からソース管理を実行すると、その瞬間に既に複数の Git コマンドが実行されていることや、.gitignore など追加ファイルが作成されることを確認しました。次回はコードの変更を Git で保存する方法についてさらに見ていきます。次の記事へ
リファレンス
Git Basics - Recording Changes to the Repository
中村 憲一郎