再入門のためのGitまとめ


## やっておくと捗る設定

### ユーザー情報を設定
```bash
git config --global user.name "Hanako Yamada"
git config --global user.email "username@example.com"
```

### --no-ff フラグをデフォルトにする
--no-ffフラグは常にNone Fast fowardなマージを強制します。

```bash
git config --global merge.ff false
```

### 引数無しのgit pushを現在のブランチのみに限定する
```bash
git config --global push.default simple
```

### UTF-8問題解決設定
```bash
git config --global core.precomposeunicode true
```

### 色付け
```bash
git config --global color.ui auto
git config --global color.diff auto
git config --global color.status auto
git config --global color.branch auto
```

### git diffの出力をページャ対応にする
```bash
git config --global core.pager "lv -c"
```

## 主要コマンド

### ローカルリポジトリの作成

```bash
git init
```

```bash:git-flowで初期化するなら
git flow init -d
```

### 共有リポジトリの作成

```bash
git init --bare example.git
```

### 変更されたファイルの一覧を表示
```bash
git status -s -b
```

### 変更の確認（add前）
```bash
git diff
```

### 変更したファイルを追加
```bash
git add ファイル名
```

### 新規作成されたファイルを全て追加
```bash
git add -A
```

### 変更/削除されたファイル（新規作成除く）を追加
```bash
git add -u
```

### 変更の確認（コミット前）
```bash
git diff --staged
```

または

```bash
git diff --cached
```

### コミット
```bash
git commit -m "コメント"
```

### 変更の確認（コミット後）
```bash
git show
```

または

```bash
git diff HEAD
```

### 直前のコミットを取り消す
```bash
git reset
```

### コミットにタグを付ける
```bash
git tag ＜タグ名＞
```

### リポートリポジトリの登録

```bash
git remote add origin リポジトリ
```

### リモートへpush

```bash:初回
git push -u origin master
```

```bash:（同じブランチなら）２回目から
git push
```

### 現在の状態を元にブランチを作成し移動

```bash
git checkout -b new-branch
```

### 現在のブランチを表示

```bash
git branch
```

### ブランチ切り替え

```bash
git checkout new-branch
```

### 現在の作業中の状態をコミットせずに一時的に保管する
```bash
git stash ＜保存名もしくはコメントなど＞
```

### stashで保存した作業ツリーに戻る
```bash
git stash pop
```

### すでに版管理対象になっているものを管理から外す

```bash
git rm -r --cached hoge
```

### ブランチの変更をマージ

```bash
git checkout master
git merge topic/hoge
```

### 現在のブランチの状態を、派生元のブランチの最新の状態から派生するよう変更する
※共有ブランチをrebaseするとpushできなくなるので気をつける

```bash
git rebase ＜派生元ブランチ＞
```

### リモートの状態をローカルに反映
```bash
git pull
```

### rebaseしてpull

```bash
git pull --rebase
```

### リモートの状態をローカルに保存（マージはしない）

```bash
git fetch
```


### リモートリポジトリをローカルにコピー

```bash
git clone ssh://[ユーザー名@]＜ホスト名＞[:ポート番号]/＜Gitリポジトリのパス＞
```

### 変更履歴を参照

```bash
git log
```

## Git-flow

### 初期化

```bash
git flow init -d
```

### メインブランチ

#### masterブランチとdevelopブランチ
- origin/master は、製品として出荷可能な状態を常に反映する
- origin/develop は、次のリリースのための最新の開発作業の変更を常に反映する
- develop ブランチのソースコードが安定し、リリースの準備ができたとき、 develop ブランチの全ての変更は master ブランチへマージされ、リリース番号をタグ付けされる
- master へ変更がマージされる時はいつも、その定義からして新しい製品がリリースされる時

### サポートブランチ

#### フィーチャーブランチ（トピックブランチ）

- 将来のリリースに入るような新しい機能を開発するのに使われる。
- develop ブランチから分岐する。

```bash
git flow feature start myfeat
```

- 確実に今度のリリースに追加する、開発済みの機能は、develop ブランチにマージされる
- フィーチャーブランチは典型的には開発者のリポジトリにだけ存在し、 origin には存在しない。

```bash
git flow feature finish myfeat
```

#### リリースブランチ
- リリースブランチは develop ブランチから作成される。
- リリース直前のマイナーなバグフィクスや、リリースのためのメタデータ（バージョン番号、ビルド日時、他）の準備を行う

```bash
git flow release start v1.0
```

- リリースが終わった後、develop と masterにマージし、リリースブランチは削除される。

```bash
git flow release finish v1.0
```

#### ホットフィックスブランチ

- ホットフィックスブランチは master ブランチから作成される。
- 製品バージョンにあるクリティカルなバグがすぐに解決されなければならないとき、作成される。

```bash
git flow hotfix start v1.0.1
```

- バグを修正し、develop と master にマージした後、削除される。
- ※リリースブランチが存在していたら、develop の代わりにリリースブランチにマージする

```bash
git flow hotfix finish v1.0.1
```

## Github Flow
Git Flow を簡略化し、Pull Requestによるコードレビューを取り入れたもの。

- developブランチは作成しない。
- 全てのブランチはmasterブランチから作成し、masterブランチへマージされる。
- 作業用のブランチは定期的にリモートへプッシュする。
- GitHubのプルリクエストの機能を利用して、ソースコードのレビューを行った後、masterブランチにマージする。
- マージされたmasterブランチのコードは、すぐにデプロイする。

## pull requestする際のベストプラクティス

[GitHubへpull requestする際のベストプラクティス - hnwの日記](http://d.hatena.ne.jp/hnw/20110528)

## フックの設定

### pushしたら自動デプロイ
```bash:リモートリポジトリ/.git/hook/post-updete
cd /var/www/app_production && /usr/bin/git --git-dir=.git fetch && /usr/bin/git --git-dir=.git merge origin
```

## GUI

### SourceTree
[Free Mercurial and Git Client for Windows and Mac | Atlassian SourceTree](http://www.sourcetreeapp.com/)

## 学習ツール

[Learn Git Branching](http://k.swd.cc/learnGitBranching-ja/)

## リポジトリホスティングサービス

### GitHub
[GitHub](https://github.com/)

- 公開リポジトリ無料/無制限
- Privateリポジトリは有料（5個/月7ドル 〜 50個/月50ドル）

### Bitbucket
[Bitbucket](https://bitbucket.org/)

- 公開リポジトリ無料/無制限
- Privateリポジトリ無料/無制限
- 5ユーザまで無料
- 日本語対応

## 参考URL

[見えないチカラ: A successful Git branching model を翻訳しました](http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html)
[見えないチカラ: 【翻訳】あなたの知らないGit Tips](http://keijinsonyaban.blogspot.jp/2010/11/git-tips.html)
[Gitブランチを使いこなすgit-flow／GitHub Flow入門（1）：いまさら聞けない、成功するブランチモデルとgit-flowの基礎知識 (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1311/18/news017.html)
[github を用いた開発フロー テンプレート](http://paperboy-all.github.io/docs/github/workflow.html)
[gitのpush.defaultに関するノウハウ - Qiita](http://qiita.com/awakia/items/6aaea1ffecba725be601)
[Linux - Gitをインストールしたら真っ先にやっておくべき初期設定 - Qiita](http://qiita.com/wnoguchi/items/f7358a227dfe2640cce3)
[Gitを使いこなすための20のコマンド | SourceForge.JP Magazine](http://sourceforge.jp/magazine/09/03/16/0831212)
[チーム開発に必要なgit コマンドを神速で習得しよう！ - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/how-to-git-review-book/)
[逆引きGit | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/reference/)
[git - fetch と pullの違い - Qiita](http://qiita.com/y42sora/items/e082d64f3f8b424e9b7d)