gitで重要な3大要素【add&commit編】

本記事はこんな方向けです。

  • gitの仕組みを詳しく知りたい方
  • addやcommitが何をしているか知りたい方
  • ターミナルの操作に慣れたい方

git addやgit commitした際に『圧縮ファイル』『ツリーファイル』『コミットファイル』という3つのファイルが作成されます。

実際にターミナルを使用して、各ファイルの中身をみてみましょう。実際に作業することで、イメージが掴みやすくなるかと思います。

①圧縮ファイルにはファイルの中身の情報しかない!

まずは『圧縮ファイル』の中身がどのようになっているのか確認してみましょう。

圧縮ファイルは『ファイル名』の情報は持っておらず、『ファイルの中身』の情報のみ持ちます。

まずはホームディレクトリ上に『gitsample』というディレクトリ を作成します。その後『cd』コマンドで移動します。

$mkdir gitsample
$cd gitsample

次に『init』コマンドでローカルリポジトリに登録します。

$git init

#実行結果
Initialized empty Git repository in /Users/***/gitsample/.git/

次のコマンドで「Hello, world!」と書かれた『greeting』ファイルを新規作成します。

$echo 'Hello, world!' > greeting

圧縮ファイルのファイル名を知るために『ハッシュ関数』を使用して、取り出してあげます。

下記コマンドを実行すると、何やら暗号のようなものが返ってきました。
これは『ハッシュID』と呼ばれ、ファイルの内容を暗号化したものになっています。

$git hash-object greeting

#実行結果
af5626b4a114abcb82d63db7c8082c3c4756e51b

ハッシュIDの最初の2文字が『ディレクトリ名』、残りがファイル名を表しています。

今度はgit addコマンドで、先程作成した『greeting』ファイルを圧縮してみましょう。

$git add greeting

treeコマンドで『.git』の中身を表示してみましょう。

$tree .git

*treeはMacのHomebrewで扱えるコマンドであり、下記を実行することで使えるようになります。

$brew install tree
.git
(省略)
├── objects
│   ├── af
│   │   └── 5626b4a114abcb82d63db7c8082c3c4756e51b
(省略)

objects配下に先程のハッシュIDがあることが分かります。
このハッシュIDはファイルの内容を変えない限り変更しません。

逆にファイルに追記して、もう一度git addすると別の圧縮ファイルが作成されます。試しに先程の『greeting』ファイルに追記してみましょう。

#ファイルへ追記
$echo "追記したよ" >> greeting

#もう一度git addで圧縮ファイルを作成
$git add greeting

ファイルに追記するときは『echo』コマンドを使います。『>>』を使うと『追記』、『>』だけだと上書きされて、過去に書いていたものは消えてしまうので注意しましょう。

もう一度git add した状態で.gitの中身を確認してみましょう。

$tree .git

#実行結果
.git
(省略)
├── objects
│   ├── 58
│   │   └── a6368c4c9a305c3f2c0261e21da2572b9665d1
│   ├── af
│   │   └── 5626b4a114abcb82d63db7c8082c3c4756e51b
(省略)

そうすると新しい圧縮ファイルが作成されていることが分かります。
このようにファイルの内容を変更すると、新しい圧縮ファイルが作成されるようになっています。

②ツリーファイルでディレクトリ名が分かる!

前章で圧縮ファイルはファイルの中身の情報しか持っておらず、ファイル名の情報はないと説明しました。

どこにファイル名が保存されるのかというと、『ツリーファイル』となります。

ツリーファイルの中身を確認しよう

まずは先程作成したgreetingファイルをコミットしてあげます。

git commit -m 'add greeting'

#実行結果
[master (root-commit) 00590d8] add greeting
 1 file changed, 2 insertions(+)
 create mode 100644 greeting

コミットは下記のようにコミットメッセージを添えることが基本です。

$git commit -m 'コミットメッセージ'
$git cat-file -p master^{tree}

#実行結果
100644 blob 58a6368c4c9a305c3f2c0261e21da2572b9665d1	greeting

『blob』とは圧縮ファイルという意味になります。treeファイルの下にgreetingの圧縮ファイルが存在していることが分かります。

ちなみにgit cat-file -pコマンドはあるブランチのファイルの中身を見たい時に有効で、下記のように使います。

$git cat-file -p ブランチ名^{ファイル名}

新たにディレクトリを作成&コミットするとどうなる?

次にgitsample直下に新たに『others』というディレクトリを作成します。

$mkdir others

othersの下に『goodmorning』というファイルを作成、『Good morining』と記述します。

$echo 'Goodmorning' > others/goodmorning

次にgit addした後にcommitしていきます。

$git add
$git commit -m 'add others'

#実行結果
[master 70b95e3] add others
 1 file changed, 1 insertion(+)
 create mode 100644 others/goodmorning

ではtreeファイルの中身を覗いてみましょう。

$git cat-file -p master^{tree}

#実行結果
100644 blob 58a6368c4c9a305c3f2c0261e21da2572b9665d1	greeting
040000 tree 7f6cbd0319cc15ca962eed9b958ec57d7f929d76	others

treeファイルの中には圧縮ファイル(blob)とtreeが存在していることが分かります。では040000のtreeファイルの中には何があるのでしょうか?

$git cat-file -p 7f6cbd

#実行結果
100644 blob b3ca8ec34c852296021ce4158b48ad1c1b4a8dd6	goodmorning

treeファイルの中には、先程git add & commitした際にできた圧縮ファイルが存在しています。

  • treeファイルの下には圧縮ファイルが存在する
  • 1つのディレクトリに1つのtreeファイルが作成される
  • treeファイルの中に別のtreeファイルを持たせることができる

③コミットファイルにはユーザー情報が保存される!

今度は.gitの中のHEADの中身を見てみましょう。

$git cat-file -p HEAD

#実行結果
#このディレクトリの1番上のtreeファイル
tree 22feb26f59cc66177baa95c5aba361515d1276eb
#親コミット(greetingで追記した際の最初のコミット)
parent 00590d81dcccd5b235447f1df0b4fec101fe5a7b
#作成者情報
author ユーザー名 <> 1605616458 +0900
committer ユーザー名 <> 1605616458 +0900

実はコミットしたユーザーの情報はHEAD内に保存されています。

ちなみに.gitのtreeを見るとHEADがあるのが分かります。

.git
(省略)
├── HEAD
(省略)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です