3年間エンジニアをやってよく使うようになったコマンド

## はじめに
学生時代は「ls」「cd」「cp」くらいのコマンドしか知らなかった私ですが、仕事をするようになってコマンドを本格的に使うようになりました。

エラーが出たときのログ調査をしよう！！・・・・・？でなにすればいいんだ？？　とか
開発中にgitでよくやらかしてめちゃくちゃ焦る（自分が対応した変更が全部なくなるとか）　とか
dockerコンテナをどうしてか壊して、もう一度作り直す　とか
日常的にあったので、そんなときに使ってきたコマンドのうち便利だと思ったコマンドを残したいと思います。


## ログの調査
■調査したいファイルがわからないとき

```
// 1分以内に更新されたファイルを探す
find . -mmin -1

// 「hogehoge」の文字列をgrep
grep -r hogehoge ./

//ファイル名の検索（ファイル名をちゃんと覚えていない場合はワイルドカードを使用。○○test.txtのファイルを探す）
find ./ -name "*test.txt"
```
（だいたい/home/log/配下やvar/log/とかにそれっぽいファイルがある気がする）
（Apacheの設定ファイルを確認したりもする：参照： https://qiita.com/s2maeda/items/21d9458e44f86597d1ae ）

■調査したいファイルはわかっている場合

```
// ファイルに更新があった場合、新しい行がリアルタイムで表示
tail -f ファイルパス

// 最後の10行のみ表示
tail -10 ファイルパス 

// 「error」の文字列が存在する行を表示
cat ファイルパス | grep error

// 文字化けするファイルの中身を文字化けさせないで表示（-gは自動判別の結果を表示）
nkf -g ファイルパス
```

## gitコマンド
### これだけ使えれば基本業務ができる
以下ができれば簡単な修正対応等の開発業務はなんとかなりました。

```
// ログ確認
git log 

// ブランチ移動
git checkout ブランチ名

// 今いるブランチからブランチ作成
git branch ブランチ名

// 今いるブランチからブランチ作成+ブランチ移動
git checkout -b ブランチ名

// コミット対象にする（今いるディレクトリ下すべての場合は.（ドット））
git add ファイル名

// コミット
git commit -m "コミットメッセージ"

// リモートにあげる（強制pushは-fが必要）
git push origin ブランチ名

// リモートからもってくる
git pull origin ブランチ名

// マージする
git merge ブランチ名

// 最新のリモート状態をローカルにもってくる、マージ作業はされない
git fetch --prune
```
### 困ったときによく使う
↑のコマンドを使いこなせれば、初めは困りませんでした。ほぼ仕事にはなる。ただ、あくまでも「ほぼ」。
開発をしていく中で、gitを扱うと、必ず1度はきっとやらかすと思います。
私は数え切れないほどやらかしました。（今ではやらかしても落ち着いて対応できるようになりました多分）
そんなときに扱ったgitコマンドが以下です。

※困るときは、だいたいpush、pull、rebase、mergeをしたとき。
慣れてないうちは、マージ作業をする前にとりあえずbackupブランチを作成することがおすすめ。
やらかしてもどうにかなる。ブランチがめちゃくちゃできて、邪魔なのでこまめに消すこと。
特に、pushをするときは、リモートに上がっているブランチを上書きすることになるので注意

■過去のコミットを確認したい

```
// ちゃんとログがみたいとき(コミットIDすべてみたいときはこっち)
git log

// 軽くログが見たいとき
git log --oneline

// resetした内容のログも見たいとき
git reflog
```

■ コミットはしたくないけど、他ブランチに移動したい

```
// 現在の変更を一時退避する
git stash save "メモ"

// stashしているリストを表示
git stash list

// 一時退避したものを戻す（Nはlistで確認）（listから消える）
git stash pop stash@{N}

// 一時退避したものを戻す（Nはlistで確認）（listから消さない）
git stash apply stash@{N}

// 不要になったものを消す
git stash drop stash@{N}
```

■最新のコミット取り消したい

```
// 一番最後にコミットしたものを消す（変更は残す）
git reset --soft HEAD

// 一番最後にコミットしたものを消す（変更も消す）
git reset --hard HEAD

// 指定したコミットIDまで戻る
git reset コミットID
```

■最新のブランチを古いブランチに取り込みたい

```
// 最新状態にする
git fetch -p
// リモートのmasterを取り込む
git rebase origin/master

// リリース日が前のものを取り込む
git rebase 取り込みたいブランチ

// コンフリクトなどエラーが起こり、rebaseが完了しなかった場合、rebaseをなかったことにする
git rebase --abort

// コンフリクトなどエラーが起こり、rebaseが完了しなかった場合、ソースコードを修正しそのままrebaseしたい場合
// 修正部分はcommitせずaddのみ（commitをすると新しいコミットメッセージになる）
git rebase --continue
```

■commit メッセージをひとつにまとめる

```
// まとめたいコミットを確認（まとめたいコミットの一番古いものの一つ前のコミットIDをコピーする）
git log

// まとめる作業
git rebase -i コピーしたコミットID
```
```
例）
pick コミット1
pick コミット2
pick コミット3
```
と出てくるので、一番上のコミットID以外の「pick」を「s」に変更
（残したいコミットが複数ある場合、pickのままにする）

コミットメッセージを新しく設定する（特になにもしなくてもまとまるがコミットメッセージがとても長くなるので、いらないものは消すのがおすすめ）

mergeのコミット含めてまとめたいとき、rebaseだとうまく行かないときはsquashをつかうといける
（mergeのコミットがまざっているとrebaseだとうまくいかない）
```
masterから切ったブランチ作成
git merge --squash 1つにしたいブランチ名
```
参考：https://www.granfairs.com/blog/cto/git-merge-squash

```
git push origin ブランチ名
```
（コミットをまとめる前にリモートにpushしている場合は「-f」で強制pushする）

## サーバとローカル間でのファイルコピー
```
// ローカル→サーバ
scp コピー元ファイルパス サーバのユーザID@サーバのドメイン:コピー先のファイルパス

// サーバ→ローカル
scp サーバのユーザID@サーバのドメイン:コピー元ファイルパス コピー先のファイルパス

// ローカル→dockerコンテナ（docker ps -aでコンテナIDを事前に確認する）
scp コピー元ファイルパス コンテナID:コピー先のファイルパス
```


## docker コマンド
■コンテナの状態確認

```
docker ps -a
```

■コンテナ起動コマンド

```
// dockerイメージのビルドが必要な場合
docker-compose build

// dockerコンテナ起動 (-dでデーモン起動)
docker-compose up
```

■コンテナ停止コマンド

```
docker-compose stop
```

■コンテナ削除コマンド

```
docker-compose down
```

■コンテナとイメージ削除コマンド

```
docker-compose down --rmi all

// コンテナ・イメージの全て削除
docker ps -aq | xargs docker rm --force
docker images -aq | xargs docker rmi
```

■各コンテナに入るコマンド

```
docker container exec -it コンテナ名 /bin/sh
```