研究室用に作成したGitHubマニュアルを共有する① ～Gitの歴史と環境構築について～

# はじめに
今回の記事は、自分が所属する研究室のために作成したgithubマニュアルの共有になっています。

GitHubについてほとんど知らない人を対象に作成しているので、知っている人からすればかなりくどい説明になると思います。

お付き合い頂ければ幸いです。
コマンドを確認したい人は[こちら](https://qiita.com/renesisu727/items/737faf0829003dce431b)

##そもそもGitHubとは

GitHubの説明の前に、Gitの説明からはいります。Gitとは、簡単に説明するとファイルのバージョン管理システムのことです。
ファイルの変更履歴を各々のパソコン（ローカル環境）に保存することで、その変更履歴をたどることでファイルの状態を戻すことができます。

GitHubとは、そのGitをオンライン上に設置することで、集団でのファイルの編集を可能にするサービスのことです。

GitHubはGitHub社という会社により運営されていましたが、近年マイクロソフト社によって買収されました。

##Gitの歴史
Gitを開発したのは、かの有名な世界最大規模のオープンソースソフトウェアであるLinuxの創造主であるリーナス・トーバルズです。
Linuxの開発は複数人のエンジニアにより行われるのですが、Linuxに対するどの変更を許可し、またどの変更を許可しないかなどを管理するバージョン管理システムが使用されていました。

元々Linuxの開発にはBitKeeperというバージョン管理システムが使われていたのですが、ライセンスなどの問題で開発元のBitMover社とLinux開発コミュニティとの間の協力関係が崩壊してしまい、急遽別のバージョン管理システムが必要になりました。

それにより生まれたのがGitです。つまり、GitはLinuxプロジェクトのために開発されたものなのです。

Linuxは1500万行にも及ぶコードから構成されるとても大規模なプロジェクトです。そのため、Linuxのためのバージョン管理システムであるGitには動作速度に非常に優れていて、また大人数で取り扱うことができるようにプロジェクトの枝分かれさせた「ブランチ」の並列開発が可能になっています。

##Gitの特徴
従来のバージョン管理システムはファイルの変更差分を記録していましたが、Gitは各々のファイルのバージョンをスナップショットとして保存していることが挙げられます。違いを図で見比べてみましょう。差分を記録する場合は以下のようになります。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/f524b21a-8042-386d-3411-ceaf2f5b6924.png)


上図のように、変更差分を「レポジトリ」という場所に記録することで、バージョン管理を行うのが従来のバージョン管理システムでした。

しかし、この管理の仕方の場合、大規模なプロジェクトにおいて枝分かれして開発を行い、それを統合するときに全ての差分を計算しなければならないため、非常に時間がかかっていたのです。（枝分かれして開発するときの枝のことをブランチといい、そのブランチを統合することをmマージと呼びます）。

そこで、Gitは以下のようにバージョン管理システムを変更したのです。

![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/c08047f7-7816-c6a4-9bb3-5c595d04c7a9.png)


このように、各々のファイルの状態をスナップショットとして記録することで、枝分かれした開発のブランチをマージする際に非常に高速になります。

このGitのファイル管理の仕方は非常に重要なので、しっかりと頭に入れておいてください。

## とりあえずGitHubとGitを使えるようにする
とりあえず、GithubとGitの環境構築をしていきましょう。

###Gitのダウンロード
自分の環境がWindowsであるため、Windowsにおける説明が主になります。「git for windows」を[公式サイト](https://gitforwindows.org/)からダウンロードしましょう。Macの人は[こちら](https://prog-8.com/docs/git-env)の記事を参考にインストールしてみてください。

ダウンロード後は、ダウンロードのショートカットにあるexeファイルからインストーラーを実行しましょう。流れにそってNextを押しまくれば、インストールは終了です。

インストールが終わった後、画面左下のWindowsのマークを押して、Gitのプログラムを探してみてください。Git BashやGit GUIなどのソフトがダウンロードできていれば成功です。

### GitHubへの登録
Gitのダウンロードが終了した後は、[こちら](https://github.com/)からGitHubのアカウントの取得に取りかかりましょう。右上のSign upと書かれているところから、ユーザーネームとメールアドレスとパスワードを登録して、アカウントを作成してください。無料プランでも有料プランでも、どちらでも構いません。そんなに重要な選択肢はないので、流れに合わせていけばアカウントの作成は完了です。

###GitHubへの公開鍵認証(SSH接続)について

ローカルの環境のGitとサーバー上のGitHubの接続には、公開鍵認証によるSSH接続が多く使われています。今回はその設定を解説します。個人的には、この部分がはまりポイントの一つだと考えています。まずは公開鍵認証の説明をはじめます。

公開鍵認証とは、リモートのコンピューターとローカルのコンピューターを安全に接続する方法です。秘密鍵と公開鍵を用いて、接続を行います。イメージとしては、公開鍵が南京錠のようなもので、秘密鍵がその南京錠のカギのようなものです。

今回の例では、公開鍵をGitHubのアカウントに渡します。そうすると、GitHub側では公開鍵（南京錠）を用いて接続をロックし、その南京錠の鍵である秘密鍵を持つ人だけの接続を許可するようになります。以下に図解します。
![9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/32ab7a0f-8b0c-d13b-6c16-3972c1eb8921.png)

分かりにくい図になってしまった感じがありますが、解説します。左のGitHubのサーバー上に公開鍵がある場合、その公開鍵を開ける秘密鍵をもっているのは上の笑顔の人だけであるため、笑顔の人はログインできますが、下の明らかに悪人顔の人はログインできません。このようにして、セキュリティを高めているのです。

###GitHubへの公開鍵認証のやり方

[こちら](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)のサイトを参考にしたら恐らくできると思いますが、失敗しないように、注意ポイントを解説します。

まず以下コマンドでフォルダを移動してください。

```
cd ~/.ssh
```

~/.ssh はホーム直下のsshファイルの保存場所を表しています。

できるだけ、この場所で鍵の生成をして下さい。なぜなら、別の場所で秘密鍵を生成すると、「こんな安全じゃない場所の秘密鍵なんて使いたくない」というエラーが発生する場合があるからです。

Macならchmodコマンドで鍵の安全度を変更することができますが、Windowsでは鍵の場所を移動させるしかないため（他に方法があるのかもしれませんが）、少し面倒くさいです。

そして、GitHubがデフォルトで見に行く鍵の場所が「~/.ssh/id_rsa」、「~/.ssh/id_dsa」、「~/.ssh/identity」の三つであるため、別の場所で鍵を作成したり、また作成した鍵の名前を変更したりすると、GitHubに鍵の場所を教えるために「~/.ssh/config」にファイルを作成し、鍵の場所についての情報を記載する必要があります。


次は以下のコマンドを実行しましょう。

```
ssh-keygen -t rsa
```

このコマンドを実行すると最初に鍵を生成する場所を聞かれます。デフォルトでは.ssh/ 直下に「id_rsa」と「id_rsa.pub」という名前で秘密鍵と公開鍵が作成されます。「id_rsa.pub」が公開鍵で「id_rsa」が秘密鍵です。このデフォルトの名前で保存すると、「~/.ssh/config」に鍵の場所を記載せずともデフォルトで見にいってくれるので、特にこだわりがない限りはそのままでいきましょう。一回エンターを押します。

次にパスフレーズを聞かれますが、これは秘密鍵を使用する際に使われるパスワードのようなものです。設定しなくても問題はありませんが、セキュリティが心配なら適当なパスフレーズを入力しましょう。


次は、公開鍵を[こちら](https://github.com/settings/ssh)からGitHubにUPしましょう。titleに公開鍵の名前を(そんなに重要ではない)、Keyに公開鍵の中身を貼り付けましょう。公開鍵の中身を貼り付けるときに、/.ssh/id_rsaからファイルを開こうとしても恐らく開くことができないので、以下のコマンドでクリップボードにコピーしてください。

>$ pbcopy < ~/.ssh/id_rsa.pub (Mac)
>$ clip < ~/.ssh/id_rsa.pub (Windows)


公開鍵をUPしたら、次のコマンドで実際に接続が上手くいっているのか確かめてみましょう。

```
ssh -T git@github.com
```

以下のメッセージが返されれば成功です。

>Hi (account名)! You've successfully authenticated, but GitHub does not provide shell access.

もしも失敗してしまった場合は「~/.ssh/config」を作成し、以下の文章を貼り付けましょう。

```
Host github github.com
HostName github.com
IdentityFile ~/.ssh/id_rsa
User git
```

三行目のIdentityFile の後ろは自分の秘密鍵のPATHを入力してください。


vimエディターが入っている場合は

```
vim ~/.ssh/config
```

とするとconfigファイルを作成することができます。

###Gitの初期設定
これで最後の設定です。自分のローカルのGitに、リモートのGitHubのメールアドレスと場所を教えてあげましょう。Macの方はターミナルを、Windowsの方は全てのプログラムからGit Bashを開きましょう。開いたら、以下のコマンドを入力してください。

```
git config --global user.name 'user_name' # user_nameにはGitHubに登録したuser nameを入力

git config --global user.email 'user@gmail.com' # user@gmail.comにはGitHubに登録したメールアドレス
```

上のコマンドを入力すると、homeの直下にある「.gitconfig」ファイルに変更が入力されます。このhome直下の.gitconfigファイルはGit全体の設定に関わるファイルであり、上記のコマンドを入力することでローカルのGitにネットワーク上のGutHubを登録することができます。以下のコマンドで、きちんと登録されたか確認することができます。

```
git config user.name
git config user.email
```

上のコマンドで、自分が登録したアカウント名とメールアドレスが表示されれば成功です。

## 終わりに
今回はここまでになります。次回はgitの細かいコマンドの解説になりますので、お付き合い頂ければ幸いです。

[研究室用に作成したGitHubマニュアルを共有する②~GitHubにpushするまでのコマンドまとめ~](https://qiita.com/renesisu727/items/737faf0829003dce431b)
[研究室用に作成したGitHubマニュアルを共有する③~ブランチとマージについて~](https://qiita.com/renesisu727/items/39bb2ef75516a97f7e69)