【一年生の頃の私へつづる言葉⑧】気づいて。私はGitの本領をこれっぽちも引き出せていないことに。

・今となっては、当然のごとく使用していることを、ただ手紙としてしたためるだけの記事の第八弾。
・昨今重要視されている「効率的」「論理的」「現実的」から逃避して、ひたすら時間跳躍ごっこという幻想世界での生活を貫いている。
・正当化するために無理矢理、「備忘録としても役立つ」とかの長所を捻りだして対応するが、ただ私はこの「おとぎ物語」の主人公になりたいだけ。
・よし。今回は入社後、知っておけばよかったことを書こう。
## Gitコマンドについて
### ＜当時＞
- 「使用コマンド」・・・作成（init）からプッシュ（push）までの基本手順や、基本ブランチ操作（作成や切り替え）くらいしか、使うことがなかった。  
※そのため、それ以外は知らなかった。

※またVSCodeでのGUI操作で主に使用していたため、コマンド操作はあまり行わなかった。
### ＜現在＞
・[こちらの記事](https://qiita.com/kohga/items/dccf135b0af395f69144)を参考にしながら、担当内容部分の機能はもちろんのこと、それ以外の機能の学習として整理。
・覚えるためにGUI操作ではなく、極力コマンド操作で対応。
・下記、現状最低限覚えておく一覧（※これ以外にもまだ、Gitにはたくさんのコマンドやオプションがある。）

## コマンド一覧
### 1. 情報（名前、メールアドレス追加）
```console
$ git config --global user.name "ユーザー名"
$ git config --global user.email "メールアドレス"
```
### 2. 設定情報一覧
```console
$ git config --list
```
### 3. Git管理対象下にいれる（初期化）
```console
$ git init
```
### 4. 変更ファイルをGit管理下に追加（ステージング）
・全て追加。

```console
$ git add .
```
・変更分全て追加。

```console
$ git add -u
```
・ファイル指定追加。

```console
$ git add index.html
```
・拡張子指定追加。

```console
$ git add *.html
```
・対話形式追加。

```console
$ git add -i
```
### 5. コミット
・ステージング分全て。

```console
$ git commit -a
```
・メッセージありでステージング分全て。

```console
$ git commit -a -m "First commit"
```
・指定ファイル名。

```console
$ git commit index.html
```
### 6. コミット関連各種操作
・直前のコミットメッセージ変更

```console
$ git commit --amend
```
・直前のコミット取り消し（ローカルディレクトリの内容変更無し。）

```console
$ git reset --soft HEAD^
```
・直前のコミット取り消し（ローカルディレクトリの内容変更）

```console
$ git reset --hard HEAD^
```
・直前のコミットから2個分を取り消し（ローカルディレクトリの内容変更無し。）

```console
$ git reset --soft HEAD~2
```
・コミットのタグ作成。（注釈無し）

```console
$ git tag "タグ名"
```
・コミットのタグ作成（注釈有り）

```console
$ git tag -a "タグ名" -m "注釈分"
```
・コミットタグ一覧確認

```console
$ git tag
```

### 7. リモート接続（GitHub使用）
・リモートリポジトリ接続

```console
$ git remote add origin https://github.com/abcdef/ghi.git
```
・リモート接続先確認

```console
$ git remote -v
```
・リモート接続変更

```console
$ git remote set-url origin https://github.com/bbbbb/ccccc.git
```
### 8. プッシュ
・カレント（現在作業中）ブランチをリモートの同名ブランチにプッシュ。

```console
$ git push origin ブランチ名
```
・カレント（現在作業中）ブランチをリモートの同名ブランチにプッシュ。（※便利）

```console
$ git push origin HEAD
```
・「u」オプション追加で、ブランチを追跡対象にいれる。

```console
$ git push -u origin master
```
・「f」オプション追加で、強制プッシュ。

```console
$ git push -f origin master
```
### 9. クローン
・リモートからローカルへ持ってくる（クローン）。

```console
$ git clone http://abcdef.com/ghijk.git
```
・ブランチを指定して、クローンしてくる。(タグ指定も同様。)

```console
$ git clone -b ブランチ名 http://abcdef.com/ghijk.git
```
### 9. 変更取得
・リモートから変更点を取得して、反映。（fetchとmergeを同時に行う。）

```console
$ git pull
```
・リモートから変更点を取得するのみ。反映はしない。

```console
$ git fetch
```
・取得した変更点を反映する

```console
$ git merge FETCH_HEAD
```
・取得した変更点を反映する（ブランチ指定）

```console
$ git merge ブランチ名
```
### 10. 変更状態確認
・変更状態の確認

```console
$ git status
```
### 11. 差分確認
・インデックス（ステージング領域）の変更点比較をする。

```console
$ git diff
```
・直前コミットの比較をする。

```console
$ git diff HEAD
```
・直前コミットとインデックスの比較。

```console
$ git diff --cached HEAD
```
・コミット同士の比較をする。

```console
$ git diff 比較元のコミット 比較先のコミット
```
### 12. ブランチ操作
・ブランチ状態確認。

```console
$ git branch
```
・新しいブランチ作成

```console
$ git branch ブランチ名
```
・ブランチ切り替え

```console
$ git checkout ブランチ名
```
・ブランチ作成と切り替えを同時に行う。

```console
$ git checkout -b ブランチ名
```
・ブランチ名の変更

```console
$ git branch -m 旧ブランチ名 新ブランチ名
```
・ブランチの削除

```console
$ git branch -d ブランチ名
```
### 13. リベース（整理）
・分岐元ブランチから分岐先ブランチへ反映。（※実行は分岐先のブランチ２で行う。）

```console
$ git rebase 分岐元ブランチ
```
### 14. スタッシュ（退避）
・現在の作業を一時的に退避。

```console
$ git stash save
```
・退避作業の一覧表示

```console
$ git stash list
```
・退避作業の復元

```console
$ git stash pop
```
・退避作業の削除

```console
$ git stash drop
```
・退避作業の全削除

```console
$ git stash clear
```
### 15. 検索
・単純検索

```console
$ git grep 検索単語
```
・引数指定検索

```console
$ git grep -e 検索単語
```
・複数単語検索（AND検索）

```console
$ git grep -e 検索単語1 --and -e 検索単語2
```
### 16. ブレーム（特定）
・行ごとのコミッター表示。

```console
$ git blame ファイル名
```
・ブランチを指定して、クローンしてくる。(タグ指定も同様。)

```console
$ git clone -b ブランチ名 http://abcdef.com/ghijk.git
```
### 17. 掃除
・不要なオブジェクト（２週間以上経過のもの）を削除して、最適化。

```console
$ git gc
```
・不要なオブジェクト（全て）を削除して、より強力に最適化。（※頻繁には行わない。）

```console
$ git gc [--prune=all] [--aggressive]
```
## まとめ
- 今回は、Gitコマンドということで、バージョン管理の真髄を味わうことなく、基本操作で満足している頃を思い出しながら、記事を書く。
- ここまでの膨大なコマンドがあっても、Gitの能力の半分も引き出せていないという事実を、過去の私が知ったときの、きらめきに満ちた消沈表情を拝みたいと切に願う。
- ということで、より一層の表情筋向上のため、他にも便利なコマンドを覚えて、送りつけることにしよう。

## 参考
- https://qiita.com/kohga/items/dccf135b0af395f69144  
→こちらの記事を参考にいたしました。大変お世話になりました。