GitHubを完全に理解したい #1 Gitを理解する

# 概要

お久しぶりです
最近ありがたいことにチーム開発をする機会が増えて、改めてGitやGitHubについて人に教えられるぐらいちゃんと理解したいと思い今回記事を書いてみることにしました
今回は第一回ということでGitHubを理解する前にGitと基本用語の復習と環境構築の手順をまとめました

いまさら人に聞けないGitに関する基礎知識、これさえ読めば完全に理解できるでしょう…たぶん

なお筆者はWidows環境で開発しているのでMacでの環境構築とは解説等少し異なるかもしれませんので、その点ご理解いただけると幸いです💦

# 目次
[事前準備](#事前準備)
[1. Gitってなんだ？](#1-gitってなんだ)
[2. Gitを理解する](#2-gitを理解する)
[3. Gitのインストール](#3-gitのインストール)
[4. Gitの設定](#4-gitの設定)
[あとがき](#あとがき)

# 事前準備
GitHubについて勉強する前にそもそもGitとはなんぞ？と思う人もいるかもしれません
なんかチーム開発で共同作業できる便利なツール！ぐらいにざっくり知ってて使ってる人も多いと思います
これを機にしっかり復習しましょう👍

## 1. Gitってなんだ？
そもそもGitとは…
##### 「ソースコードのバージョンを管理するツール」
ソースコードのバージョン管理？それができてどう便利なんだ？って思う人もいるかもしれません
今までこんな経験はありませんでしたか？
- 余計な変更を加えたソースコードそのまま保存しちゃった！元に戻したい！
- 開発途中のソースコードの続きを友達に作ってもらったけど、どこがどう変わったのか分からない！

そんなお悩みをさっくり解決してくれるのがGitと呼ばれるツールです
- [x] ソースコードの変更前と変更後の違いを確認することができる！
- [x] セーブした地点に巻き戻すことができる！

RPGに例えるならダンジョンの前でセーブして、上手く攻略できなかったらダンジョン前のセーブ地点に戻ることができたり、苦手なボス戦を友達に任せることができる！しかもリプレイ機能付きで攻略してるところを見返すことができる！そんなイメージです（今どきのゲームはオートセーブか…）

## 2. Gitを理解する
Gitについてなんとなく分かったところで、Gitでよく登場する用語をもとにGitがどういうものなのか理解していきましょう

### リポジトリ(Repository)
たぶんみんなが一番よく目にする概念ですね
リポジトリとはずばり、**管理したいソースコードのひとつのまとまりのこと** です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/bb224ddb-709e-4f94-80bf-a98d34d04701.png)
HTMLとかCSSとかJSなどなど…それらソースコードをまとめた大きなフォルダのまとまりのことをそう呼んでいます
このフォルダの中で必要なファイルを追加したり、ソースコードを編集、削除したりしますよね

### コミット(Commit)
で、これらリポジトリに行う様々な操作を記録（セーブ）することをコミットと言います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/013d9886-647d-754c-646b-839dfe9f0d40.png)
基本的にソースコードに何か１つ編集を加えたらすぐコミット！を心がけましょう
ゲームもこまめにセーブするのが大事っていうよね

### ブランチ（Branch）
ただ、闇雲にコミットをしていいわけではありません
一つのセーブデータに上書きしながらセーブしていくと誤ってゲームが積んでしまうことがあるのと同じように、開発においても闇雲なコミットによって作ってるものが壊れてしまうリスクがあります
そんな事故を防ぐために、Gitにもセーブデータを別の場所に複製できる機能があります

それが**ブランチ**です

我々エンジニアたちの間では「複製する」というよりも「分岐させる」と表現するのが一般的ですね
だからブランチ（木の枝）って呼ばれているんですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/8ce274e6-bfb9-c7e0-f650-a87e16b5f9fe.png)

具体的にどういった場面で使われるのかというと、
例えばここまで開発が順調に進んでるプロジェクトがあるとしましょう
そこでこんなことがあったとします
- デザインが気に入らないからちょっと作り直したいけどまた戻したくなるかも…
- 次につくる新機能は○○君に任せたいけど安心して任せていいのかな
- お客さんからの要望で新しい機能を追加したい！でもサービスを止めるわけにはいかない…

これらの悩みをすべて解決しましょう！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/b6527d61-5db5-c2aa-90a1-2cb98917ae86.png)
ブランチを活用すると上記の図のようにリポジトリを分岐させることができます
この時、分岐元（上の段）となる青いリポジトリがある場所、一番太い幹をmainブランチと呼びます
mainブランチには必ずバグのない正常なソースコードが管理されていなければなりません
最終的にこのmainブランチにあるソースコードが世に公開されるものと考えましょう

それに対し、今回上の図では赤色の「ブランチA」と呼ばれるブランチが作られました
このブランチはさっき紹介したmainブランチとは別のセーブデータなのでここで変更された内容はmainブランチには一切反映されません
つまり、mainブランチで正常に動いているソースコードを傷つけることなく新たに機能を追加したり編集することができるわけです！すごく便利ですよね！

「あれ？」

勘のいい皆さんならお気づきのことでしょう
ブランチAで編集した内容がmainブランチに反映されないなら何のためにブランチがあるんだ！新機能作った後はどうすればいいんだ！

### マージ（Merge）
ちゃんとその悩みに応えてくれる機能があります
それが**マージ**です
マージとは、あるブランチに対して別のブランチを取り込むことをいいます
先程ブランチAで完成させた新機能をmainブランチに反映させちゃいましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/2e85e6f3-026e-8bb0-44e2-57ae8c3c2df5.png)
このようにマージを使うことで攻略の進んだ別のセーブデータで古いデータを上書きすることができます
これで安全にmainブランチに新機能を追加することができました

この他にもいろいろな単語が登場してきますが実際に触りながらの方が理解しやすいのでここからはGitが使えるようにセットアップしていきましょう

## 3. Gitのインストール
https://git-scm.com/download/win

上記のリンクにアクセスすると下の画像のようなページに飛ぶと思います（下記Windows環境のインストール手順になります）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/ea8026c9-1c17-ab48-1523-66cc3e18bb26.png)
画像の赤枠で囲った部分をクリックするとインストーラがダウンロードできます
そのままデスクトップ等分かりやすい場所に落としましょう
インストーラを起動します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/56182475-0ccd-2b3a-a265-e76b95991040.png)
保存場所、コンポーネント、スタートメニューフォルダはそのままNext→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/17ff63f2-a631-9732-c4da-58a5f87b9a91.png)
デフォルトのエディタ設定です
VSCodeを使ってる場合は「Use VisualStudioCode as Git's default editor」を選びましょう
VimとかSublimeTextとか他のエディタ使っている人はそれぞれ適したエディタをプルダウンから選択してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/e459d45a-5a3e-cc6a-a785-9915c91dd995.png)
イニシャルブランチ（前述したmainブランチのこと）の名前の指定ができます
下を選んでmainと入力しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/20cc87c4-15c7-ab19-6107-f80f55727e69.png)
GitのPATH環境変数の設定です
真ん中を選びましょう、Gitコマンドをどのターミナルでも使用できるようにしてくれます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/23ade482-e12c-efbf-221c-b71c0e490413.png)
SSH、SSLの設定です
デフォルトのままNext→
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/ff26c342-aacd-22e6-a352-98a64c5639c5.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/248c443a-f8b1-dd25-47a4-03f3d7a171eb.png)
Gitの行終端処理の設定です
一番下を選んでNext→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/f3aa8836-a6a3-d3f6-8f61-6b8d9752255f.png)
3つとも一番上を選んでNext→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/903e322e-8ce4-d610-badf-02c12c05668c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/33332f34-b298-eab0-a240-a49c6c5ac31c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/d08a7c37-a762-54a2-7dbf-d72eb0ad705b.png)
追加オプションの設定です
上はfsCacheを有効にするか設定するオプション、下はシンボリックリンクを使用するか設定するオプションです
後から変更可能なので今は両方チェックを入れてNext→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/c698e996-3420-9231-40a7-92a3976e2e01.png)
試験的なオプションのインストールができますがこちらは両方とも不要なのでチェックを外してInstall→
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707793/91827b13-47d2-9ec5-7fa5-c53da2e238d5.png)
インストールが開始されます
完了したらFinishでインストーラを閉じましょう

### インストールされているか確認
コマンドプロンプトを開きGitのバージョン確認をしてみましょう
下記のようにコマンドを入力してみて、バージョン情報が返ってこればインストール完了です
```bash
$ git --version
git version 2.40.1.windows.1
```

## 4. Gitの設定
Gitに自分のアカウント情報を登録しましょう
コンフィグコマンドを使って設定ができます
```bash
$ git config --global user.name "{自分の名前}"

$ git config --global user.email "{自分のメールアドレス}"
```
チームで開発をするときに誰がコミットしたのかが分かるように表示される名前になります
必ず設定しておきましょう

以上でGitの環境構築が終わりました。

# あとがき
今回はGitの理解と環境構築編でした
いかがでしたでしょうか？
次回はGitで扱える優秀なコマンドたちを、実践を交えながら解説していければと思います
使いうちに投稿すると思うので今しばらくお待ちください
ご不明点や間違っている箇所があればコメントいただけると嬉しいです
それではまた次回の投稿でお会いしましょう～👋