第5章 GitHub とリモート

GitHub は何をしてくれる場所か

Git は分散型なので、原理的にはサーバーがなくても個人で完結する。 一方で複数人で同じコードベースを育てたり、他人のリポジトリに貢献したりするには「みんなが接続しに行ける共通の置き場所」が欲しい。 GitHub はその置き場所をホストしてくれるサービスである。

GitHub 自体は Git のラッパーではなく、Git プロトコルで通信する単なるサーバー + 便利な Web UI の組み合わせだと思っておけばよい。 Issues・Pull Request・Actions などの追加機能は魅力的だが、この章ではまず「リモートの Git リポジトリとしての GitHub」に集中する。

MEMO

GitHub 以外にも、GitLab・Bitbucket・Gitea・Codeberg など同種のホスティングサービスはたくさんある。Git の使い方としてはどれもほぼ同じである。 会社によって使う場所が違う可能性は高いので、ここでの手順は他のサービスにもだいたい応用できると思ってよい。

アカウントと認証

GitHub を使うには、まず github.com でアカウントを作る。ここは Web 上でポチポチやるだけなので省略。 そのあと、ローカルの Git から GitHub へ安全に接続するための認証方式を選ぶ必要がある。大きく 2 択。

どちらも動くが、SSH は一度設定すれば push のたびにパスワードを聞かれないので日常運用が楽である。ここでは SSH で進める。

SSH 鍵を作って GitHub に登録する

鍵ペアを生成する

まだ SSH 鍵を持っていないなら、ローカルで生成する。ed25519 は現在推奨されているアルゴリズム。

Bash
ssh-keygen -t ed25519 -C "you@example.com"
# 保存先: <Enter> でデフォルト (~/.ssh/id_ed25519) のまま
# パスフレーズ: 任意。空でも動くが、つけるとより安全

~/.ssh/ 配下に秘密鍵 id_ed25519 と公開鍵 id_ed25519.pub ができる。 これから GitHub に渡すのは公開鍵の方 (.pub) だけ。秘密鍵は絶対に他人に渡さない。

公開鍵の中身を取り出す

Bash
cat ~/.ssh/id_ed25519.pub
# => ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... you@example.com

出力されたこの 1 行をまるごとコピーする。

GitHub 側に貼り付ける

GitHub の画面右上アバター → Settings → SSH and GPG keys → New SSH key。 Title は自分が後で見て分かる名前 (例: my-laptop)、Key に先ほどコピーした公開鍵を貼り付けて Add。

接続確認

鍵が通っていれば、GitHub へ SSH でつないだときに「Hi <username>!」と挨拶される。

Bash
ssh -T git@github.com
# => Hi your-username! You've successfully authenticated,
#    but GitHub does not provide shell access.
POINT

初回は「The authenticity of host 'github.com' can't be established」と聞かれるので yes を返す。 これで ~/.ssh/known_hosts に GitHub のホスト鍵が記録され、以降は聞かれなくなる。

SSH が難しい場合の代替 — HTTPS + Personal Access Token

次のような状況では SSH が使いづらいことがある。

このような場合は、https:// で始まる URL を使って HTTPS 接続にし、認証には Personal Access Token (PAT) を使う。 かつては GitHub の Web ログインパスワードで push できたが、2021 年以降は HTTPS でも PAT 必須になっている。

PAT を発行する

GitHub 画面右上のアバター → Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token から発行する。 従来の Tokens (classic) でも動くが、新規で作るなら細かい権限指定ができる Fine-grained のほうを推奨する。

注意

生成された PAT はこの画面を閉じると二度と表示されない。控え忘れたら作り直すことになるので、生成直後にパスワードマネージャ等へ保管しておくこと。 また、PAT はパスワードと同じ機密情報なので、チャットや Issue に貼り付けない・公開リポジトリに混入させないよう気をつける。

HTTPS で remote を設定する

Bash
# 新規に紐づける場合
git remote add origin https://github.com/your-username/my-project.git

# 既存の SSH 設定を HTTPS に切り替える場合
git remote set-url origin https://github.com/your-username/my-project.git

# HTTPS で clone する場合
git clone https://github.com/owner/repo.git

push 時の認証と credential helper

初回 push の際に username / password を聞かれる。

毎回 PAT を貼り付けるのは面倒なので、credential helper で OS のセキュアストレージにキャッシュするのが実用的である。

Bash
# macOS (Keychain)
git config --global credential.helper osxkeychain

# Windows (Git Credential Manager。Git for Windows 同梱で通常は設定済み)
git config --global credential.helper manager

# Linux (libsecret / GNOME Keyring 経由)
git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
注意

手軽な git config --global credential.helper store は PAT をホームディレクトリ直下に平文で保存するので推奨しない。 可能な限り OS のキーチェーン系 (上記) を使うか、最低でも credential.helper cache --timeout=3600 でメモリ上の一時キャッシュに留めること。

リポジトリを GitHub に紐づける

GitHub 側で新しい空リポジトリを作る (Web の New → Repository name を入れて Create。README・.gitignore・ライセンスは今回は付けない)。 作成後の画面に git@github.com:your-username/my-project.git のような SSH URL が表示されるので控えておく。

既存のローカルリポジトリにリモートを追加する

前章までに作った my-project を、この GitHub リポジトリと紐づける。 origin はリモートにつける慣習的な名前だ (技術的には自由に決められるが、無理に変える理由はない)。

Bash
git remote add origin git@github.com:your-username/my-project.git

# 追加されたリモートを確認
git remote -v
# => origin  git@github.com:your-username/my-project.git (fetch)
#    origin  git@github.com:your-username/my-project.git (push)

この時点ではまだ手元のコミットは GitHub に送られていない。実際に送るのは git push で、これは次の章のテーマである。

既存のリポジトリを手元に持ってくる — clone

自分で新規に作るのとは逆パターン。誰かが GitHub にすでに置いているリポジトリを、手元にまるごと複製するのが git clone

Bash
# SSH URL を使う場合
git clone git@github.com:owner/repo.git

# フォルダ名を指定したい場合 (デフォルトはリポジトリ名)
git clone git@github.com:owner/repo.git my-local-name

clone はコミット履歴を含めた完全なコピーを作る。 .git/ も自動で引っ張ってくるので、手元に落ちた直後からすぐ git loggit branch が使える。 origin も自動で設定済みである。

MEMO

SSH URL ではなく HTTPS URL (https://github.com/owner/repo.git) も clone できる。 個人 PC で SSH を通してあるなら SSH、公共 PC や一時的な clone なら HTTPS、という使い分けで問題ない。 途中で URL を変えたくなったら git remote set-url origin <new-url> で差し替えられる。

まとめ