Gitのすすめ with GitHub

# Gitのすすめ
こんにちは。
新卒マイナス一年目エンジニアの和尚です。

今回はプログラマーにとって切っても切り離せない**Git**についての記事を簡単に書いていこうと思います。

## Gitとは

>
(日本語訳)**Git**は、小規模から大規模なプロジェクトまで、あらゆる処理を高速かつ効率的に処理できるように設計された、 フリーでオープンソースの分散バージョン管理システムです。[git公式サイトより](https://git-scm.com)


開発を始めたばかりの人には、ピンとこないかもしれません。
**Git**や**GitHub**を聞いたことあるけど、なんだかわからない...
そんな人たちを対象に記事を書いていこうと思います。


Gitとはゲームに例えるとセーブデータのようなものなのですが、ただのセーブデータではなく、

- セーブした点に戻れる(前回のセーブ地点だけではなく、セーブしたところならどこでも)。
- セーブデータを分割できる。
- セーブデータを共有できる。

などなど、大まかにまとめるとこんな感じです。(詳しい人からすると怒鳴られそうな例ですね...)
こうして並べるとチートツールみたい!!

Gitを知る前の開発初心者だった一年前の僕は、こんな便利なものがあるとは知らず、作ったものを定期的にコピーしてzipファイルにまとめてバージョン管理をするという、今思うとだいぶ恥ずかしいことをしていました...

とにかく触って便利さを実感して見ましょう！！

## まずはGitをインストールする
Gitをインストールする方法はいくつかあり、公式サイトによるとソースからインストールすることが推奨されています。 
最新のGitを使用したい場合はソースからインストールするようにしましょう。

### windows

[windows用ダウンロードファイル](https://git-scm.com/download/win)

### mac
[Mac用ダウンロードファイル](http://sourceforge.net/projects/git-osx-installer/)

もしくは、Homebrewからインストールする。

```
$ brew install git
```

### Linux
Gitはcurl、zlib、openssl、expat、libiconvに依存しているので、導入しているパッケージ管理ソフトもインストールしてください。

#### yumの方

```
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
$ yum install git
```
#### apt-getの方

```
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
$ apt-get install git
```

## Gitを使用する前の事前準備

### gitに登録する
Gitを導入したら、まずユーザー名とメールアドレスを設定します。

```
$ git config --global user.name "あなたの名前"
$ git config --global user.email あなたのメアド
```
その他、エディターやdiffツールなども`$ git config ~`で設定できます。
詳しくは公式サイトや`$ git help congig`を参考にしましょう。

## Gitに触ってみる
一通り準備が終わったので、Gitを使っていきましょう。
Gitリポジトリを取得するには

### 1.作業ディレクトリを作成する

```
$ mkdir gittest
$ cd gittest
$ touch index.html //空なので適当にhtmlファイルを作成
```

### 2.Gitローカルリポジトリの作成
1.でGitで管理するテストディレクトリを作成しました。これらをローカルで管理できるようにしていきます。

#### 1.Gitリポジトリに必要なファイルの作成

```
$ git init
```
![スクリーンショット 2018-06-24 21.22.19.png](https://qiita-image-store.s3.amazonaws.com/0/243225/f9c7f04a-465d-807a-ac5c-056894b6a5c1.png)

- `$git init`をすることで`.git`ディレクトリが作成され、その中に必要なファイルが格納されます。

#### 2.指定したファイルをGitの管理対象に入れる

```
$ git add [追加したいファイル]
```
![スクリーンショット 2018-06-24 21.23.49.png](https://qiita-image-store.s3.amazonaws.com/0/243225/29b5b9c9-ee2e-c7fd-6cba-9fc1c709cebc.png)

- `$ git add [file name]`をすることで、Gitの管理対象に入れることができます。
- 作業ディレクトリ内のファイル全てを追加したい場合は`$ git add .`にすることで、全ファイルを管理対象にすることができます。

#### 3. ファイルの変更を保存する。

```
$ git commit -m "保存時コメント"
```
![スクリーンショット 2018-06-24 21.23.27.png](https://qiita-image-store.s3.amazonaws.com/0/243225/3f289372-c255-a6b9-dbf5-42b6f4fb5e98.png)

- `$git add [file name]`で追加したディレクトリやファイルを保存する為に`$ git commit`をします。
- オプション`-m`はメッセージを書く場合に使用するオプションです。

#### 4. commitを確認する。

```
$ git log
```
![スクリーンショット 2018-06-24 21.30.59.png](https://qiita-image-store.s3.amazonaws.com/0/243225/3f9e208f-cf2f-1d23-709f-41ac43556605.png)


上記のコマンドを打つことで、コミット一覧が見ることができます。

```
$ git show
```
上記のコマンドで、より詳細な情報を確認することができます。

#### 5. 前回のコミットまで戻す(ロールバック)
失敗して前回コミットした時点まで戻りたい時のやり方を見ていきましょう。
一番最新でコミットしたのが上の画像のコメントでいうところの、`second commit`だとして、`first commit`に戻してみましょう。
**使用するものは上の黄色のコミットidです。**

```
$ git reset --hard c17eb1355c1d9f239920348020351d20e4c198db
```

- `git reset --hard [コミットid]`とすることで、コミットidで指定したコミット時点まで戻ることができます。
- オプション`--hard`について知りたい人は各自調べてください。

実際に作業しているファイルなどを見て、戻りたいコミット時まで戻れたかを確認してみましょう。


以上がGitの最低限の知識になります。

## Githubを使ってリモートリポジトリを使用する。
これまで、自分のPC上でGitを管理する方法を見てきました。
ここからはGitHubを使って、サーバー上にコミットした情報を送る作業を覚えていきましょう。

リモートリポジトリを使用することで、共同開発やソースコードの共有などを行うことができます。

**GitHub**以外にも、**GitLab**や**bitbucket**などのサービスがあり、自分にあった管理サービスを使用しましょう。
今回はGitHubを使用していきます。

### GitHubに登録する
とにもかくにもGitHubに登録しないことには始まりません。
→[GitHub登録ページ](https://github.com/)
#### 1.情報を入力
<img width="385" alt="スクリーンショット 2018-06-24 21.52.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/243225/dd3fa6ac-e894-0f74-964d-5bf7848cf45a.png">

#### 2.freeプランを選択しる
※月に7$掛かる有料プランもあります。

#### 3. 質問に答える
Q1. プログラミングレベル
Q2. GitHubの使用目的
Q3. あなたの立場
Q4. 興味のある分野

#### 4.メールを確認する

#### 5.SSH keyの登録をする。
1. PC上で`$ ssh-keygen -t rsa`と打つ。
2. Enterを押す。
3. パスワードと確認用パスワードを打つ。
4. `$ cat .ssh/id_rsa.pub`を打って、公開鍵をコピーする。
5. GitHub→Settings→SSH and GPG keys→New SSH keyをクリック。
6. titleとコピーした公開鍵をペーストしてAdd SSH keyをクリック。
7. 
<img width="222" alt="スクリーンショット 2018-06-24 22.16.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/243225/6e999b47-b925-b2e6-8b8e-b20e38d8ad0a.png">

<img width="753" alt="スクリーンショット 2018-06-24 22.18.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/243225/9526185a-f7d0-38c6-d7aa-ffa49e0dea9d.png">

<img width="1006" alt="スクリーンショット 2018-06-24 22.16.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/243225/708b30f7-eba1-c897-47a2-6d0b0d549b81.png">

ここまで終わったら、GitHubに登録完了&設定完了です。

### リモートリポジトリの作成
#### 1.New repositoryボタンを押す
<img width="370" alt="スクリーンショット 2018-06-24 22.00.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/243225/8a76f081-f490-5cdc-4641-6cd6b4850fdd.png">

#### 2.リポジトリ名を入力する。
<img width="739" alt="スクリーンショット 2018-06-24 22.00.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/243225/b0ad77fd-0a6d-95f1-e477-e4cb4d420d98.png">

- 説明は任意です。
- Privateリポジトリ(非公開)を作成するには、有料プランに加入しましょう。(もしくは学生プランに加入する:無料)
- とりあえずは、`チェックボックス`、`.gitignore`、`ライセンス`は変更なしで大丈夫です。

#### 3.Create repositoryボタンを押す

### ローカルリポジトリとリモートリポジトリを繋げる。
PC上で`$git init`〜をやったことにより、ローカルリポジトリが作成され、GitHub上で`Create repository`をしたことによりリモートリポジトリが作成されました。

これらを接続してみましょう。

#### 一番簡単なのはコピー&ペースト

<img width="991" alt="スクリーンショット 2018-06-24 22.21.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/243225/8d150f24-aca5-2630-617e-1ee869d4b88d.png">

- 赤く囲ったところを押すと左側のコマンドが全てコピーされるので、先ほど作ったローカルリポジトリ内でペーストすれば、簡単に接続できます。
- パスワードを要求されるので、公開鍵を使用した時に打ち込んだパスワードを入力します。

#### コピーした内容を一行ずつ見ていく

##### 1.README
```
$ echo "# test" >> README.md
```
まずこのコードですが、見たまんま`README.md`ファイルを作成し、`#test`という文を記入しています。

このREADME.mdファイルですが、リポジトリの説明書になっていて、マークダウン方式で記入します。

##### 2.git init
```
$ git init
```

先ほど書いたのを覚えているかと思います。リポジトリに必要なファイルの作成をします。
※この記事を流れでやっている人は既に作成しています。

##### 3. git add
```
$ git add README.md
```

`README.md`(説明書)を監視対象に追加しています。

##### 4. git commit
```
$ git commit -m "first commit"
```

説明書のコミットです。

##### 5. git remote
```
$ git remote add origin git@github.com:osyou-create/test.git
```

ここがローカルブランチとリモートブランチを繋げるコードになります。
originとはリポジトリの別名です。
要するに`origin`という名前で`git@github.com:osyou-create/test.git`を登録するということです。

これで、ローカルリポジトリと作成したリモートリポジトリが繋がったのでコミット(ローカル保存)をリモートリポジトリにプッシュ(サーバーへ保存)していきましょう。

##### 6. git push
```
$ git push -u origin master
```

- `push` … リモートリポジトリに反映&保存させる。
- `origin` … 送り先リポジトリ(この記事でいうところの`git@github.com:osyou-create/test.git`)
- `master` … ブランチ(保存先)。
- `-u` …次回以降`$ git push`のみでorigin masterにプッシュしてくれる。

開発初心者の僕はとりあえず、masterブランチとdevelopブランチ二つに分けて開発していますが、Gitに慣れたら[A successful Git branching model](https://nvie.com/posts/a-successful-git-branching-model/)を参考にブランチを作って開発をしていきましょう。


## 最後に

ここまで書いたのは最低限のGitの知識なので、自分で調べて使いこなせるよう頑張ってください。

とりあえず慣れるまでは、masterブランチのみで開発をしていき、慣れたらすぐにブランチについて調べて`merge`や`checkout`など勉強しましょう。

[souceTree](https://ja.atlassian.com/software/sourcetree)などのGitクライアントを使用するとGitがもっと簡単に使えるようになるでしょう。

## 参考資料

[Git公式サイト(日本語ドキュメント)](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B)