Git入門:バージョン管理のきほん
リモートリポジトリと GitHub
このレッスンで分かること
originが特別なものではなく、URL につけた単なる別名であること- リモートの登録・確認・変更のコマンドと、
git remote -vの読み方- HTTPS なら Personal Access Token、SSH なら鍵、という認証の整理
origin は単なる別名
ここまでのレッスンは、すべて自分の PC の中だけで完結していました。第 4 章からは、他の人とリポジトリを共有する話に入ります。
その中心にあるのがリモートリポジトリです。名前は難しそうですが、中身は自分の PC にあるものとまったく同じ Git リポジトリで、置いてある場所がネットワークの向こう側というだけです。GitHub や GitLab は、そのリポジトリを預かってくれるサービスです。
そして origin です。Git を触っていると必ず出てくるこの語は、Git の特別な機能でも予約語でもありません。リモートリポジトリの URL につけたあだ名です。
https://github.com/example/myapp.git という長い URL を毎回打つのは大変なので、それに origin という短い名前をつけておく。ただそれだけの仕組みです。
確かめてみます。
ターミナル
$ git remote -v
origin https://github.com/example/myapp.git (fetch)
origin https://github.com/example/myapp.git (push)左が別名、右が実際の URL です。(fetch) は取ってくるとき、(push) は送るときに使う URL で、通常は同じものが並びます。
なぜ origin という名前なのかというと、git clone を実行したときに Git が自動でこの名前をつけるからです。「自分がここから始まった場所」という意味です。全員が同じ名前を使っているのは、単に Git の既定値がそうなっているからにすぎません。
originに特別な力はありません。名前をgithubに変えても Git はまったく困りません。ただし世の中の記事もチームメイトの説明もorigin前提で書かれているので、理由がない限り変えないでください。
リモートを登録する
git init で自分で作ったリポジトリには、まだリモートがありません。
ターミナル
$ git remote -v何も表示されません。ここに GitHub 上のリポジトリを登録します。GitHub の画面で空のリポジトリを作り、表示された URL を使います。
ターミナル
$ git remote add origin https://github.com/example/myapp.gitgit remote add は「この URL に、この別名をつけて覚えておいて」という命令です。第 1 引数が別名、第 2 引数が URL です。
登録できたか確認します。
ターミナル
$ git remote -v
origin https://github.com/example/myapp.git (fetch)
origin https://github.com/example/myapp.git (push)| コマンド | 何をするか |
|---|---|
git remote -v | 登録されているリモートを URL つきで一覧する |
git remote add <名前> <URL> | 新しいリモートを登録する |
git remote set-url origin <URL> | 既存リモートの URL を差し替える |
git remote rename origin upstream | 別名を変更する |
git remote remove origin | 登録を削除する |
git remote show origin | ブランチの対応まで含めて詳しく表示する |
URL を間違えて登録してしまったときは、消して登録し直す必要はありません。set-url で上書きできます。
ターミナル
$ git remote set-url origin git@github.com:example/myapp.gitHTTPS と SSH という 2 つの入口
さきほど 2 つの URL が出てきました。同じリポジトリを指しているのに形が違います。
プレーンテキスト
https://github.com/example/myapp.git
git@github.com:example/myapp.git上が HTTPS、下が SSH です。どちらでも同じことができます。違うのは「あなたが本人であることをどう証明するか」だけです。
| 方式 | URL の形 | 本人確認の方法 | 向いている場面 |
|---|---|---|---|
| HTTPS | https://github.com/... | Personal Access Token | 共用マシン、一時的な作業、SSH が使えない環境 |
| SSH | git@github.com:... | 手元の秘密鍵 | 自分の PC で長く開発する |
どちらを使っているかは git remote -v の出力を見れば一目で分かります。https:// で始まっていれば HTTPS、git@ で始まっていれば SSH です。この判別ができると、認証で詰まったときにどちらの手順を調べればいいかが決まります。
HTTPS を使うなら Personal Access Token
HTTPS で push しようとすると、ユーザー名とパスワードを聞かれます。ここで GitHub のログインパスワードを入れても通りません。
プレーンテキスト
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/example/myapp.git/'GitHub はパスワードでの Git 操作を廃止しました。代わりに使うのが Personal Access Token です。以降 PAT と呼びます。
PAT は、GitHub が発行する長い文字列です。パスワードの代わりに使いますが、次の点が違います。
- 有効期限を決められる。90 日で自動的に失効させる、といった設定ができる
- できることを絞れる。「リポジトリの読み書きだけ」のように権限を限定できる
- 何本でも作れる。会社の PC 用と自宅用で別々にし、片方だけ無効化できる
作り方は、GitHub にログインして右上のアイコンから Settings を開き、左側のいちばん下にある Developer settings に進みます。そこから Personal access tokens を選び、トークンを生成します。リポジトリの読み書きに必要な権限だけを選んでください。
生成された文字列は、その画面を離れると二度と表示されません。 必ずその場でコピーしてください。
push のときにユーザー名と、パスワード欄に PAT を貼り付けます。
ターミナル
$ git push origin main
Username for 'https://github.com': taro-yamada
Password for 'https://taro-yamada@github.com':毎回貼り付けるのは現実的ではないので、OS の資格情報ストアに覚えさせます。Mac と Windows で設定が違います。
ターミナル
# Mac
$ git config --global credential.helper osxkeychain
# Windows (Git for Windows に同梱)
$ git config --global credential.helper managerこれで一度入力すれば、次からは自動的に使われます。
PAT は実質的にパスワードです。Slack に貼る、コードに書き込む、スクリーンショットに写す、といったことは絶対に避けてください。漏れたと思ったら、GitHub の同じ画面から即座に失効させます。失効させれば、そのトークンは以後まったく使えなくなります。
SSH を使うなら鍵をつくる
SSH は、手元にある秘密鍵と、GitHub に登録した公開鍵のペアで本人確認をします。一度設定すれば、以後は何も入力せずに push できます。
まず、すでに鍵があるかを確認します。
ターミナル
$ ls ~/.ssh
id_ed25519 id_ed25519.pub known_hostsid_ed25519 が秘密鍵、.pub がついたほうが公開鍵です。何も無ければ作ります。Mac も Windows も同じコマンドです。Windows では Git Bash を開いてください。
ターミナル
$ ssh-keygen -t ed25519 -C "taro@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/taro/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/taro/.ssh/id_ed25519
Your public key has been saved in /Users/taro/.ssh/id_ed25519.pub保存先はそのまま Enter で構いません。パスフレーズは、鍵ファイル自体にかける追加のロックです。設定しておくほうが安全です。
次に公開鍵を GitHub に登録します。中身を表示してコピーします。
ターミナル
# Mac
$ pbcopy < ~/.ssh/id_ed25519.pub
# Windows (Git Bash)
$ clip < ~/.ssh/id_ed25519.pubGitHub の Settings から SSH and GPG keys を開き、New SSH key で貼り付けます。
貼り付けるのは .pub がついた公開鍵だけです。 秘密鍵のほうは、どこにも貼らず、誰にも渡さず、手元から出しません。
接続できるか試します。
ターミナル
$ ssh -T git@github.com
Hi taro-yamada! You've successfully authenticated, but GitHub does not provide shell access.このメッセージが出れば成功です。「shell access は提供していない」と書かれていますが、エラーではありません。認証が通ったという合図です。
最後に、リモートの URL を SSH の形に切り替えます。
ターミナル
$ git remote set-url origin git@github.com:example/myapp.git
$ git remote -v
origin git@github.com:example/myapp.git (fetch)
origin git@github.com:example/myapp.git (push)認証で詰まったときの見分け方
初学者がいちばん時間を溶かすのがここです。順番に切り分けます。
まず git remote -v を打って、HTTPS と SSH のどちらを使っているかを確定させます。ここを確認せずに検索すると、SSH の設定をしているのにエラーは HTTPS のもの、という噛み合わない状態に陥ります。
よくある失敗は次の通りです。SSH 鍵を作って GitHub に登録し、ssh -T git@github.com も成功したのに、git push すると相変わらずユーザー名を聞かれる。原因は、リモートの URL が https:// のままだからです。鍵は正しく設定されていて、その鍵をまったく使っていないだけです。git remote set-url で URL を SSH の形に直せば解決します。
逆に、SSH の URL を使っているのに Permission denied (publickey). と出るときは、公開鍵が GitHub に登録されていないか、別のアカウントに登録されています。
| 症状 | 原因 | 対処 |
|---|---|---|
| パスワードを聞かれる | URL が HTTPS | PAT を使うか、URL を SSH に変える |
Authentication failed | パスワードを入れている | パスワード欄に PAT を貼る |
Permission denied (publickey) | 公開鍵が未登録 | .pub の中身を GitHub に登録する |
Repository not found | URL の綴り違い、または権限がない | git remote -v で URL を確認する |
最後の Repository not found は紛らわしい表現です。リポジトリが存在しないときだけでなく、存在するが自分に見る権限がないときにも同じ文言が出ます。非公開リポジトリの所在を隠すための仕様です。
originは Git の特別な機能ではなく、リモートの URL につけた単なる別名git remote -vで登録内容を確認し、git remote addとgit remote set-urlで登録・変更する- HTTPS なら Personal Access Token、SSH なら鍵のペアで本人確認する。トークンも秘密鍵も外に出さない
- 認証で詰まったら、まず
git remote -vで HTTPS と SSH のどちらを使っているかを確定させてから調べる