#3. 意外と便利なGitコマンドたち

# はじめに
皆さんこんにちはnayaaaaです。
今回はGitのコマンドについていろいろと調べて試してみたので個人的に便利だなと思ったものをまとめてみました。

皆さんがGitで日常的に使用するコマンドはgit (add、commit、pull、push）あたりかなぁと思います。あと初回のセットアップ時にgit (config、init、clone)とか？
しかし、Gitのコマンドは意外にも多く実装されており、中には覚えておくと便利なものも複数あります。
特に、Gitをあまり触ったことがないという方は是非参考にしていただければと思います。

# Gitコマンド

- #### git log 
`git log` コマンドは現在までのコミット情報をを表示してくれます。

``` 
$ git log
commit d34787267422c56976421bb6510948b5ccab188b (HEAD -> main, origin/main, origin/HEAD)
Author: ユーザー名 <メールアドレス>
Date:   Sat Oct 19 21:03:49 2024 +0900

    feat: git_practice02 in the test dir

commit dc5f21f8a7ca0a1935d2430e25d309a088e87575
Author: ユーザー名 <メールアドレス>
Date:   Sat Oct 19 21:02:06 2024 +0900

    feat: git_practice in the test dir
```
commit　=　コミットID この情報を使用することで情報の比較やコミット時の状態に戻すことができます。
Author　=　コミットを行ったユーザ名とメールアドレス
Date　　=　日時
{任意のメッセージ｝=　コミット時のメッセージ上記では「Date」の下に出力されているメッセージ

- `--oneline`を付与することで簡易的に表示することも可能です。

```
$ git log --oneline
d347872 feat: git_practice02 in the test dir
dc5f21f feat: git_practice in the test dir
```
書式：コミットID　メッセージ
先ほどに比べコミットIDが少ないのですがrevertコマンドなどを使用する際、こちらのコミットIDを使用しても問題ないです。

- #### git revert {コミットID}
`git log`にて確認したコミットIDを指定することで、指定したコミットIDの変更を打ち消すことができる。
※似た処理として`git reset`があるが、こちらはlogとして残らないのであまり推奨されない
　→間違えてコミットしてしまった際はこちらの`git revert`を使いましょう。

 👇現状のtest配下
```
$ ls test/
git_practice  git_practice02
```


```
$ cat test/git_practice02
test02
```
`feat: git_practice in the test dir`の状態に戻したいと思います。


```
$ git revert d34787267422c56976421bb6510948b5ccab188b
[main cd4a2f5] Revert "feat: git_practice02 in the test dir"
 1 file changed, 1 deletion(-)
 delete mode 100644 test/git_practice02
```

```
$ ls test
git_practice
```
何とか消えたっぽい。
```
$ git log
commit cd4a2f5e61ab14ce399f81e2bea912cf0910399e (HEAD -> main)
Author: nayataiyo <ecsim39@gmail.com>
Date:   Sat Oct 19 21:09:28 2024 +0900

    Revert "feat: git_practice02 in the test dir"

    This reverts commit d34787267422c56976421bb6510948b5ccab188b.
```
しかも、`git revert`コマンドを使用するとローカルリポジトリにコミットされた状態で反映してくれるんですね。


- #### git restore --source=｛コミットID｝ --staged --worktree ｛ファイルパス｝
`git restore`にオプションを指定して使用すると、特定のファイルのみを指定したコミットIDの状態時に戻すことが可能です。
まず、前述した`git revert`前の状態に戻してから`git_practice`の内容を変更してみます。

せっかくなので、`git log --oneline`で表示されるコミットIDを使用して`git revert`してみます。
```
$ git log --oneline
cd4a2f5 (origin/main, origin/HEAD) Revert "feat: git_practice02 in the test dir"
d347872 feat: git_practice02 in the test dir
dc5f21f feat: git_practice in the test dir
```
簡易的にログを表示
```
$ git revert cd4a2f5
[main 8753a91] Reapply "feat: git_practice02 in the test dir"
 1 file changed, 1 insertion(+)
 create mode 100644 test/git_practice02
```
`git revert`で省略されたコミットIDを指定
```
$ git log --oneline
8753a91 (HEAD -> main) Reapply "feat: git_practice02 in the test dir"
cd4a2f5 (origin/main, origin/HEAD) Revert "feat: git_practice02 in the test dir"
d347872 feat: git_practice02 in the test dir
dc5f21f feat: git_practice in the test dir
```

```
$ ls test
git_practice  git_practice02
```

無事revertできてそうですね。

じゃあ記載内容を変更していきます。


```
$ cat test/git_practice
test
```
```
$ vi test/git_practice
change_test
```
以下のコマンドを使用。
```
$ git restore --source=dc5f21f --staged --worktree test/git_practice
```
revertのようにコミット全体を取り消しているわけではないので`git_practice02`が存在している。
```
$ ls test
git_practice  git_practice02
```
git restoreコマンド実行後ファイルの出力を確認
```
$ cat test/git_practice
test
```

testのみの状態に戻っていますね。

※あくまでもコミットID状態に戻すだけなのでコミットはされていない。

- restoreとrevertの区別
  - restore = コミットIDの状態に戻す
  - revert  =コミットIDの変更を取り消して再度コミット
※コミット時にログに記録されるので`git revert`は`git log`に記録される。


- #### git status
作業ディレクトリとステージングエリアの状態を確認するコマンドで、何がステージングされていて、何がステージングされていないか、さらに新規ファイルが追跡されているかどうかを確認できます。

```
$ git status
On branch main
Your branch is ahead of 'origin/main' by 2 commits.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   test/git_practice
```
上記の例だと、mainブランチで作業されており、リモートリポジトリよりローカルリポジトリのほうが2件コミットが進んでいることを表しています。

そして現在ステージング状態であるパスを表示してくれています。



- #### git diff
オプション無しだと最新のコミットした内容とワーキングツリー（作業ディレクトリ）との変更差分を確認することが可能です。
```
$ vi git_practice
test_diff
```
```
$ git diff
warning: in the working copy of 'test/git_practice', LF will be replaced by CRLF the next time Git touches it
diff --git a/test/git_practice b/test/git_practice
index 9daeafb..c151392 100644
--- a/test/git_practice
+++ b/test/git_practice
@@ -1 +1 @@
-test
+test_diff
```
特定の2つのコミット状態（コミットID）を比較して、変更された内容を確認する

```
$ git log --oneline
f92de8b (HEAD -> main) change:git_practice
8753a91 Reapply "feat: git_practice02 in the test dir"
cd4a2f5 Revert "feat: git_practice02 in the test dir"
d347872 feat: git_practice02 in the test dir
dc5f21f feat: git_practice in the test dir
```
```
$ git diff　dc5f21f　f92de8b

$ git diff 8753a91 f92de8b
diff --git a/test/git_practice b/test/git_practice
index 9daeafb..c151392 100644
--- a/test/git_practice
+++ b/test/git_practice
@@ -1 +1 @@
-test
+test_diff
```
特定のファイルと過去のコミット状態の差分を確認することも可能です。
```
$ git diff 8753a91 -- git_practice
diff --git a/test/git_practice b/test/git_practice
index 9daeafb..c151392 100644
--- a/test/git_practice
+++ b/test/git_practice
@@ -1 +1 @@
-test
+test_diff
```
- #### git show　｛コミットID}
git showコマンドは、Gitで特定のコミットに関する詳細な情報を表示するためのコマンドです
コミットID無しは最新のコミットに関する詳細を表示
```
$ git show
commit f92de8b53af0453a6bb5dc541550bff44f97cedb (HEAD -> main)
Author: ユーザー名 <メールアドレス>
Date:   Sun Oct 20 10:05:09 2024 +0900

    change:git_practice

diff --git a/test/git_practice b/test/git_practice
index 9daeafb..c151392 100644
--- a/test/git_practice
+++ b/test/git_practice
@@ -1 +1 @@
-test
+test_diff
```

# まとめ
Gitのコマンドは日常的に使用するものが限られているため、
こうして改めて確認してみると覚えておくと便利だなと思ったものが多かったです。
他にも、これは覚えておくと便利というコマンドなどがあれば教えていただければと思います！

以上となります～ありがとうございました～