第149回 Gitの仕組みについて その2(想像)
公開日:2018-09-28 更新日:2019-05-11
1. 概要
Gitのコミット、ブランチ、フェッチなどの仕組みについて説明しています。
大変申し訳ございません。
ダラダラと長くなった挙句、
補足と訂正が動画中に山のように入っており、大変見づらくなっております。
まだ他にも間違いがあるかもしれません。
また、何度も念仏のように同じ説明を繰り返しています。。。
大変申し訳ございません。
ダラダラと長くなった挙句、
補足と訂正が動画中に山のように入っており、大変見づらくなっております。
まだ他にも間違いがあるかもしれません。
また、何度も念仏のように同じ説明を繰り返しています。。。
2. 動画
3. 補足
1. ハッシュ値について
コミット、ファイル一覧(tree)、ファイル本体(blob) は、
ハッシュ値をファイル名として objects 配下に保存されます。
ファイルを1つだけ追加してコミットをすると、
objects 配下に、以下3つのファイルが作成されます。
・コミット
・ファイル一覧(tree)
・ファイル本体(blob)
ファイル本体の内容が同じであれば、同じハッシュ値が算出されるのと同様に、
ファイル一覧(tree)も内容が同じであれば、同じハッシュ値が算出されます。
このように、Git ではハッシュ値でファイルなどを管理することにより、
同じものを共有化して、ディスク容量の削減を行っています。
また、ファイル名をハッシュ値にしているため、
過去のファイルを改ざんした場合、改ざんしたのがわかるようになっています。
ハッシュ値をファイル名として objects 配下に保存されます。
ファイルを1つだけ追加してコミットをすると、
objects 配下に、以下3つのファイルが作成されます。
・コミット
・ファイル一覧(tree)
・ファイル本体(blob)
ファイル本体の内容が同じであれば、同じハッシュ値が算出されるのと同様に、
ファイル一覧(tree)も内容が同じであれば、同じハッシュ値が算出されます。
このように、Git ではハッシュ値でファイルなどを管理することにより、
同じものを共有化して、ディスク容量の削減を行っています。
また、ファイル名をハッシュ値にしているため、
過去のファイルを改ざんした場合、改ざんしたのがわかるようになっています。
2. リモートリポジトリのブランチについて
フェッチをすると、objects 配下にリモートリポジトリのファイルがコピーされ、
「remotes/origin/ブランチ名」と言う特殊なブランチに、
リモート側の同じブランチの、最新のコミットID が設定されます。
そのため、この特殊なブランチに切り替えると、リモートと同じ内容になります。
切り替わっているのは、あくまでもローカル内で、
直接リモート側に切り替わっている訳ではありません。
変更してもすぐにリモートには反映されません。
「remotes/origin/ブランチ名」と言う特殊なブランチに、
リモート側の同じブランチの、最新のコミットID が設定されます。
そのため、この特殊なブランチに切り替えると、リモートと同じ内容になります。
切り替わっているのは、あくまでもローカル内で、
直接リモート側に切り替わっている訳ではありません。
変更してもすぐにリモートには反映されません。
3. FETCH_HEAD、「remotes/origin/ブランチ名」の特殊なブランチについて
通常のブランチはコミットをすると、
コミットにより生成された新しいコミットID(ハッシュ値)を自動的に参照してくれますが、
FETCH_HEAD や「remotes/origin/ブランチ名」は、
フェッチをした時点のコミットIDで固定されます。
そのため、FETCH_HEAD などに切り替えて、その後コミットをしても、
FETCH_HEAD が指すコミットIDが変更されないため、ブランチの作成を促されます。
もしブランチを作成しない場合は、参照できないコミットが作成されます。
(コミットIDを覚えておけば利用できます)
コミットにより生成された新しいコミットID(ハッシュ値)を自動的に参照してくれますが、
FETCH_HEAD や「remotes/origin/ブランチ名」は、
フェッチをした時点のコミットIDで固定されます。
そのため、FETCH_HEAD などに切り替えて、その後コミットをしても、
FETCH_HEAD が指すコミットIDが変更されないため、ブランチの作成を促されます。
もしブランチを作成しない場合は、参照できないコミットが作成されます。
(コミットIDを覚えておけば利用できます)
4. ブランチと切り替えについて
ブランチは、コミットIDを保持しているだけです。
例えば、フェッチをして FETCH_HEAD に切り替えれば、
リモートと同じ内容を見ることができますが、
フェッチ後にリモート側のコミットIDを直接指定して切り替えれば、
FETCH_HEAD と同様に、リモート側と同じ内容を見ることができます。
例えば、フェッチをして FETCH_HEAD に切り替えれば、
リモートと同じ内容を見ることができますが、
フェッチ後にリモート側のコミットIDを直接指定して切り替えれば、
FETCH_HEAD と同様に、リモート側と同じ内容を見ることができます。