Gitよく使うコマンド

## add を取り消す
[git add の取り消し方法と、関連コマンドまとめ | WWWクリエイターズ](http://www-creators.com/archives/1282)

```
$ git reset .
```

## add する前の変更を取り消す

### 特定のファイルの変更を取り消す
```
$ git checkout <ファイル名>
```

### 特定のディレクトリ以下の変更を再起的に取り消す
```
$ git checkout <ディレクトリ名>
```

### 全てを元に戻す
```
$ git checkout .
```

## ブランチを作成

### 新規ブランチを造って、チェックアウト

```
$ git checkout -b <新規ブランチ名>
```
現在のブランチから新規ブランチが作成される

###リモートのブランチにチェックアウト（ローカルに対応するブランチを新規作成）

```
$ git checkout -b <新規ブランチ名> <リモートのブランチ名>
```

## ブランチを削除

### マージされているブランチを削除
```
$ git branch --delete <削除するブランチ名>
$ git branch -d <削除するブランチ名>
```
マージされていなくても変更がなければ削除できる。

### マージされていないブランチを削除
```
$ git branch -D <削除するブランチ名>
```

### リモートのブランチを削除
```
$ git branch -d <削除するローカルブランチ名>
$ git push --delete <削除したローカルに対応するリモートブランチ>
```

## マージする

### `Non Fast-Forward`でマージする

```
$ git merge --no-ff <マージするブランチ>
```

### `Fast-Forward`でマージする

```
$ git merge --ff <マージするブランチ>
```

####  `Non Fast-Forward`と`Fast-Forward`の違い
[【git】分かりやすく！mergeは「合流」、rebaseは「付け替え」! - NullNote](https://nullnote.com/web/git/merge_rebase/#Fast-ForwardNon_Fast-Forward)
> Fast-ForwardとNon Fast-Forwardの違いは？
ずばり、マージしたというコミットが残るか残らないか、です。

`Non Fast-Forward`・・・履歴が残る
`Fast-Forward`・・・履歴が残らない

基本的には`Non Fast-Forward`でマージする。

## スタッシュする(変更を一時的に保存する)

### untrackファイル（gitで追跡していないファイル）も含めて全てスタッシュ
```
$ git stash save -u
```

### 保存しているスタッシュの一覧を確認する

```
$ git stash list
```
## スタッシュの内容を確認

```
git diff stash@{0}
```

### ファイルを指定して確認

```
git diff stash@{0} hoge.txt
```

## スタッシュからファイルの変更を取り出す

### 最後にスタッシュした変更を取り出し、取り出したスタッシュを削除する
```
$ git stash pop
```

### stashから、特定のファイルの内容のみ取り出す
```
git checkout stash@{[番号]} [ファイル名]
```

## ログを確認する

```
$ git log
``` 

```
$ git log --oneline
```

### ログをグラフで確認する

```
$ git log --graph
```

```
$ git log --graph --oneline
```

## リベース（Gitの履歴を書き換える）
[git rebase についてまとめてみた - Qiita](https://qiita.com/KTakata/items/d33185fc0457c08654a5)

### 現在のブランチの履歴を変更
```
git rebase <親にしたいブランチ>
```

### リベースを中止
```
git rebase --abort
```
[誤ってリベースしてしまった Git のコミットを元に戻す方法 - yu8mada](https://yu8mada.com/2018/05/25/how-to-restore-the-original-history-after-rebasing-git-s-commits-accidentally/)

## 変更の確認
[git diffの全オプション一覧 - Qiita](https://qiita.com/rana_kualu/items/09d2dd379019b8ef0335)

### addしたファイルの変更を確認する
```
$ git diff --cached
```

## fetch

### 全てのリモートブランチをfetch
```
$ git fetch --all
```

### リモートで削除されたブランチをローカルからも削除する
```
$ git fetch -p
```

## push
### リモートレポジトリ上の同名のブランチにpush

```
git push
```

### pushするリポジトリを明示的に指定

```
git push origin master
```

### リモートブランチを上書きするpush

rebaseした時など、リモートと履歴が違う場合、リモートブランチの履歴を書き換える

```
git push -f
```

## revert(コミットを取り消す)

### 特定のコミットを取り消すコミットを行う

```
$ git revert <commit>
```

### 一部のファイルの変更のみを取り消したい


```
$ git revert <commit> -n
```
revertを行うがコミットはしない
取り消したいファイルのみを選択することができる

[【gitコマンド】いまさらのrevert - Qiita](https://qiita.com/chihiro/items/2fa827d0eac98109e7ee)

## pull
```
$ git pull
```

## pullの取り消し
[git pull の取り消し方法 | WWWクリエイターズ](http://www-creators.com/archives/5314)

### pullに成功した場合の取り消し
```
$ git reset --hard HEAD@{1}
```

```
$  git reset --hard HEAD^
```

### pullに失敗(コンフリクト)した場合の取り消し
```
$ git merge --abort
```

## ローカルをリモートの状態にリセット

~~まだpushしていないコミットなどは削除されてしまうので注意~~

@culage
> git reset --hard <リモートのブランチ>を行ってもコミットはそのブランチから見えない状態になるだけで削除されません。
コマンド実行直後ならgit reset --hard orig_headで元のコミットを見るように戻せますし、しばらく後でもgit reflogでコミットIDを調査して元に戻すことが出来ます。

```
$ git reset --hard <リモートのブランチ>
```

## commitを1つにまとめたい(rebase)

[rebase -i でコミットをまとめる - Qiita](https://qiita.com/takke/items/3400b55becfd72769214)
 [[Git] rebase コマンドで複数のコミットを 1 つにまとめる | Developers.IO](https://dev.classmethod.jp/articles/git-rebase-fixup/)