初めてのGitHubの導入から利用方法まで。SVNとの違いも！！

## はじめに

今回のチームでの開発においてバージョン管理システムはGit(GitHub)を利用したので、
導入手順から利用方法まで説明したいと思います。
仕事ではSVNを利用しているので、SVNとの違いも語りたいと思います！！

## アジェンダ

1. Git ＆ GitHubとは？
2. Gitに関する用語
3. SVNとの違い
4. 導入メリット
5. GitHubアカウント作成方法
6. ブランチ作成 〜 コミット・プッシュ方法
7. リモートリポジトリからローカルへの取り込み方法
8. リンク集
9. 最後に


## 1. Git ＆ GitHubとは？
■ Gitとは
プログラムのソースコードなどの変更履歴を記録・追跡するための**分散型**バージョン管理システム。
元々は、Linuxカーネルのソースコード管理に用いるために開発された。そのため大規模なリポジトリを扱いやすい。

■ GitHubとは
Gitを利用した、開発者を支援するWebサービス。
クラウド上でGitを用いたバージョン管理をすることができ、さらにGitにはない開発者に便利な機能を追加(*プルリクエストなど。)

*プルリクエスト(Pull Request)とは
ソースコードの変更点について他のメンバーにレビュー依頼ができる機能。レビューがOKとなったソースコードだけを反映させることができるので、品質の向上に役立つ。

## 2. Gitに関する用語

基本的な用語のみピックアップ！！

ワーキングツリー：現在作業している場所
インデックス：コミットするためのファイルを登録する場所
ローカルリポジトリ：リモートリポジトリに送るためのコミットを記録する場所
リモートリポジトリ：複数人で共有するためのリポジトリ
HEAD：今いるブランチの最新のコミットID
Origin：リモートリポジトリのアクセス先に対してGitがデフォルトでつける名前


## 3. SVNとの違い

Gitは分散型バージョン管理システム。
それに対して、SVNは集中型バージョン管理システム。

- これによって何が違うかと言うと、Gitでは**開発者がローカル上でソースのバージョンを管理することができる。**<br>

Gitはリモートリポジトリという本体はあるが、コミットは各開発者のローカルリポジトリにもできる。そのため分散型バージョン管理システムと言われる。
その一方、SVNはローカルリポジトリと言うものはなく、各開発者は直接リモートリポジトリにコミットするしかない。そのため、集中型バージョン管理システムと言われる。

・Git＆SVNのコミットの流れ
Gitは**コミット(ローカルリポジトリへ)してから、プッシュ(リモートリポジトリへ)**するのに対して、SVNは直接**コミット(リモートリポジトリへ)**する。


・コマンド比較

| コマンド内容       | SVN              |    Git             |
|:-----------------|:----------------:|:------------------:|
| リポジトリの複製    |         checkout |        clone       |
| コミット           |           commit |       commit       |
| コミット内容の確認  |          cat     |        show        |
| 現在の状態の確認    |          statu   |        status      |
| 変更した差分の確認  |          diff    |        diff        |
| ログの確認         |          log     |        log         |
| ファイルの追加     |          add     |        add          |
| ファイルの移動     |          mv      |        mv           |
| ファイルの削除     |          rm      |        rm           |
| ファイルの変更の取消 |      revert     | checkout / reset    |
| ブランチの作成　　　|      copy        |        branch       |
| ブランチの切り替え |        switch     |        checkout     |
| ブランチのマージ	  |     merge         | 	merge       |
| タグの作成        |         copy     |        tag          |
| ローカルの更新　   |     update       | pull / fetch        |
| リモートへの反映　 | 	  commit     |         push        |

## 4. 導入メリット
1.ローカルコミットができる。
→作業単位毎に気軽にコミットでき、編集・バグ検知しやすい。

2.ブランチが簡単に切れる
→気軽にブランチを切ることができるため、他の開発者に影響を与えず開発しやすい。
      SVNのブランチとマージにはかなりの「制約」や「コスト」がかかる。

3.機能が充実し、操作体系も洗練されている
→GitHubなどのホスティングサービスも充実。コマンドも充実。

4.世界の標準はGit
→近年ではSVNを抑えて圧倒的(!?)シェア

## 5. GitHubアカウント作成方法

以下のサイトにアクセスし、ユーザー名、メールアドレス、パスワードを作成する。

・公式サイト
https://github.com/


## 6. ブランチ作成 〜 コミット・プッシュ方法

■ githubにコミット・プッシュする際の大まかな流れ（初回）
　①ローカルリポジトリを作成し、作業内容をコミットする
　②ローカルリポジトリにコミットした内容をリモートリポジトリにプッシュする


・①の例：”upallnight”というローカルリポジトリを作成し、moc.htmlをコミットする

1.ローカルリポジトリの作成方法

```
$ mkdir upallnight  (upallnightディレクトリを作成)
$ cd upallnight    (upallnightディレクトリに移動)
$ git init      (upallnightディレクトリをリポジトリに設定)
``` 


2.ローカルリポジトリにコミットを行う方法

```
$ git add moc.html      (gitにコミットする前にインデックスに追加)
$ git commit -m “add new file”  (gitにコミットする。コメントとして“add new file”を設定)
$ git status (gitのインデックスへの追加状態、コミットされていないものがないのかを確認できる)
```


・②の例：”develop/XXX”ブランチを作成し、ローカルリポジトリにコミットした内容を
		AAA/BBBリモートリポジトリにプッシュする(AAA/BBBは仮のリポジトリ名)

1.ブランチの作成方法

```
$ git branch develop/XXX  (develop/XXXブランチを作成)
$ git checkout develop/XXX  (develop/XXXブランチに移動)
$ git branch (現在のブランチ一覧を確認できる。＊がついているブランチが選択されているブランチ）
```

2.リモートリポジトリへのプッシュを行う方法

```
$ git remote add origin https://github.com/AAA/BBB.git
$ git git push origin develop/XXX
```

## 7. リモートリポジトリ最新取り込み

・初回_ブランチをローカルに丸々取り込み

```
git clone -b ブランチ名 https://github.com/AAA/BBB.git(リモートリポジトリ)
→ターミナル上から叩くと、カレントディレクトリにブランチをコピー
```

・2回目以降_差分取り込み

```
git fetch origin manInTheMirror
git merge FETCH_HEAD
```

もしくは

```
git pull origin manInTheMirror ←推奨しない！！！
```

上記、二つは同じ意味。pullコマンドはfetchとmergeのショートカットコマンドの為。
(内部で「fetchコマンド」と「mergeコマンド」を順次行ってくれている)
「fetchコマンド」で更新を取得し、内容を確認したのちに、マージ作業に取りかかるべきです。
ちなみにFETCH_HEAD とは、git fetch 実行時に保存される参照情報。 


## 8. リンク

以下は参考にさせて頂いた記事・サイト等です。
この場をお借りしてお礼申し上げます。

・用語集
https://qiita.com/nh321/items/6517b0964c6ed1685ecf

・コマンド集
https://www.sejuku.net/blog/5816
https://qiita.com/kohga/items/dccf135b0af395f69144

・公式_GUIツール(SourceTree)
https://ja.atlassian.com/software/sourcetree

## 9. 最後に

業務でSVNを使っていた分、最初はコマンドの違いなどに戸惑いました。。。汗
ただ慣れてくると気軽にローカルリポジトリにコミットできバージョン管理ができるので、過去にどういう修正をしたかなど追いやすいです！
世間ではSVNよりGitの風潮なので機会があれば、まだ使ったことがない人はぜひこの機会に＾＾

ちなみにGitのGUIツールのSourceTreeはかなり使いやすのでオススメです！