第149回 Gitの仕組みについて その2(想像)

公開日:2018-09-28 更新日:2019-05-11

1. 概要

Gitのコミット、ブランチ、フェッチなどの仕組みについて説明しています。

大変申し訳ございません。
ダラダラと長くなった挙句、
補足と訂正が動画中に山のように入っており、大変見づらくなっております。
まだ他にも間違いがあるかもしれません。
また、何度も念仏のように同じ説明を繰り返しています。。。

2. 動画



3. 補足

1. ハッシュ値について

コミット、ファイル一覧(tree)、ファイル本体(blob) は、
ハッシュ値をファイル名として objects 配下に保存されます。

ファイルを1つだけ追加してコミットをすると、
objects 配下に、以下3つのファイルが作成されます。
・コミット
・ファイル一覧(tree)
・ファイル本体(blob)

ファイル本体の内容が同じであれば、同じハッシュ値が算出されるのと同様に、
ファイル一覧(tree)も内容が同じであれば、同じハッシュ値が算出されます。
このように、Git ではハッシュ値でファイルなどを管理することにより、
同じものを共有化して、ディスク容量の削減を行っています。

また、ファイル名をハッシュ値にしているため、
過去のファイルを改ざんした場合、改ざんしたのがわかるようになっています。

2. リモートリポジトリのブランチについて

フェッチをすると、objects 配下にリモートリポジトリのファイルがコピーされ、
「remotes/origin/ブランチ名」と言う特殊なブランチに、
リモート側の同じブランチの、最新のコミットID が設定されます。

そのため、この特殊なブランチに切り替えると、リモートと同じ内容になります。
切り替わっているのは、あくまでもローカル内で、
直接リモート側に切り替わっている訳ではありません。
変更してもすぐにリモートには反映されません。

3. FETCH_HEAD、「remotes/origin/ブランチ名」の特殊なブランチについて

通常のブランチはコミットをすると、
コミットにより生成された新しいコミットID(ハッシュ値)を自動的に参照してくれますが、
FETCH_HEAD や「remotes/origin/ブランチ名」は、
フェッチをした時点のコミットIDで固定されます。

そのため、FETCH_HEAD などに切り替えて、その後コミットをしても、
FETCH_HEAD が指すコミットIDが変更されないため、ブランチの作成を促されます。
もしブランチを作成しない場合は、参照できないコミットが作成されます。
(コミットIDを覚えておけば利用できます)

4. ブランチと切り替えについて

ブランチは、コミットIDを保持しているだけです。

例えば、フェッチをして FETCH_HEAD に切り替えれば、
リモートと同じ内容を見ることができますが、
フェッチ後にリモート側のコミットIDを直接指定して切り替えれば、
FETCH_HEAD と同様に、リモート側と同じ内容を見ることができます。