[初心者] GitHubへSSH接続してPushする（Mac）

GitHubに登録して活動を始めるタイミングでSSHについての設定を何もしなかったので数日間HTTPS接続だったのですが、ようやくSSH接続に切り替えました。その時にやったことをまとめます。

<br>

## 前提
・MacOSのバージョンは Sonoma 14.6.1です。
・GitHubアカウント取得済みで、既にリモートリポジトリへのプッシュを経験しています。
・コード内の<>は筆者によって書き換えたり追加した部分なので、適宜読み替えてください。

<br>

## 1. TerminalでSSH鍵を作成する

SSH接続に必要な公開鍵と秘密鍵を作る前に、まずそれらが既にあるかどうかを確認しましょう。
```
$ ls ~/.ssh
known_hosts     known_hosts.old
```

<br>

SSH鍵（`id_<鍵名>`と`id_<鍵名>.pub`のセット）がないので作ります。

```
$ ssh-keygen -t ed25519 -C "<GitHub登録のメールアドレス>"
```
`-t`オプションで鍵タイプ（暗号アルゴリズム）をed25519に指定。ed25519は他のアルゴリズムより優れているとのことで、最近はこちらが推奨されているようです。
`-C`オプションは、公開鍵の末尾に追加されるコメントを決めることができます。指定しない場合は、デフォルトで <ユーザー名>@<ホスト名> が入ります。`-C ""`でコメントなしにすることもできます。

<br>

`ssh-keygen`コマンドを実行した結果を下に載せます。途中でエンターとパスワードを求められるので入力してください。このパスワードはまた後で使います。

```
$ ssh-keygen -t ed25519 -C "<GitHub登録のメールアドレス>"      
Generating public/private ed25519 key pair.
Enter file in which to save the key (<ホームディレクトリ>/.ssh/id_ed25519): <エンターを押す>
Enter passphrase (empty for no passphrase): <パスワード入力> 
Enter same passphrase again: <パスワード入力>
Your identification has been saved in <ホームディレクトリ>/.ssh/id_ed25519
Your public key has been saved in <ホームディレクトリ>/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:MAtkL7Si+wkIwt9x5kCo1Blhqq3mzm4IoG7dUlP8go4 <GitHub登録のメールアドレス>
The key's randomart image is:
+--[ED25519 256]--+
|   +=            |
|  +++o           |
| o.++.=          |
|=o...o *         |
|Bo.  o+oS        |
|*o. .+*. .       |
|O...=....        |
|=* E o           |
|==o .            |
+----[SHA256]-----+
```

これで~/.sshフォルダに`id_ed25519`と`id_ed25519.pub`のふたつのファイルが出来ました。

<br>

## 2. GitHubに公開鍵を登録する
公開鍵（`id_ed25519.pub`）の内容をコピーしてGitHubに登録します。
コマンドでコピーする場合はこれ↓。
```
$ pbcopy < ~/.ssh/id_ed25519.pub
```

<br>

コピーしたらGitHubのサイトに行き、右上にある自分のアイコンをクリックして「Settings」を選びます。
左側のメニューから「SSH and GPG keys」を選び、「New SSH key」ボタンを押します。

![スクリーンショット 2024-10-13 21.50.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894261/2f358f02-3e0c-e6a6-3297-442515748d44.png)


「Title」を好きに入力して（私は作成日を入れて"241013公開鍵"としました）、「Key」にさっきコピーした公開鍵をペーストします。
「Add SSH key」　を押したら、GitHub側の設定は完了。

<br>

試しに`ssh`コマンドを実行して、SSH接続してみましょう。鍵を作るときに入力したパスワードを入れて以下のように表示されたら成功です！

```
$ ssh -T git@github.com                              
Enter passphrase for key '<ホームディレクトリ>/.ssh/id_ed25519': <パスワード入力>
Hi <GitHubのユーザーネーム>! You've successfully authenticated, but GitHub does not provide shell access.
```

<br>

## 3. リモートリポジトリのURLを変更

今までHTTPSで接続していたのでリモートリポジトリのURLを確認するとこのようになってました。
```
$git remote -v
origin  https://github.com/<リモートリポジトリ名>.git (fetch)
origin  https://github.com/<リモートリポジトリ名>.git (push)
```

<br>

これをSSHのURLに変更します。（GitHubのリポジトリページにある「Code」ボタンを押すとSSHのURLを確認できます。）
```
$ git remote set-url origin git@github.com:<リモートリポジトリ名>.git
```

<br>

もう一度`git remote -v`で確認すると、ちゃんと変更されていました。
```
$ git remote -v
origin  git@github.com:<リモートリポジトリ名>.git (fetch)
origin  git@github.com:<リモートリポジトリ名>.git (push)
```

<br>

## 4. ssh-agentに追加する
ここまでやって、SSH接続でリモートリポジトリへ`git push`できるようになったのですが、プッシュするたびにパスワードを要求されるようになりました。
```
$ git push
Enter passphrase for key '<ホームディレクトリ>/.ssh/id_ed25519': <パスワード入力>
Everything up-to-date
```

<br>

これを解決するために、ssh-agentに追加します。
```
$ ssh-add ~/.ssh/id_ed25519
Enter passphrase for /<ホームディレクトリ>/.ssh/id_ed25519: <パスワード入力>
Identity added: /<ホームディレクトリ>/.ssh/id_ed25519 (<GitHub登録のメールアドレス>)
```

<br>

これで今まで通り`git push`できるようになりました！
```
$ git push
Everything up-to-date
```

<br>
<br>

以上、修正箇所やアドバイスがあればコメントぜひお願いします。

<br>

## 参照
[SSH を使用した GitHub への接続 - GitHub Docs](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh)
[GithubにSSH接続できるのに、Git操作時にエラーが出る場合の確認ポイント - Qiita](https://qiita.com/tar_xzvf/items/1ce3dc4da01421765619)
[githubからsshでクローンする。sshでpushする - Qiita](https://qiita.com/dorara/items/942485e064f3e2bdd4f7)
[SSH 鍵の生成 | IBM Cloud 資料](https://cloud.ibm.com/docs/hp-virtual-servers?topic=hp-virtual-servers-generate_ssh&locale=ja)
[【SSH】ssh-agentの使い方を整理する - Qiita](https://qiita.com/Yarimizu14/items/6a4bab703d67ea766ddc)