🐧 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

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