【🔰初心者向け】Git入門 [log, diff, reset, reflog]

## はじめに
こんにちは！ITスクールRareTECHにてCS（Customer Support）を担当している池村です。今回の記事は、Gitコマンドのログやファイル差分の確認・修正のためのコマンド紹介です。

![7810338c-dccc-4c8f-97be-f4ff4a68954d_720.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/54be80a1-fa85-46f8-a012-399e98dbeb47.png)


## `log`について
まずは`git log`についてです。
こちらは今までの`commit`履歴を確認することができるコマンドです。

```Bash:logの確認方法
git log
```
使い方はシンプルですね。

いくつか`commit`されたブランチであれば、以下の画像のように履歴が表示されるはずです。

![名称未設定3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/32dbd242-32d8-4b28-b52e-6348e3ac0bb4.jpeg)

※塗りつぶされているのはユーザー名（メールアドレス）です。

commit ハッシュ値 (一意の文字列 + 数値）
Author（作成者）
Date（作成日）
コミットメッセージ

#### 見やすさを重視したオプション
`git log`にはオプションがいくつかあります。
`--oneline`オプションは、短く簡潔にコミット履歴を1行ずつ表示するオプションになります。

```Bash:--onelineオプション
git log --oneline
```

これを使うと以下の画像のような表示結果に変化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/9c373a2a-8cdf-481e-8d77-f85cf2c1e65e.png)

:::note warn
コミットメッセージは真似しないでくださいね。良い書き方ではありません。
だいぶ前のコードの履歴を見ているのでご容赦を🙏
:::

#### ブランチがどう切られて、結合されたかが確認できるオプション
`git log`コマンドに、`--graph --decorate --all`をつけると、ブランチの状態を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/3f73485e-2fec-415c-8a93-23527e2353b2.png)

:::note warn
--graph：ASCIIアートでツリーを表示してくれる
--decorate：ブランチやタグの情報を表示してくれる
--all：すべてのブランチの履歴を表示（デフォルトは現在のブランチのみ）
:::

#### フィルタリングしたい時のオプション
logはたくさん出てくるので、直近のものを見たい時や、日付を指定して確認をすることもできます。

##### 最新のコミットを見る
```Bash:最新の5つのコミットだけを見る
git log -5
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/cbcd87fe-414e-4433-a01b-e51b946fb8a6.png)

##### 指定したユーザーの履歴を表示
```Bash:ユーザー指定
git log --author="ユーザー名"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/e24095bc-bebc-4feb-8bda-c50a2d9322fe.png)

##### 日時を指定
```Bash:日時指定
git log --since="2025-02-20" # 日付は自由に
```

![名称未設定4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/09930886-12fc-49cc-a281-d439e646ba5e.jpeg)

##### ファイルを指定して履歴を見る
```Bash:ファイル指定
git log -- path/to/file.txt # ご自身のプロジェクトのPATHを指定してください
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/3eaa3206-babd-4bab-a428-a71f2a857710.png)

:::note info
ログは様々な表示結果を出せるので、オプションもある程度覚えておくと便利です。
:::


## `diff`について
`git diff`コマンドは、ファイル内の差分を確認するためのコマンドです。
普通に使うと、`add`されていないファイルとの差分を見ることができます。

```Bash:diffを使う
git diff
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/a887b17a-87ba-475c-a81e-8293f7811ca2.png)

私の環境の場合、赤く書かれているのが変更前、黄色で書かれているのが変更されたところです。

:::note info
ただ、これは改行があるかないかの差分ですね。
色付けされているところの下に改行があったかないかの違いを出してくれています。
:::

##### ステージングされたファイルの差分をみる（addされた）
ステージングされたファイルの差分を見る場合は、以下のコマンドを叩きます。
```Bash:ステージングされているファイルを見る場合
git diff --staged
```

##### 最新のコミットとの差分をみる場合
```Bash:書き方
git diff HEAD
```

ここでこの**HEAD**について解説します。
- HEAD：最新のコミットを指している
- HEAD^：最新のコミットの1つ前を指している
- HEAD^^：最新のコミットから2つ前を指している
- HEAD~2：こんな書き方もできるHEAD^^と一緒
- HEAD~6：^を増やしていくこともできますが、こっちの方が良い

:::note info
HEADという文字を使って、ファイルの状態を元に戻したりもするので、**結構重要**です。
:::

##### 特定のコミットの状態との差分を見る場合
```Bash:特定のコミットを指定
git diff abc123 def456 # コミットIDの頭文字を使う（全部使っても良い）
```

`git log`を使うと、コミットIDと呼ばれる一意の識別子が表示されますが、それを使って、両者の差分を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/0e20faca-1b8e-413d-a6e3-cc825e1b070d.png)

:::note warn
今回添付した画像では、HEADと4つ前のコミットの差分を見比べてみています。JSファイルに差分があるようですね。
:::

##### ブランチごとの差分を見る場合
コミットごとではなく、ブランチごとの差分ももちろん見ることができます。
```Bash:ブランチごとの差分
git diff main develop
```
この場合は、mainブランチとdevelopブランチを見比べることができる、ということですね。

## `reset`について
`git reset`について説明します。これはコミットを取り消すコマンドになります。
これは初心者が一番怖いコマンドなんじゃないでしょうか？気持ちはとてもわかります。私は今でも怖いです。
まずは一番弱い`reset`からみていきましょう。
#### `--soft`
```Bash:soft
git reset --soft HEAD^ # 最新のコミットの一つ前を指す
```

この`--soft`のオプションの場合は、コミット状態から`add`の状態に戻る、一番安全な`reset`です。**ファイルを書き換えた部分もなくなったりはしません**。

#### `--mixed`
次に`--mixed`のオプションですが、こちらは`add`された、という結果もなかったことにできます。もちろん**ファイルの変更部分は消えたりしません**。

```Bash:mixed
git reset --mixed HEAD^
```

:::note info
ちなみに`reset`のデフォルトは、このmixedなので、何もオプションをつけないとこれが選ばれます。
:::

#### `--hard`
さて、ここからが怖くなってくるオプションですね。
**`--hard`オプションは取り扱い注意です**。

```Bash:hard
git reset --hard HEAD^
```

このコマンドが怖いところは、ファイルの変更点も完全に消えてしまうことです。
- コミットは消える
- `add`してステージングに乗ったことも消える
- ファイルの変更点も消える

:::note warn
完全になかったことになります。
一応復旧方法はあります。後ほど解説します。
:::

まあ、まだ一個前のコミットに戻るくらいでは、完全に恐怖ではないですね。

では以下のコマンドではいかがでしょう？
```Bash:特定のコミットまで戻る
git reset --hard 特定のコミットID
```

先ほどは一つ前のHEAD^に戻しましたが、このコミットIDを使うと、初期状態まで戻すことも可能になってしまいます。

:::note warn
何度もいいますが、取り扱い注意です！
:::

#### 間違って`--hard`を使った場合
さて、間違ってコードの変更分も消してしまった人への救済処置ですが、以下のような書き方が可能です。

```Bash:HEADの変更を確認する
git reflog
```
上記のコマンドを打つと、以下のような結果が表示されます。
```Bash:実行結果
e5f1c7b HEAD@{0}: reset: moving to 1a2b3c4
bf5f890 HEAD@{1}: commit: Fix login bug
```

ここで見るべきは`HEAD@{1}`です。
これを指定することで、間違って消してしまったコミットを元に戻すことができます。`git reflog`はHEADがどう移動したかを表示してくれています。

```Bash:間違ったresetを元に戻す
git reset --hard HEAD@{1}
```

:::note info
これで安心ですね！しっかり元に戻るはずです！
:::


## おわりに
やはり`reset`コマンドは怖いですね！
でも知っていれば何も怖くないので、初心者はこの記事の内容を全面的に覚えておいてください！
次回の記事は`revert`とその他のコマンドを紹介していきます。

次の記事👇

https://qiita.com/ikemura-ren/items/743fa214d14cd4394187