今さら聞けないGitとは(初心者向け) + α

## はじめに
この記事はまだGitを使ったことのない人、使い始めたけどいまいちつかめないひとにすこし噛み砕いて説明しています。
厳密には違ったりする部分もあります。ご了承ください。

## Gitとは
よく、バージョン管理ツールって言われます。
いわゆるコードの歴史年表です。

`〇〇〇〇年〇〇月〇〇日〇〇:〇〇、このファイルのこの文をこういうふうに追加しました。`

みたいな歴史をたくさん刻んでプロジェクトの歴史年表を作っていく感覚です。
このひとつの出来事を**コミット**と呼びます。

コミットは

- 日時
- コメント(出来事を簡潔に表したもの)
- 実際に起きたコードの変化の履歴

が主な構成要素となっています。

歴史年表なのでいつでも昔の状態を見るられるし、一覧も見られます。

なんかよくわからないエラーが出て昔に戻りたい！そんなときにすぐ好きな時代に戻れるのがGit管理の最大の魅力です。
共同で開発する際もお互いが違う場所で作業してもお互いの作業(パラレルワールド(あとで出てくる))をいい感じにまとめてくれるのもGitの利点です。
## GitHubとの違い
GitとGitHubはよく混同されがちな事柄の一つです。

- Gitは歴史年表を刻むサービスそのものです。
- GitHubはその歴史年表をインターネット上に公開して共有できるサービスです。
    - インターネット上にあるので複数人で歴史を刻める。
    - パソコンが壊れてしまったときのバックアップにもなったりします。

GitHubはGitをインターネット上で管理するツールの一つです。
ほかにもBitBucketやGitLabなんかもありますが一番メジャーなのはGitHubでしょう。


## 歴史を刻む

さあGitについて少しわかってきたところで早速プロジェクトの歴史年表を作って、歴史を刻んでいきましょう。

MacにはGitがはじめからインストールされているので何もせずに歴史年表を作るとから初めて問題ないのですがWindwosにはGitがインストールされていません。[こちら](https://prog-8.com/docs/git-env-win)のインストール方法に則ってインストールをしてから次に進みましょう。

### まずターミナルを開きましょう。
`⌘` + `space`のSpotlight検索にターミナルと入れれば起動できます。(もちろん他の方法で起動してもOK)
<br><img width="500" alt="スクリーンショット 2020-01-17 22.10.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109307/65118b3a-c082-a99e-4bc9-50e85a67362f.png"><br>
こんなかんじで立ち上がればOKです。

### 次にプロジェクトのフォルダに移動しましょう。
まず、ターミナルに`cd` と入力し半角スペースを押します。

次にFinderを開き、プロジェクトのフォルダをターミナルにドラッグアンドドロップします。<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109307/901f998c-626d-fe3c-eb16-9ea5c683fb17.jpeg">

そして`return`キーを押します。
するとプロジェクトフォルダに移動できました。ターミナルの`$`や`%` の前にプロジェクトフォルダの名前が来ていれば成功です。

### 現在のgitの状態を確認する
ターミナルで`git status`と入力しreturnキーを押してみてください。
次の２つのどちらかになると思います。

```
masakazozaki@MasakaznoMacBook-Pro SampleProject % git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	SampleProject.xcodeproj/
	SampleProject/
nothing added to commit but untracked files present (use "git add" to track)
masakazozaki@MasakaznoMacBook-Pro SampleProject % 

```
若干一致しないところもあるかもしれませんがこのようになにかしらのごちゃごちゃしたものが出てきた場合、すでに歴史年表はつくられています。Xcodeなどは自動で作ってくれる設定がデフォルトになっているので自分で歴史年表を作る必要はありません。

```

masakazozaki@MasakaznoMacBook-Pro ~ % git status
fatal: not a git repository (or any of the parent directories): .git
masakazozaki@MasakaznoMacBook-Pro ~ % 

```

のように *not a git repository* と出てきた場合はまだ歴史年表が作られていません。
歴史年表を作成する`git init`という歴史年表を作成するコマンドをターミナルで打ち込み、returnキーを押して歴史年表を作成します。

### 歴史を刻む
実際に歴史を刻んでいきましょう。前のコミットからの差分(初めての場合はすべてになる)を歴史として登録します。

`git add .`
まずこれですべてのファイルを年表の変更に追加します。(一旦おまじないと思っていても大丈夫)

次に歴史を刻みます
`git commit -m "hogehoge"`
このhogehogeの部分にコミットメッセージを入力します。
> `〇〇〇〇年〇〇月〇〇日〇〇:〇〇、このファイルのこの文をこ言うふうに追加しました。`

最初に出てきたこのコメントの部分です。
そのときプロジェクトに何をやったかを簡潔にまとめてあげましょう。(日本語で大丈夫)

これで歴史を刻むことができました。

次からは
`cd プロジェクトファイルのパス`
`git add .`
`git commit -m "hogehoge"`
の3つをやってあげると歴史を刻めます。

歴史をどれぐらいの頻度で刻むのか、とても難しいのです。機能を一つ作った、この機能をこう変えた。新しい画面を作った、程度の粒感で最初は大丈夫です。あと作業を終わりにするときも必ずcommitしましょう。(パソコン壊れて消える可能性あり)

## 歴史をインターネット上に公開する
GitHubの使い方はたくさんネットにあるのでぜひググってみてください。(希望があればまとめます)
一通り設定をしたら
`cd プロジェクトファイルのパス`
`git add .`
`git commit -m "hogehoge"`
`git push origin master`
でローカルとリモート、つまりパソコン内とインターネット上の両方に歴史を刻めます。(設定する前にpushしてもうまくいきません)
## 歴史を見る

ターミナルで`git log`とコマンドを叩くことで歴史を見ることができます。キーボードの矢印キーでスクロールできます(マウスやトラックパッドではできない)

昔の歴史の状態に戻ることも可能だが、リスクが高い。(慣れてきてからやってみましょう)

最後に歴史を刻んでから今までの変更をなかったコトにするのは
`git checkout .`
この一行で戻すことができます。(変更はもう戻せない)

また変更を戻すことを前提に一旦逃しておくには
`git stash`
戻すには
`git stash pop`

## パラレルワールドを作る
いわゆるbranchというやつです。
「ブランチを切る」という表現をします。
`git checkout -b hogehoge`　(hogehogeは好きなブランチ名)
で新しくブランチを切るることができます。

もとのメインの年表(master branch)を見るには
`git checkout master`
で戻れます。

二回目以降、またパラレルワールド(feature branch)に移動したいときは
`git checkout hogehoge`　(hogehogeはブランチ名、-bはブランチを作るときだけ)
で戻れます。


ブランチを切ると新しくパラレルワールドが作られてそこでの変更はメインの年表(master branch)には反映されません。パラレルワールド上のみで歴史を刻みます。

**パラレルワールドはいくつでも作ることができます。パラレルワールドをつくったあと(branch切ったあと)にメインの年表(master branch)に新しい歴史を刻んでもパラレルワールドでは変更されません。**


この機能を使って新しい機能を追加するときや、共同開発をするときなどはパラレルワールドを作ってそこで新機能を実装して行きます。本体をいじらないので安全に新機能を追加したりいじったりできます。

もちろん、パラレルワールドをメイン年表に取り込めます。

パラレルワールドは複数作れるし、パラレルワールドがあるときでもメインの年表は更新できる。
　だけど、個人開発(特に初心者)の場合だと、同じ箇所を複数の年表で違う変更したりしたとき、そしてそのパラレルをメイン年表に取り込むときにどっちの歴史が正しいのかコンピューターが判断できなくなってしまいます。そしてコンフリクト(衝突って意味)をおこしてそれを解消するという難しいことをしなくてはなりません。それは避けたい。

なので最初のうちは**新しいことをやるときはブランチ切って(パラレルワールドを作って)もよいが、作ったら他のブランチ(年表)はいじらない**のをおすすめします。

## パラレルワールドで起きた出来事をメイン年表に取り込む

そのパラレルワールド(feature branch)をメイン(master branch) に取り込むことで新機能などをメイン年表に取り込めます。

取り込むにはまず、メイン年表(master)に移動する必要があるので
`git checkout master`
これでメイン年表に移動できました。(移動する前にキチンとfeature branch(パラレルワールド)でaddとcommit(歴史刻む)しておく。)

そしていよいよ取り込みます
`git merge hogehoge`　(hogehogeはパラレルワールドのブランチ名) 
これで取り込むことができます。

## パラレルワールドをなかったコトにする
新機能をbranch切って作っていてやっぱりやめた。うまく行かないからやめた。となったとき。
かんたんにbranchをなかったコトにできます
`git checkout master`
master branch(メイン年表)に移動するこのコマンドを叩くことでなかったコトにできます。あとは新しくパラレルワールド作ってそっちで作業すればOK。

ブランチ(パラレルワールド)を削除することもできるのですが、間違ってメインを削除すると大変なことになるのであまりおすすめしません。技術がついてきたらそのときにまとめて削除するといいでしょう。
一応、master branchに移動(`git checkout master`)した状態で
`git branch -d hogehoge`　でブランチを消すことができますがおすすめしません。やめたほうがいい。

## 歴史は刻み続けなくてはならない
歴史って刻まれ続けますよね。gitも同じで常に更新し続けアップデートしていくことがとても大切です。
古いままだと新しい実行環境などでうまく動かない場合もあります。新バージョン対応だけでもアップデートはとても大切です。

基本的に2年以上更新のないプロジェクトは死んでるとおもってもいいかもしれません。それぐらいITの世界の時間の流れは早いです。

Git触りかけのみなさんもたのしくITに触れ、モノづくりを楽しんでいきましょう！

## その他便利コマンド集

[Git でよく使われるコマンドにイラストによる説明を加えて1枚のチートシートにまとめてみた - Qiita](https://qiita.com/kozzy/items/b42ba59a8bac190a16ab)
[Gitでやらかした時に使える19個の奥義 - Qiita](https://qiita.com/muran001/items/dea2bbbaea1260098051)