remote リポジトリとの共有

INPUT · スライド

remote repository との共有

01 / 11

local 環境からチーム開発へのステップ

第2章までの操作は、すべてあなたの local 環境(端末内)で完結していました。commit の記録も、branch の分岐も、merge もすべて local repository 内の出来事です。

しかし実際の開発現場では、複数人のチームで共同してコードを開発します。また、端末の故障や紛失に備えたバックアップも不可欠です。

そこで登場するのが、ネットワーク上で共有されるremote repositoryです。

02 / 11

remote repository は「共有されたもう1つの repository」

初心者が最も誤解しやすいポイントですが、remote repository は local repository と基本的に同じ構造(commit 履歴と branch)を持った Git repositoryです。

唯一の違いは配置されている場所です。GitHub や GitLab などのクラウドホスティングサービス上や社内サーバー上にホストされ、メンバー全員からアクセスできるようになっています。

「remote も同じ Git repository である」という原則を理解すると、同期の仕組みが明快になります。

03 / 11

4つの主要領域の全体像

画面下の図を確認してください。Git の世界は4つの領域で構成されます。

  • working tree … いま編集している作業ファイル
  • stage(index) … 次の commit に含める変更
  • local repository … あなたの端末内の commit 履歴
  • remote repository … 共有サーバー(origin)上の commit 履歴

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

git push — local の commit を remote へ送信する

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 -> main

06 / 11

remote 追跡 branch(origin/main)

local の commit graph を確認すると、origin/main というラベルが表示されています。

これはremote 追跡 branchと呼ばれ、「最後に remote と通信した時点で、remote の main branch がどの commit を指していたか」を local にキャッシュして記録しているポインタです。

remote repository 本体そのものではなく、「local にある remote 状態の控え」です。この仕組みを理解すると、fetch と pull の違いが明確になります。

07 / 11

git fetch — remote の最新情報を取得する

git fetch は、remote repository にある新しい commit をlocal に取得(ダウンロード)するだけのコマンドです。

local の作業 branch(main)は一切進みません。前進するのは origin/main(remote 追跡 branch)のポインタのみです。

「remote で何が更新されたかを確認し、自分の作業 branch に merge するかどうかを後から判断したい」場合に極めて安全なコマンドです。

$ git fetchFrom origin   main -> origin/main

08 / 11

git pull — 取得して現在の branch に merge する

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-forward

09 / 11

push が拒否(rejected)される原因

チーム開発で必ず遭遇するのが、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 拒否時の解決手順(pull してから push)

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 差分を正確に教えてくれます。