NITICNoobsによるGit/GitHub講座 第3回 ～実際に使ってみよう～

# 自己紹介
[こるく](https://twitter.com/Colk_)といいます。
[限界開発鯖](https://approvers.dev) とかいう~~ヤバい~~開発者コミュニティに所属している茨城の高専生です。
[前回](https://qiita.com/Colk-tech/private/f0817df7c6fdc9a7f283)に引き続き、私と他3人が今回もGitの使い方を説明していきます。
[前回](https://qiita.com/Colk-tech/private/f0817df7c6fdc9a7f283)の記事が読み終わっている前提で話を進めます。

# はじめに
今回は、実際にGitを使っていきながら、Gitの使い方や概念を覚えます。
ここからが本番です。

この記事は、**茨城高専の2I向け**に執筆された記事です。
**実際に手を動かしなら読み進めてください。**

# リポジトリとは？
Gitでは、1つのプロジェクトを、「**リポジトリ**(**Repository**)」といいます。
基本的に「リポジトリ」内にあるすべてのファイル・フォルダがGitによって管理されることになります。
## つくってみよう
百聞は一見にしかず、さっそくリポジトリをつくってみましょう。
まず、**ファイルエクスプローラー**で、リポジトリを作成したい場所（どこでも構いません）で`Git Bash`を起動します。
![042f36f8a4f8dac0930ae891f0985512.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/57367f41-4cdb-a758-2ff4-a266c4752142.gif)
起動できたら、以下のコマンドを実行してください。

```bash
$ git init <作成したいリポジトリの名前>
```

今回は`my-first-repository`とでもしておきましょう。
そうすると、先程開いたフォルダの中に、リポジトリ名と同じフォルダが出来ていると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/ecd8e646-777f-358e-43d3-9318ea8d6598.png)
***これがリポジトリです。***
しかしこのままでは、リポジトリを操作することが出来ません。
操作できるようにするために、**カレントディレクトリ**をリポジトリのフォルダに移しましょう。
以下のコマンドを実行してください。

```bash
$ cd <作成したリポジトリの名前>
```

これで作成したリポジトリに入って、操作できるようになりました。

▼ カレントディレクトリとは
[カレントディレクトリ (current directory)とは｜
「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word1537.html)

# コミットとは？
Gitの基本的な考え方であり、いちばん重要なものがこの「**コミット**」になります。
ここで一旦、そもそもGitがどんなツールだったかを考えます。
Gitとは、**バージョン管理ツール**です。
ここでいう「バージョン」とは、作業の区切り区切りを意味しています。
Gitでは、バージョンのことを「**コミット**(**Commit**)」と呼び、管理しています。
現在の状態を保存して、コミットとして記録することを**コミットする**といいます。（まんまですね）

▼ コミットのイメージ （青丸がコミット）
![thankyou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/d5aa72bd-fef2-82f0-199f-c925bfa24acd.png)
それぞれのコミットには、**ID**、**編集者**、**日時**、**変更内容**、**編集者のコメント**、**編集内容**などがそれぞれ保存されています。
図のように、プロジェクトが進行していくにつれて「**コミット**」が積み重なっていくイメージです。
作業中のコミットのことを、**HEAD**とよびます。

## やってみよう
それでは実際にコミットしてみましょう。
先程の、「リポジトリに入った状態」で、次のコマンドを実行するとコミットできます。

```bash
$ git add --all
$ git commit -m "<コメントの内容>"
```
実行すると、以下のように表示されるはずです。

```bash
On branch master
nothing to commit, working tree clean
```

どうやら失敗してしまったようです。
「コミットするものが登録されていません」と怒られてしまいました。
それでは、リポジトリ内に何かしらファイルをつくってみましょう。

```hello_git.txt
Hello, Git!
```

今回は試しに、`hello_git.txt`というファイルをつくってみました。
そのうえで、同じコマンドをもう一度実行してみましょう。

```bash
$ git add --all
$ git commit -m "<コメントの内容>"
```

```bash
[master (root-commit) e1883d2] test
 1 file changed, 1 insertion(+)
 create mode 100644 hello_git.txt
```

と表示されました。どうやら成功したようです。

## コメントについて
コメントは、そのコミットで具体的にどんな変更をしたかわかりやすく書きましょう。
日本語でも英語でも構いませんが、共同開発の場合、プロジェクト単位で書き方を統一しましょう。

## コミットの方法まとめ
実際にコミットをする際には、

```bash
$ git add --all
$ git commit -m "<コメント>"
```

というコマンドを使うことが多いです。
このコマンドを実行すると、前回のコミットから変更のあったすべてのファイルをコミットすることが出来ます。
試しに、ファイルを適当に編集して、もう一度コミットしてみましょう。

# 確認しよう
## `git log`
実際にコミットの履歴を確認してみましょう。
以下のコマンドで確認できます。

```bash
$ git log
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/3a7a1e29-2c3a-e305-02e4-3e6c20b44944.png)
いかがでしょうか。このように表示されるはずです。
上から、コミットのID、編集者、日時、コメントが記録されているのがわかると思います。

### Column
コミット数が増えていくと、単なる`git log`では見づらくなることがあります。
そういうときは、`--oneline`オプションを使うことがあります。

```bash
$ git log --oneline
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/08eab2c3-29cc-3704-3265-2c4b9bf39851.png)
情報量は少なくはなりますが、非常にスッキリした表示になります。


## `git diff`
次は、ファイルの差分（変更された部分）を見てみましょう。
以下のコマンドで確認できます。

```bash
$ git diff HEAD^
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542505/3992f8b0-9ed4-2d92-68e3-1e9eb3063ff7.png)
最新のコミットと、1つ前のコミットの間でどこが変更されたかがわかります。

# ワークツリーとインデックス
先程、「基本的にリポジトリ内のすべてのファイルやフォルダが管理対象になる」と書きましたが、**実際には間違いです。**
Gitの管理対象になるすべてのファイルとフォルダが登録されている場所を、「**ワークツリー**」と呼びます。（覚えなくても構いません）
また、今からコミットするファイルが登録されているところを、「**インデックス**」と言います。
そして、インデックスにファイルを登録することを、「**ステージング**」と言います。
![ステージング](https://backlog.com/ja/git-tutorial/assets/img/intro/intro4_1.png)
>ワークツリーとインデックス｜サル先生のGit入門【プロジェクト管理ツールBacklog】 
https://backlog.com/ja/git-tutorial/intro/04/

**ステージングされていないファイルは、コミットされません。**
**そのため、変更をコミットする際には、必ず「ステージング」を行う必要があります。**

先程からコミットのときに実行している`git add`は、実はステージングをするコマンドです。
この`git add`コマンドは、

```bash
$ git add <ステージング（今からコミットしたい）ファイル名>
```
という構成になっています。
前回のコミットから変更のあったすべてのファイルをステージングしたい、という時は、

```bash
$ git add --all
```
実行すると、前回のコミットから変更のあったすべてのファイルをステージングします。

# `git status`
現在のインデックスの状態や、変更されたファイルを確認するためのコマンドがあります。

```bash
$ git status
```

![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F70638%2Fbbed1877-3344-feb1-cfe3-3166c5d45123.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=aae69ca15b3d50feb185298b953e01bc)
> [git status -s でちょっと幸せになれる - Qiita](https://qiita.com/tommy_aka_jps/items/af536a7c20747f99aa42) より

サンプルですが、このように表示されます。

このコマンドは、コミットをする前にインデックスを確認する用途に使えます。
そうすることで、**コミットされてほしくないファイルがコミットされることを未然に防げます。**
（個人情報とか認証情報とか。）
認証情報が含まれたコミットを`push`(後述します)すると大変なことになります。
（~~筆者は何度かやらかしています~~）

▼ 参考
[GCPで約800万円の請求がきた話｜mun｜note](https://note.com/munmun1234/n/n7515fef76041)

**共同開発やリモートリポジトリ（後述）を用いた開発を行う場合、`git status`を確認するクセをつけましょう。**

# ここだけ覚えて！今回のまとめ！
✅ Gitでは、1つのプロジェクトを「**リポジトリ**」という。
✅ リポジトリを操作するときには、そのフォルダに`cd`する。
✅ Gitでは、作業履歴を「**コミット**」として保存する。
✅ 変更したファイルをすべてコミットする時 → `git add .` → `git commit -m "コメント"`
✅ `git status`を確認するクセをつけよう。

# リンク
#### **次回**
[NITICNoobsによるGit/GitHub講座 第4回 〜並行世界を創世する〜](https://qiita.com/Flisan/items/e6398225905e0ed906dc)

**[第1回](https://qiita.com/Colk-tech/items/e75c61146cabc887ad29)** インストール編
**[第2回](https://qiita.com/Colk-tech/items/f0817df7c6fdc9a7f283)** 設定編
**[第3回](https://qiita.com/Colk-tech/items/8d4b28b9001b862eeb99)** 実際に使ってみよう-基本技能編
**[第4回](https://qiita.com/Flisan/items/e6398225905e0ed906dc)** ブランチ(平行世界)編-1
**[第5回](https://qiita.com/Flisan/items/6afd47345fdca42f1c3c)** ブランチ(平行世界)編-2
**[第6回](https://qiita.com/ko_5/items/c0c45c80f12e0072e51e)** GitHub入門編
**[第7回](https://qiita.com/isso0424/items/a7a0816d9a7f0caf1de6)** fetch/pull編
**[第8回](https://qiita.com/isso0424/items/6fc09a68bf0011dfc922)** issue/Pull Request編

# 執筆者
- [いっそう](https://twitter.com/kousou4129)
- [こ](https://twitter.com/ko_CottonLove)
- [こるく](https://twitter.com/Colk_)
- [フライさん](https://twitter.com/loxygenK)