こんにちは、ECF Techブログ
担当 Michiです。
今回は前回までの内容を元にGitの舞台裏をのぞいてみたいと思います。コマンドラインなどにさりげなく出てきたHEADや first-forwardなどの理解につながるものです。
ポインタと呼ばれる非プログラマやプログラミング初学者の方には戸惑う方も多い内容ですが、Gitの見通しがとても良くなる重要な知識ですので、なるべくわかりやすくお伝えしたいと思います。よろしくお願いします。
対象読者
- コマンドプロンプト上でのコマンドである
cd
やdir
を使ったことがある - エクスプローラでファイル操作ができる
- gitのクローンやコミットをやったことがある
※なお、本資料はWindows向けの資料となっています。
オブジェクトとポインタ
プログラミングでも多く登場する2つの言葉「オブジェクト(Object)」と「ポインタ(Pointer)」が、Gitにも登場します。誤解を恐れず、2つの言葉をとても端的に表すならば・・・
- オブジェクト ・・・ 情報のカタマリ
- ポインタ・・・・・ オブジェクトを指し示すもの
です。
Gitはコミットを行なうたびに、その時のファイルの記録をオブジェクトにします。作られたオブジェクトは、あとから識別できるように重複しない名前(以降、IDと呼称)をつけます。
Gitの記録のしくみをみてみよう
前提知識はまずはこれくらいで良いでしょう。ここからは、スタート編およびブランチ編で行なった動作を振り返りながら、Gitの内部を見ていきたいと思います。
まずはgit log
コマンドを使って、これまでのログを確認してみましょう。次のようになっています。ログは下にいくほど古い記録になります。
※赤い囲み部分はIDです。
では、このログを時間を追ってみてみましょう。
最初に行なったのは、GitHub上で行ったReadMeの作成です。このコミットによりリポジトリは次のようになります。
※上の図を含めた以降の図では、次の表記を用います。
- 青い○:コミットオブジェクト
- 青英数字:IDの省略表記
- 黒字:コミット時コメント
- 赤吹き出し:ブランチ(ポインタ)
上の注記で示したように、ブランチこそがGitにおけるポインタです。masterとorigin/masterというブランチがあります。originがついているほうはリモートリポジトリ側のブランチを指します。
では、さらに時間を追ってみていきましょう。
次はprogram01.txtというプログラムを作成し、機能Aを追加しました。このコミットにより、図は次のようになります。
まだリモートリポジトリにpushしていないため、origin/masterは最初の位置のままです。
次です。次はprogram01.txtに機能Bを追加し、さらにprogram02.txtを作成して表示機能Aを作りました。このコミットで次のようになります。
この時点でリモートリポジトリへのpushを行ないましたので、図のようになります。origin/masterが進んでいることがわかります。
次はブランチを作成しました。onlyAというブランチを作成し、機能A-2を追加してコミットしています。
新しいブランチができたので、吹き出しが追加されています。
ここで注目すべきはonlyAは枝分かれしているわけではない点です。onlyAが指すコミットは、前回コミットから少し変更が加わっただけにすぎません。したがってgitは、この新しいコミットは前回のコミットからの続きである。という形で履歴を記録します。
onlyブランチはその1本につながった履歴の1番先頭のコミットを指しているだけです。
さらにonlyAブランチで機能A-3を追加しコミットしました(下図)。
最後にonlyAブランチをmasterブランチにマージしました。マージ後のリポジトリは次の状態です。
直前の図とほとんど変化がありません。masterブランチの指す先が変わっただけです。
今回はマージといっても、マージ先のmasterブランチに元々別の変更があったわけではありません。したがって、masterブランチが指す先をonlyAブランチが指しているオブジェクトと同じにしてしまえば、マージ完了と同じ意味になるのです。
このようにブランチ(ポインタ)の位置を先へ進めるだけでマージが完了してしまう場合、実行結果にFirst Forwardと表示されます。「先に進めた」という意味合いです。
最後にリモートリポジトリへのコミットをすることで、すべてのブランチ(ポインタ)が最新のコミットオブジェクトを指し示します(下図)
さらに上の図には、HEADとorigin/HEADいうポインタがついています。(※本記事の最初のgit log
による結果の画面でも確認できます。)
これはローカルおよびリモートリポジトリそれぞれにおいて、現在操作対象となっているブランチを指すものです。
おわりに
本日はここまでとさせていただきます。最後までご覧くださり、ありがとうございました。Gitにおけるオブジェクトとポインタの概念が理解できると、Gitをより効果的に活用できると思います。
これらをマスターしてGitライフを楽しみましょう。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。