Gitの基本コマンドおさらい編 その１

# この記事の目的
Git初心者の皆さん、Gitって難しいですよね！
Gitのコマンド一覧に目を通して一応使い方を分かったつもりでも、いざ実践しようと思うと「あれ、僕って私ってGitのこと全然分かってなくない！？」ってなることはよくあると思います！
そんな人のために、この記事ではGitの基本的なコマンドについて、おさらいも含めて説明していきます。

⇒[本題へスキップ](#gitフォルダに生成される構造)

※この記事ではローカルリポジトリ内&単一ブランチのみの操作を扱います。複数ブランチを扱った操作についてはおさらい編(その2)で解説します（執筆中）
※この記事はGitを使った経験がある人を対象として書いているため、基本的なGit用語は説明なしで使ったり、説明の順番が前後したりすることがあります。

# この記事で扱うコマンド
* [git init](#git-init)
* [git add](#git-add)
* [git commit](#git-commit)
* [git restore](#git-restore)
* [git reset](#git-reset)
* [git status](#git-status)
* [git diff](#git-diff)
* [git log](#git-log)

# 免責事項
当サイトのコンテンツや情報において、可能な限り正確な情報を掲載するよう努めておりますが、 誤情報が入り込んだり、情報が古くなったりすることもあり、必ずしもその内容の正確性および完全性を保証するものではございません。当該情報に基づいて被ったいかなる損害について、一切責任を負うものではございませんのであらかじめご了承ください。

# .gitフォルダに生成される構造
Git管理を開始する時、初めに打つコマンドを覚えていますか？
そう、```git init``` です。
### git init
* ```git init```：バージョンのデータを残すための.gitフォルダを作成する。

一般的にこのコマンドは「対象のフォルダをGit配下に置くコマンド」と説明されがちですが、私はこれをより具体的な事象で捉えなおしました。
```git init```を打つと、対象フォルダ内に.gitフォルダが作成されます。コミットなどの操作を行うとこの.gitフォルダ内にその情報が残り、バージョンごとのファイルとそのツリー構造が保存されます。私は「対象のフォルダをGit配下に置く」とは、「バージョンのデータを残すための.gitフォルダを作成する」ことだと捉えなおしました。それをするためのコマンドが、```git init```なのです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/5fa2b33a-83b0-8ee0-ed4c-e7739f7935c7.png)
そして、この.gitフォルダ内に生成される構造を概念的に表したのが、次の図になります。
※この図はあくまでGit理解を目的とした概念的な図であり、実際に存在する構造を表したものではありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/6d579683-4591-c5ca-80e3-4ef889df0c61.png)


**ワークツリー**とは普段私たちが作業しているフォルダ、つまり普通のフォルダのことを呼びます。
一方、.gitフォルダ内には**リポジトリ**と**ステージ**という2つの空間が生成されます。
**リポジトリ**はコミットしたフォルダ構造を保存する場所で、1つのバージョンごとに1つのフォルダ構造が保存されています。つまり、```git commit```を打つごとに新しいフォルダ構造が新規作成されることになります。
**ステージ**とは、ワークツリーとリポジトリの中間に位置する空間で、ワークツリーのフォルダ構造を一時的に保管する場所となっています。ステージ内には1つのフォルダ構造しか保管できません。よって、```git add```コマンドを打つとそれまでステージにあったフォルダ構造は、ワークツリーのフォルダ構造に上書きされます。

# ワークツリー ⇒ リポジトリ の方向にフォルダ構造を保存するコマンド
ここでは、手元の作業フォルダであるワークツリーをリポジトリに保存するまでの流れを説明します。
### git add
* ```git add FILENAMTE```：ワークツリーの指定したファイル(FILENAME)をステージに保存する。

※FILENAMTEに``` . ```を入力すると、ワークツリーにある全てのファイルが指定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/6d714227-31d1-7441-7fda-e464707c37c7.png)

### git commit
* ```git commit -m "COMMENT"```：ステージにあるフォルダ構造をリポジトリに保存する。COMMENTの部分はコミットメッセージと呼ばれ、そのバージョンの概要や、前のバージョンとの差分を一言でまとめたりする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/60d7f567-309c-c143-0ceb-54681526f954.png)



上記2つのコマンドを組み合わせて使うことで、手元のワークツリーで保存した内容をリポジトリに保存することができます。

1. ```git add .```
1. ```git commit -m "COMMENT"```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/408a1821-535a-a6c4-f175-c5f107b5836c.png)

# リポジトリ ⇒ ワークツリー の方向にフォルダ構造を書きかえるコマンド
ここでは、ステージやリポジトリの内容でワークツリーを書き換えるコマンドを紹介します。
### git restore
* ```git restore FILENAME```：ステージの指定したファイル(FILENAME)をワークツリーに保存する。
* ```git restore --staged```：リポジトリのフォルダ構造をステージに保存する。

※FILENAMTEに``` . ```を入力すると、ワークツリーにある全てのファイルが指定されます。
### git reset

* ```git reset COMMITNAME```：リポジトリにある指定のバージョン(COMMITNAME)のフォルダ構造をステージに保存する。
* ```git reset --hard COMMITNAME```：リポジトリにある指定のバージョン(COMMITNAME)のフォルダ構造をワークツリーに保存する。

※COMMITNAMEを省略すると、リポジトリにある最新のバージョンが指定されます。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/83ca8935-42fe-cc35-a60d-2a946379746d.png)

# .gitリポジトリとワークツリーの状態を確認するコマンド
Gitで開発していると、ワークツリーは手元で確認できますが、ステージとリポジトリの内容は直接参照することができません。そこで、これらの状態や履歴、差分を確認するためのコマンドを紹介します。

### git status
* ```git status```：ワークツリーとステージ、ステージと最新リポジトリの各々の間における、差分の有無と、差分のあるファイルの名前を出力する。

まず、ワークツリー/ステージ/リポジトリが全て同じフォルダ構造の状態で```git status```を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/c1bf3621-3cc5-9ea3-e688-804d665a737f.png)
すると次のように、差分のあるファイルは特に表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/34971f32-e22e-4753-44df-3f91cbdd2e92.png)

次に、ワークツリーのみ編集した状態で```git status```を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/ef44f7b9-d959-c5ab-ff41-c3751f8bd04d.png)
すると、ファイル名が赤色の文字で表示されます。
これがワークツリーとステージとの間に差分のあるファイル、すなわち編集されたファイルを表しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/b6e60d5f-74aa-34a4-c887-44f470742e4a.png)

今度は、```git add .```コマンドを実行し、ワークツリーのフォルダ構造をステージに保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/c1832f5d-755c-7f12-dbcc-d738e1f07865.png)
今度は、ファイル名が緑色の文字で表示されました。
これはステージとリポジトリとの間に差分のあるファイル、すなわちコミット待ち状態のファイルを表しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/cd7394c3-f426-e645-e7ec-d22d5f605714.png)
以上がgit statusコマンドの説明です。

### git diff

* ```git diff```：ワークツリーとステージのファイル内の差分を表す。
* ```git diff --staged```：ステージとリポジトリのファイル内の差分を表す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/c623a6ab-18cf-2934-883b-9a6fe7a541b8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941523/4bc39f60-44be-4af3-f4d2-42193cd28105.png)

### git log
* ```git log```：コミット履歴を表す。
* ```git log --oneline```：コミット履歴を各一行で表す。


いかがでしたか！？
当記事は単なるコマンドの説明にとどまらず、包括的な理解につながるよう意識して執筆しました。
分かりづらい点や間違っている点があったら是非ご指摘いただけると幸いです！
よかったら高評価とチャンネル登録よろしくお願いします！