みの雑多ブログ

勉強したことをアウトプットしたり、しなかったり

Gitの基礎の基礎を学んだのでそれをアウトプット② ~コミット仕組み

今回もGitの基礎の基礎をクイズ形式でアウトプット

GitHubにはどんな流れでアップするの?(イメージの話!!)

イメージはこんな感じだそう。
f:id:yamami78651:20200831231741p:plain

これは使ってると何となく、わかる。
コミットでワークツリーからローカルリポジトリ
プッシュでGitHubリポジトリ

プルして、ローカルリポジトリ→ワークツリー

GitHubにアップするまでのローカルリポジトリでは、どんな流れでアップしているの?(イメージの話!!)

ローカルにフォーカスしたイメージ図
f:id:yamami78651:20200901000046p:plain

soucetreeを普段使ってて、理解してなかった!
3層・・・なんやて・・・
いつも、soucetreeでファイルステータスタブで上下にポチポチしていた裏側でこんなことされてたとは・・・
GUIに頼って機能を理解していない代表みたいなことをしてた。
git addでステージにあげてから、git commitでローカルリポジトリにアップするというのがローカルでアップするときの流れ

なぜステージがあるの?

前回のブログで言った通り、Gitは差分ではなく変更ファイルのスナップショットでバージョン管理している。
無造作にスナップショットをボコボコ作るのは望ましくない。(肥大化?)
ローカルリポジトリにあげたいファイルだけを選別するにもステージは必要。
SVNでも、ローカルで変更したファイル全部コミットはしないよね、って言うのと同じ理由の部分もあれば
スナップショットで管理してるからこそ、無闇やたらにファイルをアップさせない仕組みっていう詳細としてはGitならではの理由

ローカルリポジトリへcommitまでに裏ではどんな動きをしているの?

厳密には違うそうだが、イメージはこんな感じとのこと。 (めんどくさいので、文字で)
ステージでは、インデックス(圧縮されたファイルとインデックス)を管理。
ローカルリポジトリでは、圧縮ファイルとツリー(圧縮ファイル)とコミット(ツリーインデックス、作成者、日付、コミットメッセージ、親コミット)を管理。

ワークツリーでファイルAを追加

git addでステージにあげ
ステージにあるインデックスの領域に「圧縮ファイルAとインデックスA」を保存

git commitでローカルリポジトリにあげ
ローカルリポジトリに「圧縮ファイルA」と「ツリー1」、「コミット1」を保存


ワークツリーでファイルBを追加

git addでファイルBをステージにあげ
ステージにあるインデックスの領域に「圧縮ファイルBとインデックスB」を保存

git commitでローカルリポジトリにあげ
ローカルリポジトリに「圧縮ファイルB」と「ツリー2(圧縮ファイルAと圧縮ファイルB)」、「コミット2(親コミットにコミット1)」を保存


ワークツリーでファイルAを変更

git addでステージにあげ
ステージにあるインデックス領域に「インデックスAの圧縮ファイルをAからC」に変更

git commitでローカルリポジトリにあげ
ローカルリポジトリに「圧縮ファイルC」と「ツリー3(圧縮ファイルCと圧縮ファイルB)」、「コミット3(親コミットにコミット2)」を保存