エンジニア半年でよく使うようになったgitコマンド

# はじめに
エンジニアになって半年、最近になってやっと本格的なプロダクトコードを書くことが多くなってきました。
エンジニアになる前は、自分の作ったプロダクトのコードを公開、記録しておくためだけにGitHubを使っていました。
その時は大体以下のコマンドを覚えておけば基本的に問題ありませんでした。

```bash
# 新しくブランチを作った上でブランチを切り替える
git checkout -b {新しいブランチネーム}

# 変更内容を全てステージングエリアにあげる
git add . 

# コミットメッセージ付きでコミットする
git commit -m "コミットメッセージ"

# リモートブランチへpushする
git push origin {ブランチネーム} 

# リモートブランチの内容をローカルブランチに反映
git pull origin {ブランチネーム}
```

しかし、エンジニアとして仕事をしていく上でこの4つだけでは不便な場面も多くその都度調べていたため、今回メモという形で最近使う機会が多くなったコマンドを紹介していきたいと思います。


# 使うようになったコマンド達

```bash
# 状態を確認
git status

# バージョン管理されていて変更があったファイルのみaddする
git add -u

# リポジトリ全体を見て変更があったファイルをaddする
git add -A

# ローカルブランチを改名する
git branch -m {古いブランチ名} {新しいブランチ名}

# コミットなどのログを見る
git log --oneline --graph --decorate

# 最新コミットとの差分を表示
git diff HEAD

# 指定したコミットとの差分を表示
git diff {commit番号}

# ステージングした内容と作業ツリーを比べる
git diff --cached

# リモートブランチと現在のブランチの変更内容を表示
git diff {ブランチ名} origin/{ブランチ名}

# コミット履歴を残さずリモートブランチをpullできる
git pull --rebase origin/{ブランチ名}
```

業務ではここら辺を主に使っています。
各コマンドたちを説明していきたいと思います。

## 状態を確認する
```bash
# 状態を確認
git status
```
基本中の基本コマンドですね,,,
今の自分の状態はどうなっているのか確認するためのコマンドです。

「あれ、このファイルaddしたっけ？」 
「新しくファイル作ったような」

みたいなときに使いますが、自分の場合はほとんど癖みたいな感じでコマンドを実行してしまっています。

##addする
```bash
# カレントディレクトリの変更内容をaddする
git add .
# バージョン管理されていて変更されているファイルをaddする
git add -u
# リポジトリ全体で変更があったファイルをaddする
git add -A
```
ファイルをインデックスに登録するときに使うコマンドですが、便利なオプションがいくつかあります
新規作成したファイルなどは`git add -u`ではaddされません、すでにバージョン管理されているファイルのみaddされる対象になります。

`git add .`と`git add -A`の違いは現在いるディレクトリによってaddされる対象のファイルが変わることです。
`git add .`ではカレントディレクトリ配下のファイルがaddの対象になるため、現在いるディレクトリの階層によってはバージョン管理されているファイルなのにaddされないなんていうことが起こり得ます。そのため、一旦一番上の階層に戻ってから`git add .`なんてことをやる必要があるのです。
しかし、`git add -A`ではリポジトリ全体がaddの対象となるのでどの階層にいてもリポジトリ全体で変更があったファイルをaddすることができます。

## ローカルブランチを改名
```bash
#　ブランチ名を改名
git branch {古いブランチ名} {新しいブランチ名}
```
実際にチームで開発をしていると、ブランチの命名規則などがあったりしてブランチ名を変える必要があったりします。そんなときにこのコマンドを覚えておくと余計な時間を取られなくて済みます。

## logを見る
```bash
# コミットなどのログを見る
git log --oneline --graph --decorate
```
これは、コミットログを見るためのコマンドです。いい感じにオプションをつけて自分なりに見やすくカスタマイズすることができます。
私は簡単にこのコマンドをエイリアス登録してすぐに見れるようにしています。


## 差分表示
```bash
# 最新コミットとの差分を表示
git diff HEAD

# 指定したコミットとの差分を表示
git diff {commit番号}

# ステージングした内容と作業ツリーを比べる
git diff --cached

# リモートブランチと現在のブランチの変更内容を表示
git diff {ブランチ名} origin/{ブランチ名}
```
意外と使うことが多いコマンド達です。
自分がどんな修正を加えたのか、色々な場所から比べることができます。
意外とpushする前に`git diff {ブランチ名} origin/{ブランチ名}`でリモートブランチと差分をみたいなんて思うことが多いので、`git fetch origin {ブランチ名}`で比較したいリモートブランチを取り込んでから確認します。
fetchしただけでは、作業ツリーに履歴が残らないので履歴を汚す心配もありません。

## pullする
```bash
# コミット履歴を残さずリモートブランチをpullできる
git pull --rebase origin/{ブランチ名}
```
集団開発していると、mainのブランチに他の人が変更した内容がどんどん追加されていきます。コンフリクトが発生していないか、他人の修正内容で自分の変更が意図しない挙動をしないかを確認するためにも常に自分の作業環境を最新の状態にしておく必要があります。
そのため、リモートブランチを取り込んで作業ブランチに反映なんてことをやる機会がどうしても多くなります。

しかし、普通に`git fetch`+`git merge origin/{ブランチ名}`とか`git pull origin/{ブランチ名}`とやっているとコミット履歴が残りどんどん履歴が汚くなっていきます。

そんなときに使えるのが`--rebase`コマンドです。これはコミット履歴を残さず最新のリモートリポジトリの内容を作業ブランチに持って来れるためとても重宝するコマンドです。

しかし、履歴を残さないというのは賛否両論あると思うので自分の判断で使用する方が良いですね。

#　最後に
これらのコマンドはエイリアスに登録しておくことでより簡単に呼び出すことができます。
自分なりにコマンドをカスタマイズしてよく使うコマンドは簡単に呼び出すことができる環境を作っておけば開発が効率的に進みます。

ただ、最近VScodeの拡張機能で様々な便利な機能があり、それらを使うとGUIでaddやコミットができたり(これは標準搭載機能ですが)、ソースツリーを確認できたりとめちゃくちゃ便利になってきています。
ただ、それらの便利道具に最初から慣れてしまうと他の作業環境になったときに何もできないなんてことがあり得るので、基本的な上記のようなコマンドは使いこなせるようになってから楽していこうかなと思ってます。

他にもたくさん便利なコマンドがあると思うのでコメントなどで教えていただけると嬉しいです。