【初心者向け】Git超入門！開発時に絶対使うコマンド3つをできるだけわかりやすくまとめてみた

## 対象
Gitを使ったことがあるけどなんかよくわかんないという人
Gitは色々なオプションがあるけど、最低限知りたいという人

## 前提
・何かしらのファイルがgit管理されている（されていない場合はセットアップについての記事をあとで書きますので、そちらをご確認ください）
・Macを使っている
※今回の記事には**GitHubについての操作**は出てきません。次に書く記事で操作の順を追って説明したいと思います。

## Gitとは？
コンピュータの中にあるファイルなどに発生した変更を記録し、その記録履歴を管理するための「バージョン管理ツール」です。

なので、別にプログラムだけではなく、ただのテキストファイル、wordファイル、excelファイルだって管理できます。

なんか黒い画面でいじるイメージがあるので「全てエンジニアのもの」みたいな雰囲気がありますが、そんなことはありません。（まあエンジニアしか使わないのかもしれないけど。。。）

## リポジトリとは？
Gitを触っていく上で大事な用語がいくつかあります。
そのうちの一つがリポジトリです。

リポジトリとは、簡単にいうと**ファイルやフォルダの状態を記録する場所**です。

リポジトリに保存された状態は、内容の変更履歴として格納されています。

変更履歴を管理したいフォルダをリポジトリの管理下に置くことで、そのフォルダ内のファイルやフォルダの変更履歴を記録することができます。

「リポジトリ」があることで、ファイルやフォルダの変更履歴を追跡できるようになり

・この時点までファイルを戻したい！
・ここで変更した内容ってなんだっけ？
・この変更って誰がしたの？

みたいなことがちゃんと管理できるようになります。
変な変更がされていたらとりあえず前の状態に戻して、お茶を飲んで落ち着く:tea:

ということもできます。リポジトリに感謝。

## ローカルリポジトリとリモートリポジトリ

次に、「ローカルリポジトリ」と「リモートリポジトリ」について説明します。

急に謎な概念が現れた気がしますが、そんなに構えないでください。

ものすごいざっくりいうと

ローカルリポジトリ＝**あなたの目の前のパソコン上にある、Gitを使う時に便利な保存場所**

リモートリポジトリ＝**外の世界にある、Gitを使う時に便利な保存場所**

みたいな感じです。

結局、リポジトリはこの2つしか存在しません。
たった2つです。

この2つのリポジトリを行き来して、ファイルの変更や保存などを行なっていきます。ちゃんと設定ができていれば

Gitは**目の前のパソコンから、目には見えない便利な保存場所を使えるようになる素敵なもの**

というわけです。

なんとなく理解が進んできましたでしょうか？

次にいってみましょう。

## どうやって「便利な場所」に保存をするのか？

自分のパソコンから、とある「変更履歴とかを管理できる便利な場所」を使えるようになる。

ということがここまでで分かったかと思います。

しかし、「どうやってやるんだ！」という問題がまだ残っていますね。

まずは手順をみてみましょう。

ここで初めてterminalを開きます（teminalの使い方は[ここで](https://techacademy.jp/magazine/5155)）

※あくまで保存の方法だけを説明しているので、下記のコマンドを叩いても動かないと思いますが、コマンドを載せます。

```
$ git add .
```

```
$ git commit -m "hogehoge"
```

```
$ git push origin master
```

はい、ものすごく簡潔にいうと、この手順で保存ができます。

「おいおい、いきなり何いってんじゃｺﾗｧｧｧ!!!」

という声が聞こえるので、ちゃんと説明します。

このコマンドの説明の前に、もう少しだけ用語を覚えましょう。

## パソコンの中身

さて、先ほどローカルリポジトリはあなたの目の前のパソコンの中にあると言いました。

このパソコンの中は、少しだけ枝分かれしています。

パソコンの中身は

**ワーキングツリー**
**インデックス（ステージングともいう）**
**ローカルリポジトリ**

この3つに別れています。

ワーキングツリー：今現在変更・修正しているファイルのある場所
インデックス（ステージングともいう）：あとでリポジトリにコミットをする時にファイルを保存しておく場所
ローカルリポジトリ:リモートリポジトリに向けて送るファイルたちの待機場所

という風に考えましょう。

コミット、という言葉が出てきましたが、さっきの謎のコマンド

```
$ git commit -m "hogehoge"
```

これのことです。（コミットについてはまたあとで詳しく説明します）

つまりワーキングツリーとインデックスにおいては

・ワーキングツリーでファイルの編集をする（要は自分のPCでファイルの編集をする）
・それをコミットする準備のためにインデックスに上げる（これはさっきの手順でいうとgit add .）
・コミットする（さっきの手順でいうと git commit -m "hogehoge"）

という作業を行います。

さて、色々と用語も出てきてわからなくなってきたと思いますので、ここまでの話をざっと整理するために、図にしてみました。

まずはそれぞれの場所の役割と位置関係はこうです。

<img width="619" alt="スクリーンショット 2019-03-19 18.06.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/76779/7e215d30-5c87-3bc1-8d18-ba43ac9e4004.png">

そこにgitコマンドを当てはめてみます。

<img width="619" alt="スクリーンショット 2019-03-19 18.16.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/76779/44d6d982-4ae9-2a40-7a41-62ac69efad2d.png">


これで

git add
git commit 
git push

の役割がなんとなくわかったのではないでしょうか。

・git addは作業中のファイルをインデックスにあげるためのコマンド
・git commitはそのファイルをローカルリポジトリにあげるためのコマンド
・git pushはそのファイルをローカルリポジトリからリモートリポジトリにあげるためのコマンド

というイメージです。

ここまでで、下記のことがわかったかと思います。

・リポジトリとは、簡単にいうと**ファイルやフォルダの状態を記録する場所**
・ローカルリポジトリの中身は**ワーキングツリーとインデックスに分かれている**
・ローカルリポジトリは**こちらの世界**、リモートリポジトリは**外の世界**
・そこの世界を行ったり来たりするのに必要な魔法がGit
・git addは作業中のファイルをインデックスにあげるためのコマンド
・git commitはそのファイルをローカルリポジトリにあげるためのコマンド
・git pushはそのファイルをローカルリポジトリからリモートリポジトリにあげるためのコマンド

Gitには他にも色々なコマンドがありますが、この基本原則が崩れることはありません。

では、いよいよ先ほど出てきた超基本コマンドを解説していきます。
また、いくつか開発の中で使いそうな（自分が過去に使ったことがある）オプションを紹介します。

## git add
自分のPCで作業をしている内容をインデックスにあげるためのコマンドです。


#### よくあるgit addの使い方

```
$ git add .
```
これで、変更した全てのファイルをインデックスにあげることができます。

```
$ git add hogehoge.html
（ファイル名を指定）
```
これをやると、変更したファイルの中で、hogehoge.htmlのみをインデックスにあげることができます。


## git commit 
git commitは作業したファイルをローカルリポジトリにあげるためのコマンドです。

#### よくあるgit commitの使い方
```
$ git commit -m "hogehoge"
```
こちらはファイルをローカルリポジトリにあげる時に「hogehoge」というメッセージ付きであげるためのコマンドです。
メッセージをつける理由としては主に「何をどう変更したのか」ということを他の作業者にもわかりやすいようにするためです。

なので"hogehoge"とか書いてコミットするのはよくないです。

```
$ git commit -m "index.htmlのインデントがずれている箇所を修正"
```

```
$ git commit -m "titleタグの中身が違っていたので変更"
```
とか、作業した内容とかファイルがわかるほうが望ましいです。

```
$ git commit
```
としてメッセージなしでコミットすることもできます。

```
$ git commit -a
```
これをやると、先ほどのgit addの工程を飛ばして、ワーキングツリーで変更した（削除も含む）ファイルを一気にローカルリポジトリに反映します。
僕はあんまり使わないですが、git addがめんどくさい時には使ってみてもいいかもしれません。

## git push
ローカルリポジトリの内容をリモートリポジトリに反映するためのコマンドです。


#### よくあるgit pushの使い方

```
$ git push
```
このコマンドでローカルリポジトリに保存されているファイルをリモートリポジトリに反映します。
ただし、この書き方をすると、Gitの設定で定められているリモートリポジトリに反映することになりますので、注意が必要です。

```
$ git push origin master
```
のように、反映する先の場所を指定してあげることが多いです。
この場合は、
origin:リポジトリの場所の別名
master:ブランチの名前（ブランチは作業場のように捉えていてもらえればいいです）

originっていう名前のリポジトリの、masterっていう名前の作業場所にpushするよ！ということですね。

## 記事書いた雑感

ここまでで、開発で絶対に使うコマンド3つを説明しました。
他にもたくさん現場で使うコマンドはあるのですが、それについてはまた今度書きます。