初心者による初心者のためのGit入門① --Mac--

## 目的
- エンジニアに興味を持っている友人に、githubにリモートリポジトリ作ってローカルと紐付けてみて！ ってざっくり投げてみたら難しいと言われ、言われてみれば確かに自分も最初は訳がわからなかったなと思い、整理しようと思い執筆。
- ネット情報だとコード打てば確かに望んだ通りにはなっているけど、理解は全くできないよなぁと思った。初学者にわかりやすいもの目指します。
- 僕自身もめちゃくちゃ詳しいわけではないので、コメントとかで指摘してもらえると助かります！

## 対象
- これからエンジニアになりたい人
- エンジニアとして働いているけどGitよく分からん！って人

## 前提条件
- githubのアカウントは作成済みであること --  [こちらで作成してください](https://github.com)
- 実際にコードもありますがMacでの操作です。

##内容
- Gitって何？
- GitとGithubの違い
- リモートリポジトリとローカルリポジトリ
- Gitをインストール
- Githubでリモートリポジトリの作成
- ローカルリポジトリを作成して、リモートリポジトリと紐づける

##Gitって何？
- Gitとは  

「分散バージョン管理システム」のこと。と言われてもなんのことかさっぱりですよね。笑

　業務では、何かwebサイトを作成したり、webアプリケーションやスマホアプリを作ったりするとき、
　その1つ1つをプロジェクトと呼びます。
　基本的に、1つのプロジェクトには複数人の人が参加しており、
　チームでそのプロジェクトを進めていきます。
　当然、何を作るにしてもファイルにコードを書いていくことになります。
　この時、それぞれが自分のパソコンにファイルを作成して作りはじめたらどうでしょう？
　それをどうやって管理しますか？  

　「上司にこの機能作っといて！」って言われたら、できる度にメールで送りますか？めんどくさいですよね。

　また、とある部分を修正したけど上司に元に戻せと言われたとします。
　「元に戻せと言われてもどこまで戻せばいいの？そもそも消しちゃった部分ちゃんと覚えてないよ！」
　なんて時もあるかもしれません。  

　はたまた、あなたが優秀な人材でチームの別の人の仕事を手伝うことになったとします。
　この時２人で同じファイルを修正してしまったらどうでしょう？
　どちらのファイルが正式なものか分からなくなりませんか？  

　こんな感じでチームで動くからこその問題点が多数発生します。
　では上記のような問題が起こらないようにするにはどんな機能があったら良いでしょうか？
　思いつくところで以下のようなものではないでしょうか？

  ・ どこかでプロジェクト関連のデータを1つにまとめて置いてあり、そこで管理ができる。
  ・ 管理しているデータは常にコピーができ、修正したいときはコピーをいじることで管理元のデータはいじらないで済む。
  ・ 修正した記録が残る。また戻したい時にすぐにそこまで戻すことができる。
  ・ 誰がいつどのように修正したか分かる。

　とりあえず、これくらいの機能があれば仕事がしやすそうな気がしませんか？
　このような機能があるのが「Git」です。(もちろん色々機能はありますよ！笑)

　ここで理解しておくと良いのは
　・Gitを使って管理をするとファイルの作成や修正が記録に残る。
　・誰がいつどのようなことをしたのかが分かる。
　・いつでも以前の修正に戻ることができる。

　この３点くらいを理解しておけば最初は良いかと思います。
　（もちろんこれはほんの一部なので慣れてきたら色々できることを増やしてください。）


## GitとGithubの違い
- Githubとは

　多分ほとんどの人がGitと聞くと、Githubという言葉も一緒に思い浮かべるかと思います。
　ではこの２つの違いとはなんでしょうか？

　Gitとは上記でも述べた通り、バージョン管理システムです。
　一方、Githubは開発者により便利にGitを使ってもらおうと提供されているサービスです。
　Githubはあくまで、Gitを使ってできることを色々提供してくれているサービスです。
　ここは明確に違うところなので覚えておきましょう。
　それではGithubが提供しているサービスとはどのようなものなのでしょうか？
　ここでは1つだけ紹介します。

　先ほど、Gitの説明でこんなことを書きました。
　「どこかでプロジェクト関連のデータを1つにまとめて置いてあり、そこで管理ができる。」
　このどこかというのをクラウド上に提供してくれるのがGithubなのです！
　これにより、世界中どこにいてもネットとパソコンさえあれば
　プロジェクトのコードを確認したり修正したり出来ちゃうわけですね、素晴らしい。

```terminal
                   -----------------------------
                  |                             |
                  |         Github上の           |
                  |        データの置き場所         |
                  |                             |
                   -----------------------------

                      /\                 /\　　　　　　　　　　 複数のユーザーが同一の場所を参照できる。
                      |                   |                  このgithubの中にファイルなどを入れて
                     |                     | 　　　　　　　　　 一括で管理していく。　　　
                    |                       |　　　　　　　　　 
          ---------------------      ----------------------　　　　
         |                     |    |                      |
         |       ユーザー1       |    |        ユーザー2      |
         |                     |    |                      |
          ---------------------      ----------------------
 
```

　ここからは自分の中のイメージなので、できればちゃんと知っている方に教えてもらいたいのですが
　このようなサービスがあるということは、
　つまりGitではクラウド上での管理は出来ないということだと思います。
　本来であれば、誰かのパソコンやサーバーなど物理的なところにまとめて管理する場所を作っておき
　そこからファイルをコピーして修正したりするという形だったので開発環境が限定的であったのかと。
　それがGithubによりインターネット上で管理できるようになったのではないかと思っています。
　ここに関してはしっかり調べてないので怪しいですので、気になる方は調べてみたほうが良いかと思います。

## リモートリポジトリとローカルリポジトリ
　
　それでは具体的にどのようにして管理しているのでしょうか。
　Githubを用いたGitでは主にリモートリポジトリとローカルリポジトリというものが存在します。
　リモートリポジトリというのは、Github上に作成します。
　要するにクラウド上にあるインターネットとパソコンさえあればどこでもアクセスできるやつです。
　リモートリポジトリ＝ネットのどこかにあるやつ、くらいに覚えておきましょう。
　一方、ローカルリポジトリというのはいわゆる自分のパソコンの中のことです。
　どこに作成するかにもよりますが、パソコンのデスクトップ上だったり自分のパソコンの中のことです。

　Githubで管理するときは、リモートリポジトリとローカルリポジトリを紐づけることで
　編集した履歴などを管理することができます。

　リモートリポジトリにあるファイルをローカルディレクトリにコピーする。
　↓
　ローカルディレクトリでそのファイルを編集する
　↓
　その編集した履歴をリモートリポジトリに送る
　↓
　その修正が正しければ、リモートリポジトリに反映する

　というのが基本的な流れになります。
　リモートリポジトリのファイルを直接編集することはできません。
　あくまで、ローカルに１度持ってくるということを頭に置いておきましょう。　


##1.Gitをインストール
それでは実際にGitを使ってみましょう。
まずはgitをインストールします。
ターミナル上で下記を入力してください。
ターミナルがわからない人は、「mac ターミナル」で検索しましょう。

```terminal
# まずはgitが入っているかの確認
git --version  # git version 2.〇〇みたいに表示されていればインストールされている

# ここでインストールされていない場合ポップアップが出て、インストールできるみたいです。
# インストールができたら再度コマンドを打ち確認
git --version  # git version 2.〇〇みたいに表示されていればインストールされている

#インストールが確認できたら、ユーザー名、メールアドレスを自由に登録
git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"

#それぞれ設定できたかを確認
git config user.name
git.config user.email
```

##2.githubでリポジトリ作成（リモートリポジトリ）
新規でリポジトリを作成する。
これが「リモートリポジトリ」になる。
ここは少し調べればやり方はすぐ分かるので割愛。
作成すると下記のようなURLが出るのでコピーしておく。
<https://github.com/[ユーザー名]/[作成したリモートリポジトリ].git>
[一応こんな感じで4番まで進めても○](https://prog-8.com/docs/git-env)

##3.ローカルリポジトリの作成
まずはgitで管理するディレクトリの作成。
これが「ローカルリポジトリ」になる。

```terminal
#ここでは試しに「test」というディレクトリを作成
mkdir test
#作成後そのディレクトリに移動しておく
cd test
```
作成したフォルダをgitで管理できるようにする
要するにローカルリポジトリにする。

```terminal
#下記のコマンドで現在のディレクトリをgitで管理できるようにする
git init
#下記コマンドで、先ほど作成したリモートリポジトリと紐づける事で
#ローカルリポジトリとなる
#このコマンドはプッシュ先のリモートを指定するコマンド
#<URL>には、githubで作成したリポジトリのURLを指定
git remote add origin <URL>
```
##4.リモートにプッシュしてみる
まずはローカルになんでも良いのでファイルを作成し、それをpushしてみる。
ファイルを作成するのは3で作成したディレクトリ内。

```terminal
#sample.txtの作成
touch sample.txt
#以下コマンドを実行すると上で作成したファイル(ex:sample.txt)が赤文字で表示される
#編集したファイルをaddする
git add sample.txt
#ちゃんとaddできたか確認(今度は赤じゃなくて緑色に変わってます)
git status
#確認できたらcommitします
git commit -m "first push"
#今回はとりあえずそのままpush
git push origin main
```
注： 初期ブランチがmasterからmainに変わった模様  
https://github.blog/changelog/2020-10-01-the-default-branch-for-newly-created-repositories-is-now-main/


githubのページを確認し、sample.txtが表示されていれば成功。

##補足
**add**、**commit**、**push**とか出てきたけど一体何をしているのか？

- **add** 
　gitの性質上、ローカルリポジトリで編集しただけで終わりではなくそれをリモートリポジトリに共有しなくては意味がない。
　という事で、まずはどのファイルをローカルに共有するかを決めなくてはならない。
　git add <ファイル名>とする事で、そのファイルを共有しますよーとりあえず宣言します。
　（正確にはインデックスに登録）

- **commit**
　コミットすることで、前回の更新からどんな変更があったか等の情報を記録することが出来る。
　不具合が起きたときにこのログが役に立つ（らしい）。
　-m "<コメント>" でどんな修正を行ったか一言加えておくのが普通。

- **push**  
　最後に登録したファイルを実際にリモートに反映するのがpush。
　git push origin <ブランチ名>
　今回はmasterに直接pushしたが実際masterにpushはあまりしない。(個人開発ならするのか？)
　ブランチについては別の記事で記載予定。

##補足２
２台以上で同じリモートを設定したい場合、２台目の設定がよく分からず少しつまずいたのでメモ。
結果的には至極単純。

```terminal
git clone <リモートリポジトリのURL>
```
これだけ。笑
無知って怖い。。。