よく使うGitコマンド集

# よく使うGitコマンド集
なんとなく使っていたGitコマンドを学びなおし、よく使うコマンドやこんなコマンドあったんだという学びをメモしていきます。
それ必須でしょとかも含めて書いていきますのでご了承を・・・

## 変更の確認
### ワークツリーの変更差分を確認する
```terminal
$ git diff
$ git diff <ファイル名>
$ git diff --cached # addした後に変更を確認したいとき
```

### ワークツリーの変更されたファイルを確認
```terminal
$ git status
```

## ステージにあげる
### ワークツリーの変更をステージングに追加する
```terminal
$ git add <ファイル名>
$ git add <ディレクトリ名>
$ git add . # ワークツリーの変更すべて
```

## 変更を記録する
### ワークツリーの変更を記録する(コミット)
```terminal
$ git commit
$ git commit -m'メッセージ'
& git commit -v # 変更内容まで確認できる
```

## リモートとのやりとり
### リモートレポジトリを新規追加する
```terminal
$ git remote add <名前> <url>
$ git remote add origin url → originという名前でやり取りできるようになる
```
### リモートレポジトリへ送信する
```terminal
$ git push <リモート名> <ブランチ名>
$ git push origin master → オリジンへローカルのmasterを送信する
```

### リモートから情報を取得する。リモートレポジトリ→ローカルレポジトリ
```terminal
$ git fetch <リモート名>
$ git fetch origin # originのリモートレポジトリをローカルレポジトリに持ってくる
```

### ローカルレポジトリからワークツリーに情報を持ってくる
```terminal
$ git merge <リモート名>/<ブランチ名>
$ git merge origin/master
```

### リモートレポジトリからワークツリーまで一括で情報を取得する
`git fetch`と`git merge`をやっているのと同じ
ブランチに直接マージされるので、自分が`master`ブランチにいるのに`git pull origin zizou`をするとmasterブランチに`zizou`ブランチがマージされるので注意
```terminal
$ git pull <リモート名> <ブランチ名>
$ git pull origin master
$ git pull # 省略ver やっていることは同じ
```

## ブランチの操作
### ブランチを新規作成する。
作成したがブランチは今のまま。HEADは変わらない
```terminal
$ git branch <ブランチ名>
$ git branch zizou # zizouブランチが作られる
```

### ブランチを作成して、作成したブランチに移動する
HEADは新規作成したブランチになる
```terminal
$ git checkout -b <ブランチ名>
$ git checkout -b zizou # 今zizouブランチに移動した
```

### ブランチの一覧を表示する
```terminal
$ git branch
$ git branch -a # リモートリポジトリも含めたブランチを表示する
```

### 既存のブランチに移動する
```terminal
$ git checkout <ブランチ名>
$ git checkout zizou
``` 

### 別のブランチから情報を取り込みたい(merge)
対象ブランチの情報を統合してマージコミットを作成する。
マージコミットの親は複数になる。
```terminal
$ git merge master # masterの変更を自分のブランチに取り込む
$ git merge origin/hoge # リモートブランチの変更を自分のブランチに取り込む
```

### 別のブランチから情報を取り込みたい(rebase)
`git merge`と同じようですが、こちらは厳密にいうと、ブランチの基点となるコミットを別のコミットに移動する。
`rebase`するブランチ名の最新コミットが親コミットになる。
`merge`と違うのは、情報を取り込みながらコミットの履歴を綺麗にすることができる。
`merge`は履歴は複雑になるけど、作業履歴がしっかり残るので何をしていたかわかりやすい
* すでにgithubにプッシュしたコミットをリベースするとpushできなくなるので注意
* 複数のコミットがある場合、コンフリクトの対応がめんどくさい。mergeは楽
```terminal
$ git rebase <ブランチ名>
$ git rebase master # zizouブランチにいる①
$ git merge zizou # masterブランチにいる② ファストフォワードされる。(①のリベースの親はmaserのコミットなので)
①~②をすることでコミットの履歴がきれいになる
```

### ブランチ名を変更する
変更したいブランチに移動する必要がある
```terminal
$ git branch -m <ブランチ名>
$ git branch -m zizou2
```

### ブランチを削除する
ブランチを削除する
削除するブランチにいないこと
```terminal
$ git branch -d <ブランチ名> # masterにmergeしてないブランチは変更が残っているので削除しない
$ git branch -D <ブランチ名> # 強制削除する
```

### リモートにあるブランチを削除する
```terminal
$ git push origin :<ブランチ名>
```

### ほかの人が削除したリモートブランチを消したい。
消されたブランチは削除できないのでこれをする
```terminal
$ git fetch --prune ( git fetch -p )
```


## 変更を取り消したい
### ステージに上げる前の変更を取り消す(add前)
```terminal
$ git checkout <ファイル名>
$ git checkout <ディレクトリ名>
$ git checkout . # 変更すべて取り消し
```

### ステージにあげた変更を取り消す(add後)
```terminal
$ git reset HEAD <ファイル名>
$ git reset HEAD <ディレクトリ名>
$ git reset HEAD . # すべて取り消し
```

### コミットを上書きしたい
前回のコミットに誤りがあった場合に、ファイルを修正して`git add`までする。
そのあとこのコマンドを叩きコミットすると修正できる。
```terminal
$ git commit --amend
```

### コミットを取り消す
```terminal
$ git reset --soft HEAD^ # 直前のコミット --softはワークツリーは残しコミットは消す
$ git reset --hard HEAD^ # 直前のコミット --hardはワークツリーまで消す
$ git reset --soft HEAD~{n} # n個までのコミットを取り消す
```

## 作業中の変更を一時退避
作業中だけど緊急の対応が・・・
中途半端でコミットもしたくない・・・
そんな時は退避！
### 変更を退避したい
今変更してるデータはいったん保管場所に置いておく。
ワークツリーの変更はなかったことに
```terminal
$ git stash
```

### 退避した変更を確認する
すべての退避した変更を確認できる
```terminal
$ git stash list
```

### 退避した変更を復元
戻ってこい俺のデータ
```terminal
$ git stash apply # 最新の退避した変更を復元
$ git stash apply stash@{番号} # 特定の作業を復元 番号は stash listで確認
```

### 退避した変更を削除
```terminal
$ git stash drop # 最新の退避した変更を削除
$ git stash drop stash@{番号} # 特定のstashを削除
$ git stash clear # すべて削除
```

## コミットの履歴を見たい
### コミットの履歴を確認する
```terminal
$ git log
$ git log -n <コミット数> 表示するコミットの数を制限する
```

### それぞれのブランチがどのコミットを指しているのか確認する
```terminal
$ git log --oneline --decorate
a705ead (HEAD -> master, origin/master, yaho, test) Update home.html
4c69652 Create home.html
```

## タグ
タグはリリースポイントのコミットに対してタグ付けをすることが多い
バグが起きた場合に前回のリリースポイントの名前がついてたら戻しやすい
### タグの一覧を表示
タグが付いているすべてのコミットが表示される(アルファベット順)
```terminal
$ git tag
$ git tag -l "絞り込みたいワード"
```

### タグを作成する
タグには2種類ある
- 注釈付き版：正式なタグでしっかりたタグ
    - タグ付けした人の情報・日時・コメントも格納される。 
- 軽量版：情報量を減らした省略のタグ
    - タグに関する情報は格納されない。

```terminal
$ git tag -a <タグ名> -m "メッセージ" # 注釈付き
$ git tag -a "20220423_01" -m "version 20220423_01"
$ git tag <タグ名> # 軽量
$ git tag "20220423_01"
```

### 後からタグをつける
```terminal
$ git tag -a <タグ名> -m 'メッセージ' <コミットID> # 注釈付き
$ git tag <タグ名> <コミットID> # 軽量
```

### タグのデータを表示する
タグにつけられたコミットを表示できる
```terminal
$ git show [タグ名]
$ git show "20220423_01"
```

### タグをリモートレポジトリに送信する
```terminal
$ git push <リモート名> <タグ名>
$ git push origin "20220423_01"
$ git push origin --tags # ローカルにあり、リモートにないタグをすべて送信する
```

## エイリアス編
### エイリアスを追加して次からコマンドを省略する
```terminal
$ git config --global alias.br branch # 今後はgit brでブランチが取得できる
```