Git の操作の実体
この章では、前編で行ってきた VSCode 上のボタン操作の裏でどんな処理がなされていたのかを解説し git fetch
や git pull
といったコマンドとの関係を明らかにします。
ブランチ内での操作
以下の図は 1 本のブランチ(ここでは main という名前のブランチ)に関する操作の一覧です。
全体が同期するので 1 本と見なすことが一般的ですが、実際には
- リモートブランチ
- リモート追跡ブランチ
- 作業ブランチ
の 3 本が束になっています。リモートブランチは Gitea のサーバー上にあり、他の 2 本はローカル(お使いのデバイスの中)にあります。
リモート追跡ブランチはブランチではない
リモート追跡ブランチは Git のシステムにおいて通常のブランチと同等なものではありません。リモート追跡ブランチは「リモートブランチのスナップショット」に過ぎず、fetch 以外の更新操作を受け付けません。ローカル環境におけるリモートブランチの代役という認識でよいと思います。
上図における各操作の意味は以下の通りです。
Git 操作 | 意味 |
---|---|
clone | リモートからコピーして、ローカルにリモート追跡ブランチと作業ブランチを用意する |
fetch | リモート追跡ブランチを現在のリモートブランチと同じ状態にする |
merge | リモート追跡ブランチの変更を作業ブランチに反映する |
commit | 作業ブランチに変更を記録する |
pull | fetch + merge |
push | 作業ブランチの変更をリモートブランチに反映する |
前編でターミナル及び VSCode 上で行った操作との対応は以下のようになります。
ターミナル & VSCode 上での操作 | Git 操作 |
---|---|
コマンド git clone ssh://から始まる文字列 の実行 | clone |
Desktop の mydrive で README.md を編集して「コミット」ボタンを押す | commit |
Desktop の mydrive で「変更を同期 ↑1」ボタンを押す | push |
Downloads の mydrive で「変更の同期 ↓1」ボタンを押す | merge |
この表には fetch が含まれていませんが、必要なツール の章で Autofetch 設定を true
にしたことで作業ブランチへの fetch 操作が 180 秒おきに自動で行われるようになっています。コミットと同期 の章で Downloads の mydrive を開いてすぐ「コミット」ボタンが勝手に「変更の同期 1↓」ボタンに変化したのは、この Autofetch が働いたからです。
ターミナルから Git を操作する
CLI と GUI の章で紹介したように、Git は CLI ソフトウェアなので Git リポジトリの操作は全てターミナル上で行うことができ、そしてそれが本来想定されていた使い方だったりします。リポジトリの作成 および コミットと同期 で行ってきた全ての操作は以下のコマンド列で再現することができます。
# 1. Desktop ディレクトリと Downloads ディレクトリにリポジトリをクローン
cd ~/Desktop
git clone ssh://から始まる文字列
cd ~/Downloads
git clone ssh://から始まる文字列
# 2. Desktop ディレクトリの mydrive の README.md に nano で変更を加える
cd ~/Desktop/mydrive
nano README.md
# 3. 変更をコミット・プッシュする
git add README.md
git commit -m "README.md 更新"
git push origin main
# 4. Downloads ディレクトリの mydrive で変更をプルする
cd ~/Downloads/mydrive
git pull origin main
途中で登場する nano はターミナル上で動作するテキストエディタです。プログラミング基礎講習会第 1 章の練習問題 にも登場していますね。Ctrl
+ X
の同時押しでエディタの終了操作、そこで y
に続いて Enter
を押すことで変更の保存ができます。
日頃の開発で「ブランチにコミットする」という言葉を聞いたら、通常は以下の一連の操作を指すと思ってよいでしょう。
- 開発途中のブランチの最新状態をリモートから pull (fetch + merge) してくる
- ファイルの中身を変更し、作業ブランチに commit する
- 作業ブランチの変更を push してリモートブランチに反映させる
1 と 3 は結局のところ「リモートとローカルを同期する」ための操作です。「ブランチへのコミット」という操作は「同期 → 作業ブランチへのコミット → 同期」という 3 段階によってリモートとローカルの両方に同じ変更を加えることを意味しています。
#event/workshop/git/exercise の『前編完走』にスタンプをつけよう!