git入門編~コマンドをまとめてみた

使用頻度の高いコマンドの意味と使い方をまとめました

## gitとは

- バージョン管理システム

## 大まかな流れ

1. 作業ディレクトリで作業
2. ステージングエリア(インデックス)にadd
3. ローカルリポジトリにcommit
4. リモートリポジトリにpush

## git初期設定

``` command:command
$ git config --global user.name "xxxx"
$ git config --global user.email "xxxx"
$ git config --global color.ui true
$ git config -l 　　　　　　　　　// 設定が見れる
$ git config --help 　// help画面 
```

## gitを使用
作業するフォルダに「git init」でgitが使えるようになる

``` command:command
$ mkdir myweb
$ cd myweb
$ git init
```

## 作業フロー

・作業ディレクトリで作業する
index.htmlを作って、適当にコードを書く

``` command:command
$ touch index.html
```


・ステージングエリア(インデックス)にadd

``` command:command
$ git add index.html
```

・ローカルリポジトリにcommit
※メッセージを必ず書く

``` command:command
$ git commit -m 'first commit'
```

・リモートリポジトリにpush

``` command:command
$ git push origin master
```


## コミット履歴 log

``` command:command
$ git log
```

以下のcommit履歴が見れる

- commitのid(ユニークキー)
- commitした人
- commitした日
- commitメッセージ

## コミット履歴のオプション

・commit idの上位7ケタとメッセージを表示

``` command:command
$ git log --oneline
```

・変更箇所を表示

``` command:command
$ git log -p
```


・変更ファイルを表示

``` command:command
$ git log --stat
```

## 現在の状態を把握 status

ファイルを追加したのか修正したのか削除したのかなどのファイルの状態がわかる

``` command:command
$ git status
```

その次の手順

- ステージングにaddする
- 保存を取り消す

``` command:command
$ git add index.html             // ステージングにadd
$ git checkout -- index.html     // ファイル保存を取り消す(元に戻る)
```

## 差分を確認 diff

作業ディレクトリのファイルとステージングの差分を確認

``` command:command
$ git diff
```

ステージングとコミットの差分を確認

``` command:command
$ git diff --cached
```

## ステージングに全ファイルをあげる　add
作業ディレクトリからステージングに全てのファイルを上げる

``` command:command
$ git add .
```

## git上で削除、移動
git管理下でコマンド削除、移動を行う

``` command:command
$ git rm index.html
$ git mv index.html
```

## git管理に含めない場合

``` command:ファイル作成
.gitignore
```

「.gitignore」ファイルに「*.log」と書くと全てのlogファイルはgit管理から外れる
管理から外れると「git status」「git add」と打ってもlogファイルは表示されない
※「.gitignore」ファイルはファイルがある同階層、またはその下位階層が対象となる

## コミットとメッセージを同時に行う
commandでメッセージを書きたいとき
※「git commit」のみの場合、メッセージを打つためのファイルが開く

``` command:command
$ git commit -m 'メッセージ'
```

## 前回のメッセージでコミット
直前のcommitを少し修正してメッセージを残すまででもないとき
メッセージは前回のものでコミットだけ実行される

``` command:command
$ git add .
$ git commit --amend
```

## 過去のcommitに戻る reset
・作業ディレクトリをステージングに上げた(add)状態で、直前の状態(commitしたもの)に戻したいとき

``` command:command
$ git reset --hard HEAD
```

・直前の前の状態(2つ前)に戻したいとき

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


・コミットIDを指定して戻す場合
「git log」で表示されるコミットIDを指定するとそのバージョンまで戻る

``` command:command
$ git reset --hard (commit id)
```

・過去のバージョンにリセットしたがそれを取り消したいとき(バージョンがリセット前に戻る)

``` command:command
$ git reset --hard ORIG_HEAD
```

### resetについての参考サイト

- [git-resetは結局何を戻すのか](http://qiita.com/fnobi/items/ec036c1b5d7ee5a8517c)

## 新しい作業場を作る branch
リポジトリから作業用のスペースを作ること
branchは複数作れるので作業ごとにbranchを追加する
後にリポジトリにpush、mergeする

・branchの一覧を見る(最初は「master」しかない)
「*」が付いてるbranchが現状のbranch

``` command:command
$ git branch
```

・新しくbranchを作る

``` command:command
$ git branch hoge
```

・branchを切り替える

``` command:command
$ git checkout hoge     // branchをhogeに変更
```

・branchを削除する

``` command:command
$ git branch -d hoge
```

・branchを作って且つ、branchをそれに切り替える

``` command:command
$ git checkout -b hoge
```

## branchとbranchを取り込む marge

・指定のbranchをmargeする
(このときbranchはマージ元に切り替える)
例：branchはmasterに切り替えた状態で、下記のコマンドで「master」に「hoge」のデータがmargeされる

``` command:command
$ git checkout master
$ git merge hoge  
```

## margeしたら衝突 conflict

コンフリクトはマージしたときに起きる

``` command:command
$ git checkout master
$ git marge　hoge
```

branch「hoge」を「master」にmargeしたきconflict(衝突)発生

・コンフリクト解消法
「<<<<<<<」〜「>>>>>>>」までの箇所が衝突箇所
「HEAD」が大元のbranch(この場合はmaster)
「hoge」は取り組んだbranch(この場合はhoge)

``` html:source
<<<<<<< HEAD
masterのコード
=======
hogeのコード
>>>>>>> hoge
```

どのコードを採用するかを選んでcommitする

## commitのidに名前を付ける tag

commmitのid(ユニーク)は長く管理しづらいので、タグ名で管理できる

・直前のタグに名前をつけるとき　

``` command:command
$ git tag (tag name)
```

・tagの一覧がみれる

``` command:command
$ git tag
```

・直前の変更内容を確認

``` command:command
$ git show
```

・指定したタグの変更内容を確認

``` command:command
$ git show (tag name)
```

・指定したcommitのidにタグ名をつける

``` command:command
$ git tag (tag name) (commit id)
```

・指定したタグを削除

``` command:command
$ git tag -d (tag name)
```

## コマンドを任意の文字に変更 alias

よく使うコマンドを短縮させたいときに登録

``` command:command
$ git config --global alias.co checkout
$ git config --global alias.st status
$ git config --global alias.br branch
$ git config --global alias.ci commit
```

・上記の登録でコマンド実行

``` command:command
$ git co
$ git st
$ git br
$ git ci
```

・登録したエイリアスを確認

``` command:command
$ git config -l
```

## ローカルで共有リポジトリを作る

``` command:command
$ mkdir hoge.git
$ cd hoge.git/
$ git init --bare
```

※「--bare」は共有リポジトリを表すもの
管理するだけでコミットができない

・作業ブランチから共有リポジトリ先を指定する

``` command:command
$ git remote add origin ~/hoge.git
```

・共有リポジトリのURLを変えたいとき

``` command:command
git remote set-url origin ~/xxx/hoge.git
```

・remote originを確認

``` command:command
$ git config -l
```

・共有リポジトリを削除

``` command:command
$ git remote rm origin
```

## 共有リポジトリを操作するpush、clone、pull

・共有リポジトリにpush

``` command:command
$ git push origin master
```

・cloneでデータを取得

``` command:command
$ git clone　~/hoge.git/hogehoge
```

・共有リポジトリのデータを取り込む pull

``` command:command
$ git pull origin master
```

## 変更を一時的に退避 stash

作業途中で急遽別の案件を差し込まれたとき、作業途中のものを避けて新しくブランチを作る
その作業途中のものを管理するときに使う

・commit前のファイルを退避

``` command:command
$ git stash
```

・stashするものにメッセージをつける

``` command:command
$ git stash　save 'xxx機能の途中まで'
```


・退避しているファイルを確認

``` command:command
$ git stash list
```

・最新のstashを取り込む(そのstashは削除される)

``` command:command
$ git stash pop
```

・N番目のstashを取り込む(そのstashは削除される)

``` command:command
$ git stash pop stash@{N}
```

・最新のstashを削除

``` command:command
git stash drop
```

・N番目のstashを削除

``` command:command
$ git stash drop stash@{N}
```

## 参考サイト

- [ドットインストール「git入門」](http://dotinstall.com/lessons/basic_git)
- [色々な git stash](http://qiita.com/akasakas/items/768c0b563b96f8a9be9d)