01 / 11
local 環境からチーム開発へのステップ
第2章までの操作は、すべてあなたの local 環境(端末内)で完結していました。commit の記録も、branch の分岐も、merge もすべて local repository 内の出来事です。
しかし実際の開発現場では、複数人のチームで共同してコードを開発します。また、端末の故障や紛失に備えたバックアップも不可欠です。
そこで登場するのが、ネットワーク上で共有されるremote repositoryです。
remote リポジトリとの共有
INPUT · スライド
01 / 11
第2章までの操作は、すべてあなたの local 環境(端末内)で完結していました。commit の記録も、branch の分岐も、merge もすべて local repository 内の出来事です。
しかし実際の開発現場では、複数人のチームで共同してコードを開発します。また、端末の故障や紛失に備えたバックアップも不可欠です。
そこで登場するのが、ネットワーク上で共有されるremote repositoryです。
02 / 11
初心者が最も誤解しやすいポイントですが、remote repository は local repository と基本的に同じ構造(commit 履歴と branch)を持った Git repositoryです。
唯一の違いは配置されている場所です。GitHub や GitLab などのクラウドホスティングサービス上や社内サーバー上にホストされ、メンバー全員からアクセスできるようになっています。
「remote も同じ Git repository である」という原則を理解すると、同期の仕組みが明快になります。
03 / 11
画面下の図を確認してください。Git の世界は4つの領域で構成されます。
git add と git commit が local 内の 1→2→3 へ変更を運ぶ道具であるのに対し、git push と git pull はlocal(3)と remote(4)の間で commit を同期する道具です。
04 / 11
remote 共有の学習には「他者の変更」が不可欠です。相手がいない環境では、共同開発特有の push 競合や同期を体験できません。
そこで本コースでは、演習画面上部のタブから開発者Bの作業環境に切り替えられるよう設計されています。
席を切り替えると、working tree・stage・local repository の3領域が開発者Bの環境にまるごと入れ替わります。中央の remote repository(origin)は共通であり、双方がここへ push し、ここから pull します。
演習の合否判定は常にあなたの環境(開発者A)の最終状態を評価します。B側で作業した後は、必ずA側の席に戻って同期操作を完了させてください。
05 / 11
local repository の新しい commit を remote repository へ送信して反映するのが git push です。
送信されるのはcommit そのものです。push が成功すると、remote repository 側にも同じハッシュ値を持つ commit が追加されます。
重要なのはcommit されていない変更は push できないという点です。git add と git commit で local repository に保存して初めて、push の対象になります。
$ git pushTo origin main -> main06 / 11
local の commit graph を確認すると、origin/main というラベルが表示されています。
これはremote 追跡 branchと呼ばれ、「最後に remote と通信した時点で、remote の main branch がどの commit を指していたか」を local にキャッシュして記録しているポインタです。
remote repository 本体そのものではなく、「local にある remote 状態の控え」です。この仕組みを理解すると、fetch と pull の違いが明確になります。
07 / 11
git fetch は、remote repository にある新しい commit をlocal に取得(ダウンロード)するだけのコマンドです。
local の作業 branch(main)は一切進みません。前進するのは origin/main(remote 追跡 branch)のポインタのみです。
「remote で何が更新されたかを確認し、自分の作業 branch に merge するかどうかを後から判断したい」場合に極めて安全なコマンドです。
$ git fetchFrom origin main -> origin/main08 / 11
git pull は、内部的に git fetch と git merge を連続して実行する複合コマンドです。
1. remote の最新 commit を取得する(fetch)
2. 取得した remote 追跡 branch(origin/main)を現在チェックアウトしている branch に merge する(merge)
そのため、第2章で学んだFast-forward mergeやmerge commit の生成、conflictがそのまま発生します。新しく覚える merge 規則はなく、第2章の知識がそのまま適用されます。
$ git pullFrom origin main -> origin/mainUpdating 3b7e5d1..9f2a1c4Fast-forward09 / 11
チーム開発で必ず遭遇するのが、push の拒否エラーです。
remote repository に、あなたの local がまだ取り込んでいない未知の commit が存在する場合、Git は push を拒否します。
もしそのまま push を許可してしまうと、他の開発者が push した commit を上書きして消去してしまう危険があるためです。Git の安全保護機能が働いている状態です。
$ git push! [rejected] main -> main (fetch first)error: failed to push some refs to 'origin'10 / 11
push が拒否された場合の解決手順は決まっています:
1. git pull を実行して remote の最新 commit を local へ merge する
2. (conflict が発生した場合はファイルを編集して解消し、git add & git commit)
3. local に remote の変更が統合された状態で、再度 git push を実行する
「pull してから push」。この原則を守れば、チーム開発での push 衝突を安全に解消できます。
エラーメッセージに (fetch first) と表示されるのもこの手順を促しているためです。
11 / 11
ここからは実際にコマンドを実行して学びます。
画面にはlocal repository と remote repository の両方の commit 履歴が表示されています。各コマンド実行時にどの commit が増え、どの branch ポインタが動くかに注目してください。
状態の確認にはいつでも git status を使いましょう。Your branch is ahead of 'origin/main' by 1 commit. のように、remote との commit 差分を正確に教えてくれます。