.gitconfigから学ぶGitコマンド

# 目的
色々な方の.gitconfigを参考にして.gitconfigを作ったのでGitのお勉強としてまとめます。



# .gitconfig
```.gitconfig
[core]
		excludesfile = ~/.gitignore_global
		autocrlf = false
		quotepath = false
		pager = less -r
		editor = vim
[color]
		ui = auto

[push]
		default = current
[merge]
		ff = false
[pull]
		rebase = preserve
[alias]
		l = log --date=short --pretty=format:'%C(yellow)%h %Cgreen%cd %Cblue%cn %Creset%s'
		ll = log --stat --decorate=short --pretty=format:'%C(yellow)%h %Cgreen%cr %Cblue%cn%Cred%d %Creset%s %C(cyan)%b'
		lg = log --graph --date=short --decorate=short --pretty=format:'%C(yellow)%h %Cgreen%cd %Cblue%cn%Cred%d %Creset%s'
		lm = log --merges --pretty=format:'%C(yellow)%h %Cgreen%ci %Cblue%cn%Cred%d %Creset%s %C(cyan)%b'
		b = branch
		ba = branch -a
		co = checkout
		com = checkout master
		cob = checkout -b
		a = add
		aa = !git add -A && git s
		c = commit
		cm = commit -m
		cam = commit -a -m
		wip = commit -m 'WIP'
		amend = commit --amend -C HEAD
		d = diff
		dc = diff --cached
		dn = diff --name-only
		dw = diff --color-words
		um = !git --no-pager diff --name-only --diff-filter=U
		ft = fetch
		ftp = fetch --prune
		pl = pull
		ps = push
		info = remote show origin
		s = status --short --branch
		st = status
		r = reset
		rs = reset --soft
		rsh = reset --soft HEAD
		rh = reset --hard
		rhh = reset --hard HEAD
		rl = reflog show -n 20
		rb = rebase
		rbi = rebase -i
		rbh = rebase HEAD
		rbo = rebase --onto
		sync = !git checkout master && git pull origin master && git fetch -p origin && git branch -d $(git branch --merged | grep -v master | grep -v '*')
		ignore = "!f() { echo $1 >> \"${GIT_PREFIX}.gitignore\"; }; f"
		alias = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1\\\t => \\2/' | sort

```

# 基本設定
### [core]

- **excludesfile = ~/.gitignore_global**
    - ホームディレクトリ内に置いた`.gitignore_global`を全gitプロジェクトに反映させる
- **autocrlf = false**
    - 改行コードの自動変換の設定。WinとMac両方使うのでfalse
- **quotepath = false**
    - 日本語ファイル名を表示
- **pager = less -r**
    - pagerをlessに設定
- **editor = vim**
    - editorをvimに設定

### [color]
- **ui = auto**
    - 色を自動設定

### [push]
- **default = current**
    - カレントブランチと同名のリモートブランチがあればpush

### [merge]
- **ff = false**
    - mergeは常に`--no-ff`

### [pull]
- **rebase = preserve**
    - 全ブランチで `git pull –rebase` を使う

# alias
## logコマンド
- `l = log --date=short --pretty=format:'%C(yellow)%h %Cgreen%cd %Cblue%cn %Creset%s'`
    - コミットの簡易ログを表示
![l.png](https://qiita-image-store.s3.amazonaws.com/0/99505/de1ed6bb-b3d4-18fa-21de-b192bde049d7.png)


<br>

- **`ll = log --stat --decorate=short --pretty=format:'%C(yellow)%h %Cgreen%cr  %Cblue%cn%Cred%d %Creset%s %C(cyan)%b'`**
    - コミットの詳細ログを表示
<img width="758" alt="ll.png" src="https://qiita-image-store.s3.amazonaws.com/0/99505/b987ddcb-73e7-0549-4210-5e8af9269fb5.png">

<br>

- **`lg = log --graph --date=short --decorate=short --pretty=format:'%C(yellow)%h %Cgreen%cd %Cblue%cn%Cred%d %Creset%s'`**
    - コミットのグラフログを表示
<img width="929" alt="lg.png" src="https://qiita-image-store.s3.amazonaws.com/0/99505/21cbbd26-f6e2-0852-367e-96a8a3669a99.png">

<br>

- **`lm = log --merges --pretty=format:'%C(yellow)%h %Cgreen%ci %Cblue%cn%Cred%d %Creset%s %C(cyan)%b'`**
    - マージログを表示
<img width="1106" alt="lm.png" src="https://qiita-image-store.s3.amazonaws.com/0/99505/c8dcf564-6bd8-e7b4-930e-83148a4297dc.png">

## branchコマンド
- **`b = branch`**
- **`ba = branch -a`**
    - ローカルリポジトリとリモートリポジトリを両方表示

## checkoutコマンド
- **`co = checkout`**
- **`com = checkout master`** 
- **`cob = checkout -b`**
    - ブランチを作成してチェックアウト

## addコマンド
- **`a = add`**
- **`aa = !git add -A && git s`**
    - 全てのファイルをaddして簡易statusを表示

## commitコマンド
- **`c = commit`**
- **`cm = commit -m`**
    - コミットメッセージを指定
- **`cam = commit -a -m`**
    - コミットメッセージを指定して変更されたファイルを全てコミット
- **`wip = commit -m 'WIP'`**
    - コミットメッセージをWIPでコミット
- **`amend = commit --amend -C HEAD`**
    - コミットをHEADに追加 (すごく便利)

## diffコマンド
- **`d = diff`**
- **`dc = diff --cached`**
    - キャッシュとの差分を表示
- **`dn = diff --name-only`**
    - ファイル名だけ表示
- **`dw = diff --color-words`**
    - 記号やスペースで区切られた単語単位でのdiffを表示
- **`um = !git --no-pager diff --name-only --diff-filter=U`**
    - まだマージされていないファイルを表示

## fetchコマンド
- **`ft = fetch`**
- **`ftp = fetch --prune`**
    - リモートで削除されているリモートブランチを削除

## pullコマンド
- **`pl = pull`**

## pushコマンド
- **`ps = push`**
		
## statusコマンド
- **`st = status`**
- **`s = status --short --branch`**
    - 簡易ステータスを表示

## resetコマンド
- **`r = reset`**
- **`rs = reset --soft`**
- **`rsh = reset --soft HEAD`**
- **`rh = reset --hard`**
- **`rhh = reset --hard HEAD`**

## reflogコマンド
- **`rl = reflog show -n 20`**
    - reflogを20行表示

## rebaseコマンド
- **`rb = rebase`**
- **`rbh = rebase HEAD`**
- **`rbi = rebase -i`**
    - エディタでrebase
- **`rbo = rebase --onto`**
    - 第1引数に指定したコミットへ、第2引数に指定したコミットから 第3引数に指定したコミットの差分となるコミットを適用する

下の状態で

```
 o---o---o---o---o  master
      \
       o---o---o---o---o  next
                        \
                         o---o---o  topic
```

`git rebase --onto master next topic`すると 

```
 o---o---o---o---o  master
     |            \
     |             o'--o'--o'  topic
      \
       o---o---o---o---o  next
```


## 複合
- **`info = remote show origin`**
    - origin(リモートリポジトリ)の情報を表示

```
$ git info
* remote origin
  Fetch URL: git://github.com/schacon/grit.git
  Push  URL: git://github.com/schacon/grit.git
  HEAD branch: master
  Remote branches:
    gh-pages    tracked
    integration tracked
    master      tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)
```

<br>

- **`sync = !git checkout master && git pull origin master && git fetch -p origin && git branch -d $(git branch --merged | grep -v master | grep -v '*')`**
    - 現在のmasterを最新のものにした上で過去のブランチは削除する
    - remote/masterが更新されたらこれをしておけばおｋ
        - **`!git checkout master`**  
        masterにチェックアウト
        - **`git pull origin master`**  
        origin/masterをpull
        - **`git fetch -p origin`**  
        originで削除されているリモートブランチを削除
        - **`git branch -d $(git branch --merged | grep -v master | grep -v '*')`**  
        マージされたブランチを削除

<br>


- **`ignore = "!f() { echo $1 >> \"${GIT_PREFIX}.gitignore\"; }; f"`**
    - .gitignoreに追加
    - `git ignore [ignoreするファイル名]`

<br>

- **`alias = !git config --list | grep 'alias\\.' | sed 's/alias\\.\\([^=]*\\)=\\(.*\\)/\\1\\\t => \\2/' | sort`**
    - 登録されているaliasを表示

```
$ git alias
a	 => add
aa	 => !git add -A && git s
amend	 => commit --amend -C HEAD
b	 => branch
ba	 => branch -a
c	 => commit
cam	 => commit -a -m
cm	 => commit -m
co	 => checkout
cob	 => checkout -b
com	 => checkout master
d	 => diff
dc	 => diff --cached
dn	 => diff --name-only
dw	 => diff --color-words
ft	 => fetch
ftp	 => fetch --prune
ignore	 => !f() { echo $1 >> "${GIT_PREFIX}.gitignore"; }; f
info	 => remote show origin
...
```



# 参考リンク
- [使い始める - 最初のGitの構成](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-%E6%9C%80%E5%88%9D%E3%81%AEGit%E3%81%AE%E6%A7%8B%E6%88%90)
- [天下一gitconfig大会](https://gist.github.com/teppeis/4117588)
- [Gitのalias機能で超効率的に作業する](https://developers.eure.jp/tech/git-alias/)
- [Wantedlyで開発するときにとりあえず設定してもらう事一覧](http://qiita.com/awakia/items/4c599ebe29a8b2b6ca27)