Gitでバージョン管理されたプロジェクトを扱うと、必ず .git
というディレクトリがあります。
このディレクトリを使ってGitがバージョン管理をしているらしい、ということはなんとなく知っています。でも、具体的になにが入っていて、どう管理されているんだろう?
このアドベントカレンダーは、そんな疑問からGitを深堀りしていきます。
.git
の中身を見てみる2(git add
)
昨日は git init
だけしたときの .git
ディレクトリの中身を確認しました。
本日は、差分を作ってみます。
ファイルを作るとどうなるか?
まず、作業前後でディレクトリの中身を比較したいので、作業前にディレクトリごとコピーを取ります。
$ cp -pr ../git-study ../git-study-before-create-file # 作業前ディレクトリをコピー(カレントディレクトリは `git-study` 直下)
$ ls -ld ../git-study* # コピー後確認
drwxr-xr-x 1 user group 18 12月 2 22:13 ../git-study
drwxr-xr-x 1 user group 8 12月 1 15:38 ../git-study-before-create-file
$
新規ファイルを作成します。
$ ls -l # ファイル作成前確認
合計 0
$ touch a.txt # ファイル作成
$ ls -l # ファイル作成後確認
合計 0
-rw-r--r-- 1 user group 0 12月 2 22:13 a.txt
$ git status # ステータスを確認する
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
a.txt
nothing added to commit but untracked files present (use "git add" to track)
$
.git
ディレクトリ内を比較してみます。すると、差分はありませんでした。
$ diff .git ../git-study-before-create-file/.git
共通のサブディレクトリー: .git/branches と ../git-study-before-create-file/.git/branches
共通のサブディレクトリー: .git/gitweb と ../git-study-before-create-file/.git/gitweb
共通のサブディレクトリー: .git/hooks と ../git-study-before-create-file/.git/hooks
共通のサブディレクトリー: .git/info と ../git-study-before-create-file/.git/info
共通のサブディレクトリー: .git/objects と ../git-study-before-create-file/.git/objects
共通のサブディレクトリー: .git/refs と ../git-study-before-create-file/.git/refs
$
git add
するとどうなるか?
では、先ほどを同じように作業前にディレクトリごとコピーを取ります。
$ cp -pr ../git-study ../git-study-before-add # 作業前ディレクトリをコピー(カレントディレクトリは `git-study` 直下)
$ ls -ld ../git-study* # コピー後確認
drwxr-xr-x 1 user group 18 12月 2 22:13 ../git-study
drwxr-xr-x 1 user group 18 12月 2 22:13 ../git-study-before-add
drwxr-xr-x 1 user group 8 12月 1 15:38 ../git-study-before-create-file
$
差分になっていた a.txt
をGitのインデックスに追加する。
$ git add a.txt # インデックスに差分を追加する
$ git status # ステータスを確認する
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: a.txt
$
比較すると差分が発生しました。
$ diff .git ../git-study-before-add/.git
共通のサブディレクトリー: .git/branches と ../git-study-before-add/.git/branches
共通のサブディレクトリー: .git/gitweb と ../git-study-before-add/.git/gitweb
共通のサブディレクトリー: .git/hooks と ../git-study-before-add/.git/hooks
.git のみに存在: index
共通のサブディレクトリー: .git/info と ../git-study-before-add/.git/info
共通のサブディレクトリー: .git/objects と ../git-study-before-add/.git/objects
共通のサブディレクトリー: .git/refs と ../git-study-before-add/.git/refs
$ cat .git/index
DIRCgMf
`gMf
`5%EI⛲CK)wZSa.txtsT}ss:YE$
ちょっと人がよめないタイプのログが出てきました。
今日はここまで。
参考書籍・参考資料
- エンジニアのためのGitの教科書[上級編] Git内部の仕組みを理解する
- git 公式ドキュメント