リモートリポジトリへプッシュする時に詰まった話

##はじめに
今回はLaravelの新規プロジェクトをGitで管理するのを目的としています。
リモートリポジトリにプッシュする際に詰まった時の話をまとめます。
###環境
```
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G2022

ホスティングサービス: GitHub
通信プロトコル: SSH通信
```

***

### 目次

1. `ローカルリポジトリ`を作成
2. `ステージエリアにファイル`を`add`する
3. `コミット`する
4. `リモートリポジトリ`を登録する
5. `Git`の設定をする
6. `秘密鍵`と`公開鍵`を作成し、`GitHub`へ登録する。
7. `プッシュ`する

***
##1.ローカルリポジトリを作成
Laravelのルートディレクトリに移動し、次のように実行します。

```
#イニシャライズ（ここをローカルリポジトリとします）
$git init

#実行結果
Initialized empty Git repository in ルートディレクトリのパス/.git/

#状態を確認
$git status

#実行結果(箇条書きで書かれているものがルートディレクトリにあるファイルとフォルダです。)
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	.editorconfig
	.env.example
	.gitattributes
        〜
        （略）
        〜
	storage/
	tests/
	webpack.mix.js
```
#### ログの説明
・`On branch master`
作業ブランチがmasterであると書かれています。
・`No commits yet`
コミットがまだないと書かれています。
・`Untracked files:
  (use "git add <file>..." to include in what will be committed)`
未追跡ファイルが先ほどの箇条書きで書かれていたものがステージエリアに追加されていないと書かれています。`git add <file>`使って変更部分（新規追加）を`add`しましょう

##2.ステージエリアにファイルをaddする　
1.`git add <file>`を実行します。

```

#-Aオプションをつけることによって変更があった全てのファイルがaddされます。
$git add -A

#状態を確認
$git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   .editorconfig
	new file:   .env.example
	new file:   .gitattributes
	new file:   .gitignore
        〜
        （略）
        〜
	new file:   tests/TestCase.php
	new file:   tests/Unit/ExampleTest.php
	new file:   webpack.mix.js
```
・`(use "git rm --cached <file>..." to unstage)`
ステージエリアから外したい場合は`git rm --cached <file>`を使用してくださいと書かれています。

##3.コミットする
`git commit`を`-m`オプションを使用して実行します。

```
#addされたものをコミットします。-mオプションをつけ、「"」で囲むことでコメントを残せます。
$git commit -m "create new project"

#実行結果
[master (root-commit) 71a1d0a] create new project
 87 files changed, 8435 insertions(+)
 create mode 100644 .editorconfig
 create mode 100644 .env.example
 create mode 100644 .gitattributes
 〜
 （略）
 〜
 create mode 100644 tests/Feature/ExampleTest.php
 create mode 100644 tests/TestCase.php
 create mode 100644 tests/Unit/ExampleTest.php
 create mode 100644 webpack.mix.js
```
##4.リモートリポジトリを登録する
`git remote add `を実行し、リモートリポジトリを登録する。

```
#originの後の文字列は使用するリモートリポジトリにある「Clone or download」で入手。
$git remote add origin git@github.com:GitHubのユーザー名/リモートリポジトリ名.git
```

##5.Gitの設定をする。
`git config`を使用し、Gitの設定を行う。

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

##6.秘密鍵と公開鍵を作成し、GitHubへ登録する。

#### 6-1`ssh-keygen`で`秘密鍵`と`公開鍵`を作成する。

```
# -t で鍵の暗号化形式を指定。 -b でbit数を指定。2048以上がいいみたいです。
# -C でコメントを指定できる。
$ssh-keygen -t rsa -b 4096 -C "メールアドレス"

#実行結果
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/[ユーザー名]/.ssh/id_rsa.
Your public key has been saved in /Users/[ユーザー名]/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:＝＝＝＝＝＝＝＝＝＝[作成されたキー]＝＝＝＝＝＝＝＝＝＝ [メールアドレス]
The key's randomart image is:
+---[RSA 4096]----+
|         ~~======|
| ================|
|         ========|
|          =======|      
|          =======|
| ================|
|         ========|
|          =======|
|          =======|
+----[SHA256]-----+

```
・`Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa): `
この()内のディレクトリにキーを作成するという確認。(Enterを入力)
・`Enter passphrase (empty for no passphrase): `
パスワードを入力。
・`Enter same passphrase again: `
もう一度同じパスワードを入力。

#### 6-2 作成した`公開鍵`をGitHubに登録する。
`id_rsa`と`id_rsa.pub`がそれぞれ`秘密鍵`と`公開鍵`である。
両者が作成されたディレクトリに移動する。

```
$cd ~/.ssh 
$ls
authorized_keys	id_rsa		known_hosts
config		id_rsa.pub
```
見つけた。ここで`公開鍵`の中身をコピーする

```
$pbcopy < id_rsa.pub
```
・GitHubの`Settings`で`SSH and GPG keys`タブに移動、
・`New SSH key`をクリックする。`Title`を任意でつけ、`Key`にコピーしたものを貼り付ける。
・`Add SSH key`をクリック。これで`公開鍵`は登録完了です。


##7.プッシュする
####　7-1`git push　origin master`を実行する。
ここでやっと本題に入ります。

```
#originはリモートリポジトリ、　masterはoriginのどこのブランチへプッシュするかを指定。
$git push origin master

#実行結果
```
何も反応しない。`6-2`の`ls`コマンドで出てきた一覧に
`known_hosts`,`authorized_keys`,`config`ファイルがあったと思います。
ここでは書いていませんでしたが、色々調べながらこれらのファイルも調べながら色々触っていました。
ここでそれぞれのファイルの役割について簡単に書いていきます。

**・known_hosts**
一度接続したことがあるサーバーを記録しているファイル
**・authorized_keys**
接続を許可する公開鍵を登録しておくサーバー側のファイル
**・config**
SSH接続の情報を書くファイル

調べると、configファイルの指定方法は下記のようになっているようです。
他にも設定できる項目はあります。

```
Host GitHub    　　　　　　　　　　　　　　　　　　　//Host名
    HostName github.com               　　　　　//接続先のIPアドレス
    IdentityFile ~/.ssh/id_rsa　　　　　 　　　　//秘密鍵のファイルパス
    User git                                  //SSH接続するユーザー名
```
`IdentityFile`のファイルパスが間違っていた為、うまく接続できませんでした。`config`ファイルを削除し、ローカルリポジトリへ戻り、`git push origin master`を実行しました。

```
$git push origin master

#実行結果
Enter passphrase for key '/Users/[ユーザー名]/.ssh/id_rsa': 
Enumerating objects: 117, done.
Counting objects: 100% (117/117), done.
Delta compression using up to 4 threads
Compressing objects: 100% (97/97), done.
Writing objects: 100% (115/115), 59.17 KiB | 1.23 MiB/s, done.
Total 115 (delta 12), reused 0 (delta 0)
remote: Resolving deltas: 100% (12/12), done.
To github.com:[GitHubユーザー名]/[ローカルディレクトリ名].git
   54d630d..fa6f554  master -> master
```
成功しました。`config`ファイルを削除したのに、プッシュが成功したのはconfigファイルが明示的に追加で設定するファイルだからだと思います。

<img width="1024" alt="スクリーンショット 2020-01-22 0.13.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494944/4c8bd27e-14b5-5339-6c1b-b0cf7088bd20.png">

GitHubを確認するとプッシュできていました。`fa6f554`が実行結果の方にも書かれているのが確認できました。

##さいごに
`commit`が3日前になっていることもわかりますが、問題の解決・記事の作成に３日かかってしまいましたが、SSH通信での`秘密鍵`・`公開鍵`の仕組みを学ぶ良い機会になりました。まだまだ学ぶことが多いですが、今回はこれで。