gitでもっと早く使っておけばよかったコマンド・オプション

今やソースコードのバージョン管理に欠かせないGit。現在では殆どの方が使いこなしている人も多いかと思います。  
今回はそんなGitのコマンドで、もっと早くに知っていればよかったなというコマンドを紹介します。

## バージョン

- 2.x系の最新バージョン

## log編

### グラフ表示する

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

### 1行で表示する

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

### マージコミットは表示しない

```console
$ git log --no-merges
```

### 変更したファイルを表示

```console
$ git log --name-status
```

#### 上記を組み合わせる

```console
$ git log --one-line --graph --no-merges --name-status
```
<img width="635" alt="スクリーンショット 2016-01-28 0.02.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/20424/4a63e09d-3c8e-d364-cea0-b1977135830f.png">

### ブランチやタグを表示する

```console
$ git log --decorate
```

### ファイル内の行ごとの最終更新を見る

```console
$ git blame file
```


### ログと一緒にdiffも見る

```console
$ git whatchanged -p
```

#### 参考

http://qiita.com/take4s5i/items/15d8648405f4e7ea3039
http://qiita.com/masarufuruya/items/7480854d4bc2f0443fc1

## diff編

### ステージングに追加分の差分を表示

```console
$ git diff --cached
```

### 差分ファイル名のみ表示

```console
$ git diff --name-only <diff_branch>
```

### diffのアルゴリズムを指定する

```console
$ git diff --histgram(--patience)
```

#### 参考

http://qiita.com/takaakikasai/items/3d4f8a4867364a46dfa3

## 変更を一時退避する

### 一時領域に保存

```console
$ git stash save "message"
```
### 一時領域に保存したリストを表示

```console
$ git stash list
```

### 一時領域に保存したファイルを適用

```console
$ git stash apply
```

### 適用と削除を同時に行う

```console
$ git stash pop
```
#### 使用ケース
- ある機能を作成中に別のタスクが入ってしまった場合


#### 参考

http://qiita.com/fukajun/items/41288806e4733cb9c342

## status編

### シンプルに表示する

```console
$ git status -s
```

### ブランチを表示する

```console
$ git status -b
```

#### 組み合わせ

```console
$ git status -sb
```

<img width="335" alt="スクリーンショット 2016-01-28 0.22.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/20424/52f8af1f-93db-c3e9-bb3f-99f5623b4ef8.png">

## commit編

### コミットメッセージを修正する

```console
$ git commit --amend
```

### コミットをまとめる

```console
$ git rebase -i
```

### リベース前に変更内容をスタッシュ

```console
$ git rebase  --autostash
```

### 特定のコミットのみを適用する

```console
$ git cherry-pick
```

### コミットメッセージとは別のメモ的な

```console
$ git notes add -m '要リファクタリング'
```

#### 参考
http://qiita.com/LOUIS_rui/items/8bc0c9058a69a3d6de97
http://rfs.jp/server/git/gite-tech/git-cherry-pick.html

## merge編

### マージコミットの自動生成をしない

```console
$ git merge --squash
```

#### 参考
http://d.hatena.ne.jp/sinsoku/20111025/1319497900

## 問題箇所を特定する

```console
$ git bisect
```

#### 参考
http://qiita.com/usamik26/items/cce867b3b139ea5568a6

## grep編

### 論理演算を使用する

```console
$ git grep -e 'a' --and -e 'b'
$ git grep -e 'a' --or  -e 'b'
```

### 過去のコミットから対象文字列を含むコミットを検索

```console
$ git log -S 'hoge'
```

#### 参考
http://qiita.com/tbaba/items/a67c8d79c6c4d0dc9b73
http://qiita.com/LOUIS_rui/items/86cf7802c4abc6fa4c1e


## branch編

### 追跡ブランチを確認する

```console
$ git branch -vv
```

### 追跡ブランチを追加する

```console
$ git branch --set-upstream-to origin/[branch-name]
```

### ブランチ作成と同時に追跡ブランチを追加する

```console
$ git checkout -t branch_name
```

### 同じルート リポジトリのチェックアウト済みワークツリーを複数保持する

```console
$ git worktree add branch_name
```

#### 参考
http://snowlong.hatenablog.com/entry/2015/03/12/212455
http://japan.blogs.atlassian.com/2015/10/cool-features-git-2-x/


## revert編

### コミットをしない

```console
$ git revert -n
```

## tag編

### sort順の変更

```console
$ git tag --sort <type>
```

#### 参考
http://qiita.com/naoty_k/items/2b9d9560381bbe316818

## 追記

2016/1/28 Github落ちましたねー

<img width="651" alt="スクリーンショット 2016-01-28 9.40.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/20424/451b6c29-9f2b-c5e8-3653-9f9f20bcf906.png">

ユニコーンさんが激おこでしたw