はじめに
gitのコマンドの動作について内部動作まで理解しよう!って記事です。
はじめに以下の記事を読んでいただくと理解が深まると思います。
今回のコマンド
- add
- commit
- push
- pull
- fetch
- branch
git add
内部動作
1. ファイルの内容からハッシュ値を計算
- ファイルの内容やヘッダー情報に基づいて、SHA-1ハッシュ値を生成
2. .git/objects/ディレクトリ
にblobオブジェクト
を作成
- 計算されたハッシュ値を基にファイルを作成しオブジェクトを保存
3. インデックスファイル(.git/index)を更新
- ステージングエリアの状態を記録
- ファイルのパス、モード、blobオブジェクトへの参照を保存
git commit
内部動作
1. ツリーオブジェクトの作成
- コミット時、Gitはステージングエリア(インデックス)の内容から、ディレクトリ構造を表現するtreeオブジェクトを作成
2. コミットオブジェクトの生成
- コミットメッセージ、作成者情報、タイムスタンプ、親コミットへの参照を含むcommitオブジェクトを作成
- 最新のコミットのハッシュ値を.git/HEADに保存
3. ブランチポインターの更新
- 現在のブランチ(例:main)のポインターを、新しいコミットオブジェクトに更新
git push
内部動作
1. ローカルブランチの変更を検出
- ローカルリポジトリの最新のコミットを特定
- リモートリポジトリとの差分を確認
2. オブジェクトの転送
- ローカルにある未送信のコミット、ツリー、blobオブジェクトをリモートリポジトリに転送
- パックファイル(圧縮されたオブジェクト群)を作成して効率的に転送
3. 参照の更新
- リモートブランチの参照(ref)を更新
- .git/refs/remotes/配下のファイルを更新
git pull
内部動作
1. リモートリポジトリの変更をフェッチ
- リモートリポジトリの最新の変更を取得
- git fetch相当の処理を実行
2. マージの実行
- ローカルブランチとリモートブランチの差分を自動的にマージ
- 競合がある場合は手動での解決が必要
3. ワーキングディレクトリの更新
- マージ結果をワーキングディレクトリに適用
- インデックスファイルを更新
git fetch
内部動作
1. リモートリポジトリの変更をダウンロード
- リモートリポジトリの最新のオブジェクトとref情報を取得
- ローカルリポジトリのオブジェクトデータベースを更新
2. リモート追跡ブランチの更新
- origin/mainのような追跡ブランチを更新
- ローカルブランチは変更しない
3. パックファイルの処理
- 効率的なデータ転送のためパックファイルをダウンロード
- オブジェクトを展開し、ローカルリポジトリに保存
git branch
内部動作
1. ブランチ情報の管理
- .git/refs/heads/ディレクトリ配下にブランチ情報を保存
- 各ブランチファイルには、そのブランチの最新コミットのハッシュ値が記録される
2. ブランチ作成
- 現在のHEADが指すコミットを参照点としてブランチを作成
- 新しいブランチファイルを作成し、同じコミットハッシュ値を設定
3. ブランチリスト表示
- .git/refs/heads/配下のファイルを読み取り、ブランチ一覧を表示
まとめ
今回はGitの基本的なコマンドがどのようになっているかをまとめてみました。今後も他のコマンドについてまとめる予定です。
Gitの理解に少しでも貢献できると幸いです。