🤯

【GitHub超初心者向け】SSH keyでGitHubに接続してみる

2022/09/26に公開約8,400字

はじめに

GitHubって、プログラマーなら使えて当然みたいな顔して、なんであんなに複雑で難しいんでしょうか?

しかも、「GitHub 初心者」とかでGoogleサーチしてヒットする指南ブログを見てその通りにやってもエラーだらけで、一つのファイルをpushするのに膨大な時間が奪われました…

多くのブログ執筆者が前提知識を多く持ちすぎていて、本当の初学者が当たり前にできないことをスキップしているように感じました。(まあ仕方ないよね)

多くの技術ブログに書かれている、「未経験でも挫折しない〜」とか、「簡単たったの○ステップで〜」は少なくとも僕にとっては全くそうではありませんでした。ただのいちツールのいち機能を使うのにここまで時間が奪われて、さらに脳みその記憶容量までも圧迫されたくないので、記事としてメモを残しておくことにしました。

今はまだ僕自身のGitHubへの理解が浅いので、わかったことが増えてきたら追記するか、別で記事増やそうと思います。(熱量があれば)
また、理解が完璧でないために、記事の中で厳密でない記述や、間違った記述をしてしまうことがあるかもしれません。発見次第、直していこうと思います。


やりたいこと

とにかく、GitHubで「バージョン管理」なんて高尚なものじゃなくていい。とりあえず「ファイルをサーバー上で共有」できればいいや。ブランチなんて知らない。くらいが今回の記事の目標です。


動作環境

  • MacBook Air(M1, 2020), macOS Monterey 12.0.1
  • git version 2.32.0 (Apple Git-132)

まず準備すること

  • Gitのインストール
  • GitHubのアカウント登録

ここまでは別の型の記事でも見て準備をお願いします。色々いじってしまって、どこまで進んでいるかすらわからない。という人は、とりあえずターミナルでgitとだけ打って実行しましょう。これでcommand not found: gitみたいなエラーメッセージが出たら多分インストールされていません。色々とコードのオプションがずらっと表示されれば、gitが動かせます。

アカウントの登録が終わっていれば、次に進みましょう。


1. Gitの環境設定

まずこの章では、ターミナルからgithubに接続をするところまでをテストします。(この過程を簡単に飛ばしすぎている技術ブログが多すぎる!)自分はここでかなり足止めをされました。


リポジトリの作成

まずはWeb browserでも、desktopアプリのどちらからでも良いので、GitHub上にリポジトリ(pushしたいファイルの置き場所)を作成します。

①アイコン画像のカラムを出して、②Your repositoriesをクリック

③Newをクリック

④Repository nameを設定、⑤Create repositoryに続きます。

⑥HTTPSとSSHですが、ここでSSHの方を選択します。

一旦ここまででGitHub上での操作は終わります。次に、ターミナルの方からGitHubに接続するための操作をしていきます。


暗号キーの作成

先ほどの章の最後に、HTTPSとSSHの選択を迫られた段階がありましたが、あれはどちらも、自分達のパソコンとGitHubのサーバーとの通信をするためのものです。通信には暗号が必要になるので、SSHという暗号キーを用意しなければなりません。

暗号キーをすでに持っている人はここまで飛ばしましょう #暗号キーをGitHubに登録←ページ内リンク

zsh
% ssh-keygen -t rsa

よくわからないでやってますが、聞いたことのあるRSAという暗号方式でSSHキーを生成してみました。(-t rsaはつけなくても大丈夫らしい)

実行すると、メッセージが返ってきます。↓

shell-session
% ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa): # 何も入力せずにエンターしました
Created directory '/Users/ユーザー名/.ssh'.
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:(ここに載せて良いのかわからないので省略。結構長い英数字の文字列が表示されます。)

メッセージの意味としては、

  • SSHキー(公開鍵/秘密鍵)の生成
  • キー保存場所のディレクトリを作成
  • パスフレーズを設定(オプションらしいので僕は設定しませんでした。)
  • いろいろと結果報告みたいなメッセージ

ファイル?キーが保存されているか確認してみます。

shell-session
% cd ~/.ssh # 作業ディレクトリを.sshに変更
% ls # .ssh内のコンテンツを確認
id_rsa          id_rsa.pub

ちゃんと、id_rsa(秘密鍵)と、id_rsa.pub(公開鍵)が保存されていました!

秘密鍵は誰かに教えちゃいけないらしいです(自明)


暗号キーをGitHubに登録

続いて、パソコンとGitHubサーバー間をコネクトさせるため、暗号キーを登録します。

①ユーザーアイコンから、②Settingsをクリック

③SSH and GPG keys、④New SSH key

ここでまたターミナル操作に戻ります。

shell-session
% cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7efupcaXGdnyVQ4B5T8PH/hK1MjApg2LcSttx8XEsXw2BbIrL8M5S+Ys3dg+tYsxjVOrQjajQ+WQfr97Zw01HmYJ//tPM8PgviNMzz+sIcdAyghZQm7RaDrPGKH(中略)= (略)MacBook-Air.local

この、ssh-rsaから始まる後ろの文字列全部をクリップボードにコピー(command + C)しておきます。

GitHubに戻ります。

⑤適当なタイトルをつけて、⑥SSHキーをペースト(command + V)して、⑦Add SSH keyをクリック

これで、GitHubの方に暗号キーの登録をすることができました〜!(多分)


接続テスト(一応確認)

念のため、ターミナル上からgithubにつながるかどうか確認してみます。

ssh -T git@github.comを実行します。

おそらく、この記事の読者は初めての接続テストを行っていることでしょう。なので、authentication cannot be establishedみたいなメッセージが出ます。でも大丈夫、それでうまくいっています。

何度かEnterと、yesの入力をしましょう。 この操作で、ホスト側の公開鍵を受け取って保存することができます。

(これが出ずに、Hi ユーザー名! You've successfully authenticated,~~とアクセプティングされた方、おめでとうございます。)

shell-session
% ssh -T git@github.com
The authenticity of host 'github.com (20.27.177.113)' can't be established.
ED25519 key fingerprint is (略: ホスト(GitHub)側の公開鍵が表示されます)
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes 
# yesと入力してEnter
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
Connection closed by 20.27.177.113 port 22

これでホスト側の公開鍵を.sshディレクトリへ追加できたので次はテスト接続できるはずです。

shell-session
% ls # ディレクトリ内のファイルを確認
id_rsa          id_rsa.pub      known_hosts

ちゃんとknown_hostsが追加されています。もう一度、接続テストを行ってみましょう。

shell-session
% ssh -T git@github.com
Hi ranohiro! You've successfully authenticated, but GitHub does not provide shell access.

We seem to have gotten authentication successfully! yaaaay!


2. ファイルのpush

GitHubへの接続が確立されたので、次はファイルをプッシュ(GitHubへファイルの登録)します。

僕はDesktop下に、testフォルダを作ってみました。

shell-session
% cd ~/Desktop/test #working directoryの変更
% touch index.html #ファイル作成
% ls #pushしたいファイルがあるか確認
index.html

そしてありがちなhtmlファイルを作成しておきます。今回は、このファイルをGitHubのリモートリポジトリへpushします。


git init

shell-session
% git init #gitの全ての始まりのコマンド
Initialized empty Git repository in /Users/ユーザー名/Desktop/test/.git/

Initialized~ に続いて、hintというメッセージが出てきますが、とりあえず無視して大丈夫です。

zsh
% ls -la

隠しファイルのなかに、.gitが見つかればgit initが成功しています。


git add

gitが開始できていたら、まずはgit statusで現在の状況確認をします。

shell-session
% git status
On branch master

No commits yet

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

nothing added to commit but untracked files present (use "git add" to track)

状況を見てみると、master branch上にはまだ何もなくて、ステージング待ちの(置いてあるだけでまだ何もされていない)ファイルがひとつ(index.html)あります。

このindex.htmlを、git addでステージングさせ、もう一度状況確認をしてみます。

shell-session
% git add index.html
% git status
On branch master

No commits yet

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

今度は、Changes to be committedに、index.htmlがステージされているのが確認できました。


git commit

「ステージ = 仮commit状態」だと思ってください。この状態になれば、commitできるようになります。

shell-session
% git commit -m "init commit" 
[master (root-commit) 399ec4d] init commit
 1 file changed, 11 insertions(+)
 create mode 100644 index.html

git commitの後ろに、-m ""をつけることで、commit messageの入力もできます。(これをしないと別ウィンドウを開いてそこからメッセージ入力の必要性あり?)

これで、index.htmlをリモートリポジトリにpushすることができるようになります。


git remote add

ようやくpushか!と思えば、あと1段階挟みます。

次にプロジェクトのプッシュ先を指定するため、GitHubのリモートリポジトリのURLをコピーしておきましょう。

ユーザーアイコン>Your repositories>該当リポジトリ>①のURLがSSHの方になっていることを確認し、クリップボードにコピー

git remote addします。

zsh
% git remote add origin <さっきコピーしたURL>

念のため、URLが設定されているか確認します。

shell-session
% git remote -v
origin  git@github.com:ranohiro/test-git.git (fetch)
origin  git@github.com:ranohiro/test-git.git (push)

fetchとかpushとか、意味はわかりませんが、こいつらが表示されていれば成功しているらしいです!


git push

ようやく、ファイルをリモートリポジトリにプッシュできます。(段階踏みすぎでは!?)

shell-session
% git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 386 bytes | 386.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:ranohiro/test-git.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

commandはgit push -u origin masterで、一番はじめに-uオプションを実行してあげると、後々はgit pushの後ろに余計なcommandを打たなくて良くなります。

ここまででエラーメッセージが出なければ、GitHubのホームページを更新してみるとファイルがpushされているのがわかると思います!


なんかよくわからなくなったら…

僕がやりがちなことですが、いろいろなウェブサイトを参照してその都度異なるソースのcommandを実行していると、環境がめちゃくちゃになってしまう(?)ことがあると思います。その時にはgit環境のリセットをしましょう。

zsh
rm -rf .git

このコマンドを、リセットしたい.gitがあるディレクトリ下で実行します。これでgit init前の状態に戻すことができます。

おわりに

ここまで記事書いた感想、GitHubめちゃくちゃ初心者に厳しいツールじゃないですか??GitHubにユーザー登録してから初めてのpushに成功するまでにふた月以上かかりました…(途中で学会挟んだから仕方ないところもあるかな。)

プログラミングは環境依存が大きいのと、僕らのような初心者は思わぬミスを繰り返すので、この記事を読んでも解決しない人もいるとは思いますが、少しでも誰かの役に立てれば嬉しく思います。


Reference

Discussion

ログインするとコメントできます