【git】github入門に公開鍵認証を補足してみる【初心者殺し】

gitって難しんでしょう？　と食わず嫌い・苦手意識をもっていたgitにようやっと取り組んでみようと思い立った。

gitコマンド覚えるぞう、と意気込んでgithub入門というタイトルのサイトを参照しながらコマンド打っていくも、途中からエラーの連続。

調べたところによると、2021.08.13あたりにhttpsによるパスワード認証が不可になったそうで、それのせいで世にあるほとんどの初心者入門が手順通りに行かなくなったもよう。

使えるようにするには、ホストPCで公開鍵・秘密鍵のペアを作って、公開鍵をgithubに登録し、公開鍵認証を実装しなければならない。

基本的な流れを追いつつ、変更点を見ていく。

githubのアカウントは持っていて、かつ、gitをすでに自分のPCにインストールしているという前提で行くので、インストールについては下記参照サイト群中の①「GitHubの導入〜基本操作 for Windows」を参照されたし。

アカウントはgithubのサイトへ行ってノリで作ってください。

https://github.com/

右上の sigh up からアカウント登録。

gitの概要なんかは、⑤「【超入門】初心者のためのGitとGitHubの使い方」がわかり易かった。

【参考】
=======================================
①GitHubの導入〜基本操作 for Windows

https://qiita.com/Kenta-Okuda/items/c3dcd60a80a82147e1bf

②Git・GitHub】git clone が認証エラーで失敗する場合の対応手順

https://www.yururiwork.net/archives/1390

③git pushの接続方式をhttpsからsshに切り替える

https://qiita.com/SwuBHj8aKGqBKHet/items/ec8c225603ef983fc318

④GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~

https://qiita.com/shizuma/items/2b2f873a0034839e47ce

⑤【超入門】初心者のためのGitとGitHubの使い方

https://tech-blog.rakus.co.jp/entry/20200529/git#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%A8%E3%81%AF

⑥Gitの設定をgit configで確認・変更

https://note.nkmk.me/git-config-setting/

=======================================

### ■全体の流れ

- githubにて、リモートリポジトリと紐づけるためのリポジトリを作成。
- 任意のフォルダで`git init`実行し、初期化。
- `git add <file name>`でステージング。
- `git commit` でステージングされたファイルをリポジトリに記録。
- `git remote add` でリモートリポジトリに対してファイルをステージング。
- `push` コマンドでローカルリポジトリの変更履歴をリモートリポジトリに共有。
- `push` まで出来たら`clone`で他のフォルダに複製もできる。

上記、`git remote add` 、`push`あたりでエラーが出始める。

流れ自体はそんなに変わらず、設定内容とかが従来と異なる。
詳しく見ていく。


#１．githubにて、リモートリポジトリと紐づけるためのリポジトリを作成。

https://github.com/

githubにアクセスし、サインアップ。
Repository の new を押下。（画面右上）
リポジトリの名前を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/8bfd57b9-0ab6-1a80-b539-89d7861bd51a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/7fd0333d-5ff0-b279-6c85-505d357b35d4.png)

PublicかPrivateかは、全体に公開するか、許可された一部のユーザにのみ公開するか選べる。
Publicは基本無料で使えて、Privateがお金がかかるという。
（最近はPrivateも無料のプランがあるとか。今回はテストなのでとりあえずPublic） 

この、githubにリポジトリを作成するのもコマンドでできると思っていたのでしばらくはまった。
コマンドでgithubの操作を行うには別途github CLI というツールが必要な模様。
詳細は下記記事参照。

【参考】

https://qiita.com/ryo2132/items/2a29dd7b1627af064d7b

とりあえず今回は実験用に`test`という名前のリポジトリを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/0294eb6b-2be5-3cf7-a94d-8aea202daff1.png)
まだ何もない状態。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/5d6c3c10-ac13-d99f-ab95-f1a69daf26ff.png)

# ２．公開鍵ペアを作成し、公開鍵をgithubに登録。

さっそく従来とは違う流れ。
リモートリポジトリに紐づけする際にsshにてアクセスするので、ホストPCでコマンドプロンプトを開き、`ssh-keygen`コマンドで公開鍵ペアを作成。（すでにあるなら作らなくていい）

```
C:Users¥hemuwan>ssh-keygen -t rsa
```
任意のパスフレーズを2回入力する。（ログインとかで使ったりする）
忘れるともう一回作ることになるよ！
何か前の記事でも書いたよ！

https://qiita.com/hemuwan-kazu/items/6c927bc493787c03e4f6


パスフレーズを入力したら、恐らく`C:¥User¥hemuwan¥.ssh`の配下に
`id_rsa`と`id_rsa.pub`ファイルが作成されているかと。

このうち、`id_rsa.pub`、公開鍵の方をgithubに登録する。
下記コマンドでクリップボードにファイルの内容をコピーできる。便利。

```
>clip < [filePath]
```

公開鍵の中身をクリップボードにコピーしておく。
パスってなんやねんってひとは下記操作で、`.ssh`フォルダに入ってから`id_rsa.pub`を指定すればよい。

```
C:¥Users¥hemuwan>cd .ssh
C:¥Users¥hemuwan¥.ssh>clip id_rsa.pub
```

Ctrl + V で中身を張り付けられる。
どっかに張り付けてみるとよくわからん文字列がたくさん出ると思われる。
これで準備完了。

ふたたびgithubのサイトを開き、右上の自分のアイコンから「Setting」を選択。
左の項目一覧から「SSH and GPG keys」を選択。
SSH Keyのところの「new SSH Key」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/21f41c80-c1bd-a082-a567-21eaad5dcf01.png)

Keyの中にさきほどクリップボードにコピーした内容を貼り付け。
titleは何でもいいっぽい。
入力したら「Add SSH Key」を押下。

これでgithub側の準備はOK。のはず。

# ３．ユーザー情報、エディタ指定などの初期設定。

gitを使う前にユーザの情報を設定する。
コマンドプロンプトを開き、下記のコマンドでgitがインストールされているか確認。
バージョンが出ればOK。gitがインストールされてないと、そんなコマンドないよ、と出る。

```
>git --version
git version 2.25.1.windows.1
```

下記コマンドでユーザー名、メールアドレスなどの情報の設定を行う。
これないと誰が誰だかわからなくなる。

```
git config --global user.name "ユーザーの名前"
git config --global user.email "任意のメールアドレス"
```

下記コマンドでコミットログを記述するエディタを設定。
VScodeをインストールしていて、かつパスを通していたら`code`、よくわかんねえって人はとりあえず、`notepad`でいけると思う。


```
git config --global core.editor 'notepad'
```

これでひとまずOK。
現在のコンフィグについては下記コマンドで確認できる。
終了するには`Qキー`を押さないといけないことに注意。

```
git config -l
// Qキーを押すと終了できる
```


# ４．ローカルリポジトリを作成

コマンドプロンプトを開き、任意のフォルダへ移動する。
今回はホームディレクトリに「testGit」というフォルダを作って実験。
（.sshにいたままのひとは`cd ..`で戻れるよ）

```
C:¥Users¥hemuwan> mkdir testGit
C:¥Users¥hemuwan> cd testGit
C:¥Users¥hemuwan¥testGit>
```

まずは`git init`コマンド実行
これによりtestGitフォルダをリポジトリとして初期化しているらしい。

何を言ってるがわからんが必要なことなのでやる。
 

```
C:¥Users¥hemuwan¥testGit>git init
Initialized empty Git repository in C:/Users/hemuwan/testGit/.git/
```

Initialized empty Git repository(空のGitリポジトリを初期化しました)が出たら、無事に初期化されているかと。

# ５．インデックスにアッドしてローカルリポジトリにコミットする

横文字がいっぱい出てきました。
半年前のわたしはもう投げ出してTwitterに逃げます。

きっと怖くないので１つずつ見ていく。

コミットとは、「ファイルの追加・変更をローカルリポジトリに反映する操作」だそうな。

その前段階に、アッド（ステージング）という操作が入る。

アッドあるいはステージングとは、コミット前に変更内容をインデックスと呼ばれる一時的な保存領域に追加する。
コミットの対象になるのはインデックスに追加されたファイルのみとなるので、必須の操作。
（この辺よくわからずアッドしてないのにコミットしようとしてできねえできねえいってた時がありました。かなしい。）

よくわからんのでやってみる。
とりあえず実験用に、適当なファイルを作る。

```
C:¥Users¥hemuwan¥testGit¥> notepad test.txt
```

なかみにhelloとか書いて保存しときます。
ファイルが新規に作成されたので、まずはそれをインデックスへ保存する。

```
C:¥Users¥hemuwan¥testGit> git add test.txt
```

フォルダ内すべてのファイルをステージングしたいなら、`git add .`でいけるらしい。

つづいて、コミット。
下記のコマンドでインデックスに存在するファイルがローカルリポジトリに追加される。

```
git commit -m "[Add] test.txt"
```

`-m`はコメントを残すことができるオプション。
何でもそうだけどコメントはあった方がいい。絶対。

オプション付けないでエンター押すと、さっき指定したエディタが開いて詳細なメッセージを書くこともできる。（エディタ指定していないとエラーでて -m か -F オプション付けろやボケと怒られる。）

```
C:¥Users¥hemuwan¥testGit> git commit
hint: Waiting for your editor to close the file... unix2dos: converting file C:/Users/hemuwan/testGit/.git/COMMIT_EDITMSG to DOS format...
```

なんか言われた後にメモ帳が開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/88e77acb-a11e-e807-6987-71c19b0dec15.png)

たぶんここにコメント書いていく。
シャープで書き始めたら無視、何も書かないとaborts the commit.（コミットを中止する）
何かしらは書かないといけないっぽい。

コミットメッセージにはフォーマットがあるようで、以下のようになる。（①参照）

- [Add]     <ファイルの追加>
- [Fix]     <バグ修正>
- [Hotfix]  <クリティカル（致命的）なバグの修正> 
- [Update]  <機能修正（バグではない）>
- [Change]  <仕様変更>
- [Clean]   <整理>
- [Remove]  <ファイルの削除>
- [Upgrade] <バージョンアップ>

コミットメッセージなどの変更履歴は`git log`コマンドで確認することができる。

```
C:¥Users¥hemuwan¥testGit> git log
commit dcc58・・・・コミットごとに出るハッシュ値・・・
Author: ユーザー名 <メールアドレス>
Date:   Sun Oct 17 00:12:42 2021 +0900

    [Add] test2 coment

commit 36791・・・・コミットごとに出るハッシュ値・・・
Author: ユーザー名 <メールアドレス>
Date:   Sun Oct 17 00:12:05 2021 +0900

    [Add] test.txt
```

ここまでがローカルリポジトリに行う操作。
次からリモートリポジトリ、githubへ反映していく。

# ６．プッシュしてリモートリポジトリに反映

ここも従来と設定が異なる。
ようやく公開鍵認証の設定が活きてくる。

まず、下記コマンドで接続を確かめる。
コマンド入力後、パスフレーズを求められるので、鍵ペアを作った時のパスフレーズを入力。
（入力した値は表示されないのでちゃんと打つように）

```
C:¥Users¥hemuwan¥testGit> ssh -T git@github.com
Enter passphrase for key 'C:¥Users¥hemuwan/.ssh/id_rsa':
Hi hemuwan! You've successfully authenticated, but GitHub does not provide shell access.

C:¥Users¥hemuwan¥testGit>
```

なんか成功したぜ！みたいな英語が出たら接続できています。
その時点で、強制的に切れます。これが成功です。ぱっと終わります。

successfully が出ない人は鍵を登録するくだりを何か間違えているかと思うので、鍵を作って登録sするくだりをもう一回してみてください。
（あと鍵作るときに名前を付けたりするとうまくいかないらしいです）

接続確認出来たら、リポジトリのCodeの部分をクリックし、SSHをクリックしておく。
ここに出るパスをのちに`remote add`で使う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/0057ef7f-c942-f475-bd8a-c3620de1a1ab.png)


次にローカルリポジトリとリモートリポジトリを紐づけるのだが、ここのコマンドは従来は下記でいけていた。

```
C:¥Users¥hemuwan¥testGit> git remote add origin https://github.com/hemuwan/test.git
C:¥Users¥hemuwan¥testGit> git push origin master
```

でも今これをやるとユーザーIDとパスワードを求められて、それを入力したのにもかかわらず、下記のエラーが出る。

```
C:¥Users¥hemuwan¥testGit> git remote add origin https://github.com/hemuwan/test.git
C:¥Users¥hemuwan¥testGit> git push origin master
Logon failed, use ctrl+c to cancel basic credential prompt.
Username for 'https://github.com': hemuwan
Password for 'https://hemuwan@github.com':
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: Authentication failed for 'https://github.com/hemuwan/test.git/'
```

なんか読んでくれって出ているのが冒頭に書いた、httpsによるパスワード認証が不可になったことに関する記事っぽい。（ちゃんと読んでない）

なので、`remote add`コマンドを下記のように行う。

```
C:¥Users¥hemuwan¥testGit> git remote add git@github.com:humewan/test.git
```

今まで`https:github.com/<ユーザID>/<リポジトリ名>.git`だったものが`git@github.com:<ユーザID>/<リポジトリ名>.git`に。
ちなみに、上記コマンドを実行しても、`fatal: remote origin already exists.`というエラーが出ちゃう場合、すでに設定されちゃっているようなので、下記コマンドで上書きが可能。
（ちなみに私はここで`/`を`¥`で書いてしまっていてうまくいかず半日時間がつぶれた）

```
C:¥Users¥hemuwan¥testGit> git remote set-url git@github.com:humewan/test.git
```

`add` を `set-url` に変更した。
ちゃんと設定されているかは `git remote -v` で見れる。

```
C:¥Users¥hemuwan¥testGit> git remote -v
origin  git@github.com:hemuwan/test.git (fetch)
origin  git@github.com:hemuwan/test.git (push)
```

ここに入力したURLになっていればOK。

さて、再び`push`を実行。
パスフレーズを求められるので入力すると、

```
C:¥Users¥hemuwantestGit>git push origin master
Enter passphrase for key '/c/Users/hemuwan/.ssh/id_rsa':
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (9/9), 671 bytes | 41.00 KiB/s, done.
Total 9 (delta 0), reused 0 (delta 0)
To github.com:hemuwan/test.git
 * [new branch]      master -> master
```

プッシュ成功！
githubのtest リポジトリを見に行くと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494508/d45c6be9-3248-ff1c-2424-a9505ab4b1bf.png)

作ったファイルが存在している！
やったああああああああああああああああああああああああああ！

# ７．ついでにクローン

githubにファイルを反映できたので、そのファイルをローカルに落としてみる。
いまとは別のフォルダを作る。名前は適当に「test2」とでも。

```
C:¥Users¥hemuwan¥testGit> cd ..
C:¥Users¥hemuwan> mkdir test2
C:¥Users¥hemuwan> cd test2
C:¥Users¥hemuwan¥test2>
```

で、ここも従来はhttpのパスワード認証のため、下記のように書いていた。

```
> git clone https:github.com/<ユーザID>/<リポジトリ名>.git
```

でもこれだとうまくいかない。認証エラーになる。
（なんかたまに`htttps://`でもうまくいく。謎。。。）

下記コマンドを実行し、パスフレーズを入力するとクローンができる。
(`ssh://`が必要だったり、よく見ると`:`が`/`に変わってたり初見殺しな気が)

```
C:¥Users¥hemuwan¥test2> git clone ssh://git@github.com/hemuwan/test.git
Cloning into 'test'...
Enter passphrase for key '/c/Users/hemuwan/.ssh/id_rsa':
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 9 (delta 0), reused 9 (delta 0), pack-reused 0
Receiving objects: 100% (9/9), done.

C:¥Users¥hemuwan¥test2> dir
 Volume in drive C is Windows 8.1
 Volume Serial Number is 3E08-D701

 Directory of C:¥Users¥hemuwan¥test2

2021/10/17  01:33    <DIR>          .
2021/10/17  01:33    <DIR>          ..
2021/10/17  01:33    <DIR>          test
               0 File(s)              0 bytes
               3 Dir(s)  294,949,933,056 bytes free
```

`test`フォルダが作成されている。
中身を見ると、githubへプッシュしたものが確認できる。

```
C:¥Users¥hemuwan¥test2> dir test
2021/10/17  01:33    <DIR>          .
2021/10/17  01:33    <DIR>          ..
2021/10/17  01:33                20 test.txt
               1 File(s)             20 bytes
               2 Dir(s)  294,946,242,560 bytes free
```

まだまだほかにもブランチとか、フォークとか、プルリクエストとか、マージとかいろいろあるけど、これで入門はできたといっていいのではないか。

思ったより長くなってしまった。

### 2021.10.22 追記

続き書いたー。

https://qiita.com/hemuwan-kazu/items/4ae6f069d3a7171dced1