🐧 Linux 総合学習プラットフォーム
Git バージョン管理 ・ 中級

リモートと同期(remote / push / pull)

手元のリポジトリと、GitHubなどサーバー上のリポジトリ(リモート)をやり取りすると、他の人と変更を共有できます。リモートの登録状況は git remote で確認し、手元のコミットを送り出すのが git push、サーバー側の変更を取り込むのが git pull です。一般に既定のリモートは origin という名前で登録されます。チーム開発では push の前に pull で最新を取り込む流れが基本になります。

ここまでは自分のPCの中だけ(ローカル)の操作だった。だが、もしこのPCが壊れたら、積み上げた履歴は失われてしまう。

そこで登場するのがリモート(git-remote)リポジトリだ。これを使うと別のサーバー上に履歴を置けるようになる。代表的なのが GitHub などのサービスだ。

💡
ポイントリモートは別のサーバー上に履歴を置く仕組み。PCが壊れても履歴を失わないバックアップになり、他人との共同作業もできる。

リモートにコミットを置くことで、PCが壊れても履歴を失わないバックアップになる。さらに、他の人と同じリポジトリを共有して共同作業もできる。

最初に押さえておきたいのは、リモートは必須ではないということだ。「戻せる・履歴が残る・枝を分けて試せる」という Git の利点は、すべてローカルだけで手に入る。

リモートは「他の場所にも置きたい」「他人と共有したい」となったときに足せばよい、追加の仕組みだと考えてほしい。まずローカルでコミットに慣れ、必要になったらリモートを使い始める、という順番が分かりやすい。

ローカル手元の .gitリモート(origin)GitHub などのサーバーgit push(送り出す)git pull(取り込む)向きの違う2つの操作で、手元とサーバーをやり取りする

📮 送り先を登録する git remote

手元のリポジトリに対して、変更を送ったり受け取ったりする相手のサーバーを登録するのが git remote add だ。

書式は git remote add <名前> <URL> だ。たとえば git remote add origin https://github.com/taro/myproject.git のように使う。

git remote add origin https://github.com/taro/myproject.git ……origin という名札で送り先を登録する。git remote -v で一覧できる。

ここで付ける名前は、送り先につける「名札」だ。慣習上は最初の1つに origin という名前を付ける。origin はただの慣習名であって特別な意味はなく、複数のサーバーを使いたいときは別の名前も付けられる。

いまどんなリモートが登録されているかは git remote -v で一覧できる。取得(fetch)用と送信(push)用の URL が表示される。

コツgit clone で複製した場合は、複製元が origin として自動登録済み。この git remote add の作業は不要だ。

なお、git clone(git-clone)でリポジトリを複製した場合は、複製元が origin として自動的に登録済みなので、この登録作業は不要だ。

↕ 送り出す git push と取り込む git pull

登録したサーバーとのやり取りは、向きの違う2つの操作で覚える。手元のコミットをサーバーへ送り出すのが git push、サーバー側の変更を手元へ取り込むのが git pull だ。

初めて push するときは、git push -u origin main のように書く。-u(--set-upstream の短縮形)は「このローカルの main の送り先は origin の main だ」と紐付ける指定だ。最初の一回だけ付ければ、以後は git push と打つだけで同じ送り先へ送れるようになる。

初回は git push -u origin main で送り先を紐付ける。-u は最初の一回だけでよく、以後は git push だけで同じ送り先へ送れる。

成功すると「[new branch] main -> main」のように、新しい枝がサーバー側に作られたことが表示される。

一方 git pull は、他の人がサーバー側に加えた更新があれば手元に取り込み、何も無ければ「Already up to date.(最新です)」と表示される。pull は内部的には、サーバーの最新を取ってくる fetch と、それを手元に合流させる merge の2つをまとめて実行している。

👀 先に覗くだけの git fetch

取り込む前に「サーバー側に何が来ているか」だけ先に覗くこともできる。取ってくる操作には、もう一段おだやかな git fetch がある。

git pull が「取ってきて手元に合流まで」やるのに対し、git fetch は「取ってくるだけで、手元にはまだ合流しない」操作だ。

🔗
たとえgit pull は「取ってきて即合流」、git fetch は「取ってくるだけで合流は保留」。fetch は中身を見てから自分のタイミングで merge できる。

fetch した後は origin/main のような名前で「サーバー側の最新がどこまで来ているか」を確認でき、内容を見てから自分のタイミングで git merge して合流させられる。サーバー側に何が来ているかを先に確かめてから取り込みたいときに、この使い分けが効いてくる。

慣れないうちは pull だけでも実務は回る。ただ、fetch という安全側の選択肢があることは知っておくと役立つ。

🤝 共同作業のリズムと、push が拒まれる理由

チームで1つのリモートを共有して開発するときの基本リズムは「push の前にまず pull」だ。

💡
ポイント共同作業の基本リズムは「push の前にまず pull」。先に相手の変更を取り込んでから送れば、衝突をかなり防げる。

自分が作業している間に、他の人が先にサーバーへ変更を送っているかもしれない。その状態でいきなり push しようとすると、サーバー側のほうが進んでいるために push が拒否される。

これは Git が「あなたはまだ取り込んでいない他人の変更があるので、上書きさせません」と守ってくれているのだ。

このときは、まず git pull で相手の変更を取り込み、必要ならコンフリクトを解決してから、あらためて git push する。この「pull してから push」を習慣にすると、共同作業での衝突をかなり防げる。

コツpull の前に手元の編集が中途半端なら、git stash で一時退避し、pull を済ませてから git stash pop で戻すと邪魔にならない。

なお、pull しようとしたときに手元で中途半端な編集が残っていると、合流の邪魔になって警告が出ることがある。そんなときは git stash で編集を一時的に棚へ退避し、pull を済ませてから git stash pop で戻す、という手順が役立つ。

🔑 認証と、Git と GitHub の違い

最初に push するとき、本人確認のための認証を求められる。HTTPS の URL を使う場合、いまはパスワードの代わりにアクセストークンと呼ばれる文字列を使うのが主流だ。具体的な発行手順や認証方法はサービスや環境ごとに異なるため、画面の案内に従ってほしい。

ここで混同しやすいのが Git と GitHub の関係だが、両者は別物だ。

つまずきGit は手元で動くバージョン管理の道具そのもの、GitHub や GitLab はそれを置く Web サービス。両者は別物なので混同しない。

Git は手元で動くバージョン管理の道具そのものだ。GitHub や GitLab は、その Git リポジトリを置いておく Web サービスだ。サービスを使うとリモートへのバックアップに加え、変更提案をやり取りするプルリクエスト、課題管理、自動テストといった機能が付いてくる。

ただし繰り返しになるが、これらは必須ではない。まずはローカルでの commit に習熟し、共有が必要になった段階で git remote add や git clone を通じてサービスを足していく、という流れが堅実だ。

この項目に出てくる用語

リモートりもーと
GitHubなどサーバー側に置かれた共有用のリポジトリ。
クローンくろーん
既存のリポジトリを履歴ごと手元に複製すること。

関連コマンド

git remotegit pushgit pull

▶ 学習アプリでこの続きを学ぶ・演習する