Git の操作の実体
この章では、前編で行ってきた VSCode 上のボタン操作の裏でどんな処理がなされていたのかを解説し fetch
や pull
といったコマンドとの関係性を明らかにします。
大抵の開発ではこれらの操作の細かい意味合いはあまり強く意識されず、それを深く理解していなくても Git を開発に役立てることは十分に可能です。とはいえ、これらは Git の最も基本的な操作とされていて、その役割を把握していなければ解決が難しい問題に遭遇することも稀ではないので、以降の内容をなんとなくでも把握しておくことをおすすめします。
ブランチ内での操作
以下の図は 1 本のブランチ(ここでは main という名前のブランチ)に関する操作の一覧です。
全体が同期するので 1 本と見なすことが一般的ですが、実際には
- リモートブランチ
- リモート追跡ブランチ
- 作業ブランチ
の 3 本が束になっています。リモートブランチは Gitea のサーバー上にあり、他の 2 本はローカル(お使いのデバイスの中)にあります。
リモート追跡ブランチはブランチではない
紛らわしいですが、厳密にはリモート追跡ブランチはブランチではありません。リモート追跡ブランチは「リモートブランチのスナップショット」に過ぎず、fetch
以外の更新操作を受け付けません。ローカル環境におけるリモートブランチの代役という認識でよいと思います。
上図における各操作の意味は以下の通りです。
操作 | 意味 |
---|---|
clone | リモートからコピーして、ローカルにリモート追跡ブランチと作業ブランチを用意する |
fetch | リモート追跡ブランチを現在のリモートブランチと同じ状態にする |
merge | リモート追跡ブランチの変更を作業ブランチに反映する |
commit | 作業ブランチに変更を加えること |
pull | fetch + merge |
push | 作業ブランチの変更をリモートブランチに反映する |
前編でターミナル及び VSCode 上で行った操作との対応は以下のようになります。
操作 | Git コマンド |
---|---|
コマンド git clone {リポジトリの URL} の実行 | clone |
デスクトップの mydrive で README.md を編集して「コミット」ボタンを押す | commit |
デスクトップの mydrive で「変更を同期 ↑1」ボタンを押す | push |
ダウンロードの mydrive で「変更の同期 ↓1」ボタンを押す | pull |
コミット ≠ ファイルの編集
commit の説明として「作業ブランチに変更を加えること」と書きましたが、上記の対応から分かるように、ただ単に作業ディレクトリのファイルの内容を編集するだけでは commit にはなりません。ファイルの変更をステージし、明示的にコミットして初めてブランチが伸びます。
日頃の開発で「ブランチにコミットする」という言葉を聞いたら、通常は以下の一連の操作を指すと思ってよいでしょう。
- 開発途中のブランチの最新状態をリモートから pull してくる
- ファイルの中身を変更し、作業ブランチに commit する
- 作業ブランチの変更を push してリモートブランチに反映させる
1 と 3 は結局のところ「リモートとローカルを同期する」ための操作です。「ブランチへのコミット」という操作は「同期 → 作業ブランチへのコミット → 同期」という 3 段階によってリモートとローカルの両方に同じ変更を加えることを意味しています。
VSCodeの「変更の同期」ボタン
表では「変更の同期 1↑」ボタンと「変更の同期 1↓」ボタンが別物であるかのような書き方をしましたが、両方ともやっていることは同じで「pull + push」をしている、と統一して考えることもできます。リモートブランチに変更がなければ pull をしても何も起こらず、逆に作業ブランチに変更がなければ push をしても何も起こらないからです。